everydayminder

learn something everyday

Posts Tagged ‘coverage

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 – emma와 연동하기 (2/2)

leave a comment »

지난 글에 설정한 바대로 ant task를 정상적으로 진행했다면,
ant task로 emma.report 태스크를 수행했을 때, coverage.html과 coverage.xml이 생성되었을 것이다.

참고로, 생성된 coverage.html을 살펴보자.


해당 패키지의 구성중, 클래스/메소드/블럭/라인 기준으로 어느 정도가 test로 커버 되고 있는지를 보여준다.
패키지 이름을 클릭하면,

패키지에 포함된 클래스들이 나타나고, 이 클래스들이 어느 정도 test로 커버되고 있는지 보여준다.
이 중, 아무 클래스나 또 클릭하게 되면,


클래스내의 메소드들이 test로 어떻게 커버되고 있는지 현황을 자세하게 보여주게 된다.

이 결과물은, 별도의 ant task를 수동으로 실행시켜 얻은 결과물이므로,
이제 hudson의 task에 연동하여, 자동으로 build가 되면 emma test를 수행하자.

그러면, hudson이 매 빌드마다 결과물을 자동으로 생성하여 dashboard로부터 볼 수 있도록 설정할 것이다.

“Hudson 관리 > Manage Plugins”를 클릭한다.
Available 탭을 클릭하여 살펴보면,


과 같이, Emma plugin 설치에 대한 체크박스가 있다.
이를 체크하고, 우측 하단 구석에 숨어있는 “Install” 버튼을 클릭하자.

성공적으로 Emma plugin을 설치했다면,
다음 화면을 보게 될 것이다.


설명 문구에 뜬 내용처럼, hudson을 재시작시켜 emma plugin이 정상 동작하도록 하자.
hudson에 다시 접속해보면, 외형상 변화는 아무 것도 나타나지 않는다.
(이제부터 hudson에 emma 설정을 해야 하니까)

프로젝트명을 클릭하고, Configure를 선택한다.
Post-build Actions 부분에 “Record Emma coverage report”가 생성된 것을 확인할 수 있다.
이 체크박스를 클릭하면, 세부 설정 화면이 생긴다.


예전에 ant task로 테스트 했을 경우 coverage.xml이 생성된 경로를 기억하는가?

XML report 경로를 넣는 곳에,
프로젝트이름/report/emma/coverage.xml 등과 같은 형식으로 기록해 준다.
Health reporting은 그냥 디폴트 값으로 사용하기로 한다. 즉, 비워두면 디폴트값이다.

아직 emma report를 생성하는 ant task가 동작하도록 설정하지 않았기 때문에,
build 되더라도 emma report가 자동으로 생성되지는 않을 것이다.

따라서, Post-build Actions 위쪽에 있는 Build > Invoke Ant 옵션을 고치자.

Targets에

all.emma.report

라고 써주고, build.xml에 all.emma.report를 추가해 보자.

<!-- target : all with emma.report -->
	<target name="all.emma.report" depends="clean,emma.report" 
		description="builds the project, excutes tests, and writes emma report"/>

이제, 해당 프로젝트의 왼쪽 메뉴탭을 보면,


와 같이, Coverage Report가 생성됨을 확인할 수 있다.
이 Coverage Report를 클릭해보자.


coverage trend를 표시하는 그래프가 graphics로 나타나는 것을 확인할 수 있다.
이 화면에서도 패키지명을 클릭해 보자.


임의의 클래스도 클릭해보자.

사실, 내용은 앞서 살펴보았던 html과 다를 것이 없다.
다만, 별도의 ant task를 사용자가 실행하지 않아도, 소스를 수정후에 SVN 서버에 commit 하는 것만으로도 충분하다는 것이다.

지금까지 한 작업은 다음의 과정을 자동화한다.

* 소스를 개발/수정 후 commit하면,
* 자동으로 소스를 컴파일하고,
* 테스트 코드도 컴파일해서 테스트를 시행하고,
* 테스트 결과를 보여준다.
* 또한 이 테스트의 적용 범위(coverage)가 어느 정도인지 검사해준다.

이로써, hudson에 ant task를 활용하여 emma를 연동해 보았다.

Written by everydayminder

July 19, 2010 at 01:29

Posted in tools

Tagged with , , , , , ,