Spring 기반의 다중 컨텍스트 테스트는 어떻게들 하시는지요?

328 views
Skip to first unread message

lean...@gmail.com

unread,
Nov 4, 2009, 2:46:04 AM11/4/09
to Korea Spring User Group
예를 한번 들자면...

A project (B에 의존적), B Project 2개가 있습니다.
A project를 테스트 하기 위해서는 B project도 Running 가 되어야 합니다.


JUnit를 이용해서 테스트를 하는데
@ContextConfiguration( locations = {A,B,C} )
이런식으로는 단일 Context밖에 테스트가 할수가 없네요.


(location에 A,B의 spring설정파일을 모두 갔다 박으면! 되겠지만..
bean ID등 동일한것이 많아서 불가능합니다)


다중 컨텍스트에서 JUnit를 효율적으로 사용하는 방법이 있을까요~~?
의견좀 부탁드릴께요 ^^

고종봉

unread,
Nov 4, 2009, 5:14:43 AM11/4/09
to ks...@googlegroups.com
잘 알지는 못하지만 도움이 될까 싶어서 주저리 적어 봅니다. ^^;


우선 JUnit으로 테스트 한다고 하신것은 기본적으로 '단위테스트'의 성격으로 보입니다.

물론 통합테스트도 가능하겠지만,, 의도 하신 바는 단위테스트 이겠죠?ㅎ

기본적으로 단위테스트 에서는 테스트 대상에 대해서만 테스트 범위를 한정 시키는게 맞는거 같습니다.

예를 들어 A 라는 Class를 테스트 한다면,, A Class 자체의 기능만 테스트 해야지,, A Class가 의존하고 있는

B Class에 의해 결과가 좌우되면 안되겠죠.. 그래서 의존하는 B Class는 Mock과 객체로 항상 바른 결과만 나오도록

유지해 주는게 좋겠죠.. 그렇게 되면 테스트가 실패하게 될 때 그 원인은 A Class 내로만 한정 시킬 수 있을 테니까요..

정리하자면, ,위에서 말씀 하신것처럼 A Project가 B Project 없이 테스트가 불가능 하다는 것은 단위테스트의 기본 원칙에

맞지 않는 거 같아요.. A Project내의 각각의 Class나 모듈들에 대해서만 테스트가 가능하도록 환경을 꾸며 주시는게 필요할 듯

싶구요..


반드시 B Project와 연계해서 테스트를 해야할 경우라면,, 통합테스트의 개념에 맞추어서,,

B Project를 실제로 가동해 놓고,, A Project는 동작하는 B Project를 바라보게 해야겠죠??

이 경우는 위에서 말씀 하신대로 JUnit에 의해서 테스트 컨텍스트가 모두 올라오는 심플한(?) 테스트 케이스는 아닌게 되겠죠..


의도하시는 테스트의 성격에 따라 테스트 범위를 구분지을 수 있도록 고민해보세요..

원하시는 답변이 되었는지 모르겠습니다. ^^;



2009년 11월 4일 오후 4:46, lean...@gmail.com <lean...@gmail.com>님의 말:

Toby Lee

unread,
Nov 4, 2009, 5:29:45 AM11/4/09
to ks...@googlegroups.com
A테스트를 할 때 B가 왜 running해야 하죠? 어떻게 running하고 어떤 관련이 있나요?

Myoungsoo Shin

unread,
Nov 4, 2009, 6:22:49 AM11/4/09
to ks...@googlegroups.com
테스트 코드가 아닌 돌아가는 코드에서 다중 컨텍스트를 쓰시나요? +_+
beanID가 동일성 문제로 (테스트 코드와 마찬가지로.) 힘들지 않을까요?
제가 스프링을 잘 모르지만. 만일 여러개의 context가 필요하다면,
그리고 어노테이션으로 불가능하다면, JUnit의 setUp에서 ApplicationContext을 하나 만들어서 쓰면 되지 않을까 싶습니다.
ApplicationContext anotherCxt = = new
ClassPathXmlApplicationContext( new String[] {"another.xml"});
하지만 Unit Testing이라면 MockObject같은 걸로 (SpringBean은 POJO이니까요!) 처리해도 괜찮을 듯 합니다만. :-)

정확한 답은 ksug 고수분들께서 답변해주실듯 합니다! (ㅎㅎ 제가 실력없는 초보개발자이라서..흑흑.T_T)

ps)회장님 저 답글 하나 썼어요. 인정해주세요. +_+

2009/11/4 Toby Lee <toby...@gmail.com>:

--
email: anar...@gmail.com
blog: http://anarcher.appspot.com/

박성철

unread,
Nov 4, 2009, 6:46:51 AM11/4/09
to ks...@googlegroups.com
다중 컨텍스트가 어떻게 구성되어 있고 어떻게 의존하고 있는지 궁금합니다.
지금 봐서는 A와 B는 완전히 별도 Project 같네요.
이 두 프로젝트가 어떻게 연관되어 돌아가는지에 따라서 답이 다를 것 같습니다.

lean...@gmail.com 쓴 글:

lean...@gmail.com

unread,
Nov 4, 2009, 8:14:40 PM11/4/09
to Korea Spring User Group
죄송합니다 제가 너무 뜬금없이 질문을 드렸네요.

현재 프로젝트는 maven build를 위한 parent 프로젝트가 있고
Dao단을 위한 Dao 프로젝트가 있습니다 (sql, ibatis, dao단으로 이루어져 있습니다),

parent, dao 프로젝트를 각각 목적에 따라서 의존을 걸어서 사용하고 있습니다.


A : 웹서비스를 위해서 웹용 서비스, mvc 이용
B : 모바일 서비스를 위해 서비스, mvc 이용
그외 : 데모용, openAPI용 프로젝트등등

(A,B등을 컨슈머라 칭하고 DAO단 프로젝트를 프로바이더라 칭하겠습니다)

컨슈머는 실제적으로 Dao단을 프로바이더에게서 제공받습니다.
그렇기 때문에 빌드 타임에 프로젝트 의존성이 걸려있어야 하고요, 테스트 역시 마찬가지입니다.
(예로, 컨슈머의 Service Class는 프로바이더의 UserDao를 @Autowired로 접근하고 있습니다)

기존에는 99프로 annotation 기반이라 컨슈머, 프로바이더의 모든 spring xml 파일을 classpath*:/
spring/bean.xml 이런식으로
하나의 @ContextConfiguration 에서 설정해서 테스트 했는데, 지금은 그런 사정이 안되어서요...

고종봉님 말씀대로
컨슈머에서 사용하는 프로바이더의 모든 객체를 Mock으로 만들어야 하나 생각중입니다 (우어어어-.-)

이재일

unread,
Nov 5, 2009, 3:56:47 AM11/5/09
to ks...@googlegroups.com
A와 B가 Dao프로젝트를 가지고 있나보네요. 각각 A,B는 JUnit테스트를 할때 그냥 classpath로 ContextConfiguration에 넣어서 테스트 코드를 넣었고,
그런데, A가 테스트할때 B가 running이 되야 하는 상황이라는데, 이런건 웹서비스를 호출하고 막 그런건가요? bean id가 충돌이 난다고 했는데, 이러면 뭔가 프로젝트가 같이 묶여 컴파일 되고 그런거 같지는 않는데요. B가 별도의 ApplicationContext를 가진다고 해도 JUnit코드안에서 어노테이션으로 넣어주고 이런건 안될듯 하는데(방법이있을까요???)
 
bean이름이 충돌이 난다는 말을 들으니, JUnit테스트범위에 같이 묶이는건 어색해 보이네요. 역시 용기를 가지고 Mock을 만들어봅시다!!!

2009년 11월 5일 오전 10:14, lean...@gmail.com <lean...@gmail.com>님의 말:

고종봉

unread,
Nov 5, 2009, 9:42:23 AM11/5/09
to ks...@googlegroups.com

고종봉님 말씀대로
컨슈머에서 사용하는 프로바이더의 모든 객체를 Mock으로 만들어야 하나 생각중입니다 (우어어어-.-)


만약에 Mock을 다 만드시는게 무리일 것 같으면,, 우선 다른 방안을 찾아보시는 것을 권장드립니다.ㅎㅎ

테스트 하는게 목적이지, Mock을 만드는 비용이 너무 커서 본래의 취지를 벗어 나게 된다면(Mock 만들기 노가다.. hell)

테스트 자체가 또 하나의 굴래가 될 수도 있을거 같습니다.

어떤 좋은 대안이 있을까요?ㅎㅎ

B Project는 실제로 가동시켜 놓고,, A Project만 jUnit으로 테스트 하는것은 어려운가요??
Reply all
Reply to author
Forward
0 new messages