본문 바로가기

프로그래밍

새로운 것이 좋은것만은 아니지만

반응형
단위테스트하면 먼저 떠오르는것이 JUnit 인데요.
평소에는 사용할 일이 없으니깐 공부나 해놓겠다고 실용주의 프로그래머를 위한...시리즈를 사놓은것이
2년은 되어가는듯 합니다. ㅠㅠ
책이 나온것은 2004년이니 지금쯤은 사용하지 않는건 아닌가요..
하지만 아직도 업무환경에서는 JUnit 을 더 많이 사용하는것 같습니다.
CVS 보다 진화되었다는 SVN 이 나왔지만 그래도 CVS 를 고수하는 팀도 많이 있으니깐요.
기본적인 기능을 가지고 있다면 새로운 것이라고 해서
무조건 좋은 것은 아니겠지요.
각각의 툴도 내부적으로 많은 보완이 이루어지고 있으니깐요.

TestNG 도 마찬가지입니다.  JUnit 이 가지고 있는 어떤 한계에 대한 보완으로
강력하고 혁신적이며 확장성 있고 유연할뿐 아니라 JDK 5.0 의 어노테이션 기능을
잘 사용할 수 있는 환경을 만들어준다고 합니다.

테스트엔지로 자바 단위 테스트를 쉽게! - JUnit을 능가하는 테스팅 프레임웍
http://www.ibm.com/developerworks/kr/library/j-testng/
http://www.ibm.com/developerworks/java/library/j-testng/

이러한 이야기가 2005년 이야기입니다.~~
국내에서는 추가적인 자료를 찾기가 JUnit 에 비하면 어렵더군요.
참고할만한 자료로는
JUnit 3.8에서 JUnit 4, TestNG 활용으로
http://younghoe.info/110
Designing for Testability
http://javajigi.tistory.com/186

내용을 요약해보면 사용자들은 JUnit 을 사용하면서
- 모든 코드는 테스트되어야 한다. every single piece of code must be tested.
- 가능한 모든 때에 코드는 독립적으로 테스트되어야 한다. Whenever possible, code must be tested in isolation (using, for example, techniques like mock objects).
- 소프트웨어는 테스트가 쉬워야 한다.  Software must be easy testable -- that is, written with tests in mind.
라는 기본적인 규칙을 배웠지만 아래와 같은 제한점을 가지고 있다고 합니다.

- 단일상속 속성때문에 TestCase 클래스 확장시 제한적이다. The need to extend a TestCase class, because the Java language has single inheritance, is very limiting.
- 매개변수들을 테스트메소드에 전달하는 것과 setUp(), tearDown() 메소드에 전달할 수 없다. It is impossible to pass parameters to JUnit's test method as well as to setUp() and tearDown() methods.
- 테스트 클래스는 테스트 메소드가 실행될때마다 다시 인스턴스화된다. The execution model is a bit strange: The test class is reinstantiated every time a test method is executed.
- 복잡한 프로젝트에서 다른 테스트 슈트의 관리는 트릭을 많이 써야 한다. The management of different suites of tests in complex projects can be very tricky.
라는 제약이 있다고 하네요.

사용자 삽입 이미지

http://www.theserverside.com/tt/articles/article.tss?l=MigratingtoTestNG


TestNG 는 구식 프레임웍의 제한을 없애고 개발자들이 유연하고 강력한 테스트를 작성할 수 있도록 하는 것이 목적이라고 합니다.

테스트 슈트를 정의하기 위해서 JUnit 는 TestSuite, 속성파일, Ant 구현파일들이 필요한데
TestNG 에서는 모든 데이터를 testing.xml 파일에 모아놓는다고 합니다.

또하나의 흥미로운 기능은 테스트 그룹을 정의하는 기능입니다.
모든 테스트 메소드를 한개 이상의 그룹들과 같이 사용할 수 있게 되는 것입니다.
간단하게 @Test 어노테이션의 매개변수로 다음과 같이 지정하면 끝난다고 합니다.

@Test(groups = {"tests.string"})


그러면 설정파일 안에서 아래와 같이 찾을 수 있습니다.

<groups>
   <run>
      <include name="tests.string" />
      <include name="tests.math" />
      <exclude name="tests.boolean"/>
   </run>
</groups>

그리고 TestNG 에서는 테스트 메소드외에 beforeTestClass, afterTestClass, beforeTestMethod, afterTestMethod 네가지 유형의 수명주기와 관련된 설정 메소드를 사용할 수 있다고 합니다.

참고사이트
http://testng.org
http://code.google.com/p/testng/
728x90