everydayminder

learn something everyday

Posts Tagged ‘JUnit

JUnit으로 test coverage를 높이는 습관

leave a comment »

“우리나라 정서상 어렵다, 현실에 맞지 않다”는  말들을 하기도 하고, 듣기도 한다.

Rod Johson이 그의 저서 “Expert one-on-one J2EE Design and Development”에서
XP 기법을 소개하면서, 그 기법의 모든 것을 따르지는 않더라도 테스트 지향 개발 방법은 바람직하다고 하였다.

테스트에 대한 XP의 기법은,

  • 코드를 작성하기 전에 먼저 테스트 코드를 작성하자
  • 모든 코드는 단위 테스트 코드를 가져야 하고, 각 단위 테스트는 자동으로 실행될 수 있어야 한다.
  • 버그가 발견되면 버그를 고치기에 앞서, 버그를 다시 재현해 내는 테스트 케이스를 정의한 후에 고쳐야 한다.

테스트 코드를 먼저 작성하는 것이 더 유용하다는 관점에 대해서는,

  • 테스트 문서는 스펙 문서에 근거할 뿐만 아니라, 부가적인 정보를 제공한다.
  • 클래스나 컴포넌트 자체로만으로는 불확실한 내용이 테스트에서는 명확해진다. (사용처나 목적을 분명히 알고 작성할 것이므로)
  • 사실, 코드를 모두 작성한 후에 별도로 테스트 코드를 작성하는 것이 훨씬 어렵다.

그러므로, 한 메소드씩 작성하되, 코드-테스트코드의 순서가 아니라, 반대인 테스트코드-코드의 순서로 작성해 나가자.

Rod Jonhson은 test 메소드의 이름을 다음과 같이 작성하도록 권고한다.

test<Method to be tested><Description of test>

예를 들면,

private void testCommaDelimitedListToStringArrayLegalMatch(String[] components);
public void testCommaDelimitedListToStringArrayMatchWords();
public void testCommaDelimitedListToStringArraySingleString();

단순히 테스트의 coverage를 높이기 보다는, 테스트의 메소드 이름만으로도 테스트의 성격을 알 수 있도록 작성해 보자.
테스트내에서도 반복되는 테스트의 경우 private로 작성하고, 이를 활용하자.

위의 예는,

commaDelimitedListToStringArray(String s);

를  테스트한 예이다.

그리고, 테스트코드도 꾸준히 버전 관리를 해야 한다.

Written by everydayminder

August 1, 2010 at 15:33

Posted in java

Tagged with , , ,

hudson – JUnit 테스트 추가하기

with 2 comments

소스의 품질을 높이기 위해, Junit을 사용하여 테스트를 자동화 하자.

본 포스트에서는 hudson에 junit 테스트를 태스크로 선언하여 빌드시 테스트를 실시하고, 그 결과를 hudson으로 리포트 하도록 설정하고자 한다.

hudson에 등록한 프로젝트로부터 configure를 설정하면, 하단에


와 같이 Junit 테스트 결과를 리포트하겠다는 항목이 있다.

이 기능을 사용하기 위해, 기존에 선언한 build.xml (ant script)에 Junit 테스트 컴파일/ 수행을 하도록 추가할 것이다.
물론, 본인이 작성한 코드를 기반으로 Junit 코드들이 작성되어 있어야 한다.

JUnit 테스트를 수행하고 리포트를 생성하기 위해, 기존에 작성한 build.xml을 다음과 같이 task를 추가한다.

test-compile task는 다음과 같다.

	
	    
	    
		
			<!---->
			
			
				
			
		
	    

test task는 다음과 같다.

	
		
		
			<!---->
			
				
			
			
			<!--  -->
			

			
				
				
			
		

		
			
				
			
			
		
	

참고) 위의 task를 추가하면서 설정한 환경 변수 등은 posting에서 제외하였음

이와 같이 설정하면, hudson에 연동된 프로젝트 task로 기본 소스 컴파일 및 테스트 코드의 실행/ 리포트를 생성하게 된다.

Hudson/Configure에서 JUnit의 report를 입력하는 곳에 “프로젝트명/report/junit/TEST*.xml “의 형태로 입력하고, 저장한다.

다음 빌드 후에, Test Result라는 항목을 왼쪽 메뉴에서 발견할 수 있다.

Test Result를 클릭하면, 테스트 케이스 및 그 결과를 상세하게 볼 수 있을 것이다.
(아직은 초기 예제로 올렸으므로 거의 모두 실패 -_-)


이로써, Hudson에 JUnit 테스트를 연동하고, test report까지 생성하도록 하였다.

이제, 대쉬보드에는 다음과 같은 테스트 결과가 나타날 것이다.

그런데, 이 트렌드는

  • 몇 개의 테스트 케이스를 수행하는가?
  • 그 중 몇 개가 성공이고, 몇 개가 실패인가? (그 변화 추이는?)

를 나타낼 뿐이다.

그런데,  테스트를 자동으로 수행하지만 이 테스트들이 얼마나 의미 있는 테스트인지는 단순히 테스트의 개수만으로는 알 수 없을 것이다. 즉, 테스트 케이스의 개수가 아니라, 테스트 케이스가 실제 소스의 어느 정도를 테스트할 수 있는지 coverage를 확인해야 보다 의미있는 테스트가 될 것이다.

다음에는 Emma를 적용하여, 테스트의 coverage를 측정하도록 하는 설정을 할 것이다.

Written by everydayminder

July 7, 2010 at 09:34

Posted in tools

Tagged with , , ,