adsense728x90


test logic 공통 구현 방법 구상

test logic 공통 구현 방법 구상

요구사항

1. testcaseinput, output (reference) data를 분리한다.

2. input을 얻어오는 부분과 output이 맞는지 referencecheck하는 부분은 공유한다. 공유하는 것끼리 한 class, interface로 묶는다.

3. inputdata는 자유롭게 다른 것을 쓸 수 있도록 만든다교체해가며 테스트할 수 있게 만든다. 추후에는 input set에 대해서 여러번 테스트하는 것이 가능하도록 만든다.

4. input,reference datamapping도 유지한다. outputreference를 비교하는 작업은test case에서 분리한다.

5. test 환경에 대한 것도 분리한다. 소스를 고쳐가며 환경을 바꾸는 것이 아니라, 환경 변수에서 가져오거나, configuration 설정 파일로부터 설정 내용을 import한다.

6. 위 내용을 framework으로 유지한다.

7. 테스트 결과에 대해log를 남겨서 해당 환경, input, revision에 대해 언제 테스트가 어떻게 성공/실패 했는지 기록한다.

 

구현

test case 별로 id를 둔다.

TestMediator 를 둔다. spring Configuration 으로써 Beanreturn해주는 역할을 한다. 제공하는 bean에는 environmenttestData 가 있다.

다른 곳에서 test mediator 설정을 한다. 어떤 environment이고, 어떤 testData를 사용할 지. 이 부분은 xml 등 외부에서 설정을 불러오게 할 수도 있겠다. 미완성.

테스트를 시작하기 전 setUproutine에서 TestMediator로부터 초기 설정을 얻어 온다.

test case를 시작할 때, test case id를 넘겨주고, input data를 가져온다. 테스트가 끝나면, 결과값 검사를 한다. reference data를 가져와서 맞춰보는 것도 정형화된 logic을 이용한다.

 

더 나아가기

test case 별로 비슷한 api를 쓰기는 하는데, parameter 개수, type 등이 완전히 같지는 않다. method 이름도 물론 다르다.

 

얻어낸 input에 대해서 type, 개수가 다르더라도 test case에 따라서 api methoddynamic하게 불러줄 수 있으면 좋겠다.


원하는 게 이런 건데,

http://gioorgi.com/2010/closure-in-java-fast-and-nice/

여기서는 같은 함수로 같은 argument만 쓰는 것이고, 나는 dynamic하게 바꿔가며 쓸 수 있으면 좋겠다.

 

test case의 공통 logic은 분리를 한다. 이 때, 해당 테스트에서 자주 쓰는 logic이 많다면 dispatcher를 만든다. test case id 별로 (그룹화를 해서) 어떤 dispatch logic을 이용할 지는 따로 구현을 한다. test case idargument로 해서 method를 반환 받을 수있으면 좋다. (또는 name으로 dynamic하게 method를 호출하기) 이 때, methodfirst class citizen이어서 object 같은 역할을 하고, argument list도 실행 시점에 다양한 type들의 조합으로 만들어낼 수 있으면 좋겠다.

functional programming, dynamic invocation,closure, lazy evaluation 을 쓰면 가능할지도 모르겠다.

java로는 reflection만을 이용하려다가 너무 code가 너저분하게 많아져서 포기했다.



mokito의 api가 너무 맘에 든다.

이렇게 해결하고 싶었는뎅.


게다가 bdd는 더 보기 쉽게 사용할 수 있다.

http://docs.mockito.googlecode.com/hg/latest/org/mockito/Mockito.html#19

http://dannorth.net/introducing-bdd/ 번역 http://blog.jaigurudevaom.net/319





덧글

댓글 입력 영역