'2007/12'에 해당되는 글 2건
JUnit 4 vs. TestNG :: 2007/12/28 23:50
JUnit은 자바 프로그래밍 언어를 위한 단위테스트(Unit Test) 프레임워크로 Kent Beck과 Erich Gamma에 의해서 개발되었다. Kent Beck는 Extreme Programming(XP)의 창시자로 최근 Test-Driven Development(TDD)를 부흥케 하도록 지대한 영향을 끼쳐왔다. 2002년 JUnit 3.8을 발표된 이래 한동안 버전업을 하지 않았던 JUnit은 3년이 넘게 지난 2006년에서야 JUnit 4를 발표했다.
그동안 JUnit은 소프트웨어 개발 생태계에 많은 영향을 끼치면서 많은 확장된 테스팅 프레임워크를 낳게 했고, 여기서 "test-infected"라는 용어도 만들어지기도 했다. 다양한 xUnit 계열의 프레임워크가 바로 JUnit을 확장하거나 다른 프로그래밍 언어로 포팅된 것들이다. 오늘날 단위테스트는 QA팀의 역할이 아니라 개발자의 역할로 인식되고 있다.
JUnit이 이처럼 소프트웨어 개발에 큰 영향을 주고 테스팅 자동화를 가능하게 했지만, 단위테스트라는 역할에 머물러 있었고 단위 태스트간 상태 공유나 의존성 순서 등을 표현할수 없어 기능테스트(Functional Test)나 통합테스트(Integration Test)등에는 적용하기가 어려웠다. 이러한 JUnit의 영향과 단점의 인식에서 Cedric Beust에 의해서 TestNG라는 새로운 테스팅 프레임워크가 개발되었다.
TestNG는 단위테스트를 비롯하여 기능테스트, 통합테스트, 인수테스트 등 모든 범주의 테스트를 지원하는 것을 추구한다. JUnit보다 더욱 유연하고 쉬운 테스트가 가능하며, 주요 특징은 다음과 같다.
- JDK 5 어노테이션 지원 (JDK 1.4는 JavaDoc 어노테이션을 통해 지원)
- testng.xml을 통한 유연한 테스트 설정
- @DataProvider을 통한 Data-Driven Testing 지원
- 테스트 그룹 및 테스트간 종속성(순서) 지원
- 파리미터 지원
- 예외 테스트 지원
- 병렬 테스트 및 타임아웃 지원
- API와 내장된 BeanShell을 통한 테스트 유연성
- 다양한 도구와 플러그인 지원
한동안 버전업이 없던 JUnit은 TestNG로부터 새로운 기능을 도입하였고 JUnit 4를 발표했다. JDK 5의 어노테이션을 비롯하여 예외 테스트, 타임아웃 및 몇몇 설정 가능한 메소드들을 추가했다.
JUnit 4가 새로운 기능을 추가를 하면서 테스트 구현체를 보면 얼핏 두 프레임워크가 크게 차이가 없을 듯 보이지만, 여전히 JUnit 4는 TestNG가 지원하는 테스트간 종속성이나 @DataProvider를 통한 파라미터 테스팅 등을 지원하지 못하며, 수많은 테스트들을 수행할 때 필요한 유연한 테스트 설정을 TestNG 만큼 지원하지 못하고 있다. 이는 프레임워크 설계 사상에 있어 JUnit 4는 단위테스트만을, TestNG는 단위테스트를 비롯한 다양한 테스트들에 대한 지원을 추구하고 있다는 점에서 다른 듯 하다.
참조: http://www.ibm.com/developerworks/java/library/j-cq08296/
그동안 JUnit은 소프트웨어 개발 생태계에 많은 영향을 끼치면서 많은 확장된 테스팅 프레임워크를 낳게 했고, 여기서 "test-infected"라는 용어도 만들어지기도 했다. 다양한 xUnit 계열의 프레임워크가 바로 JUnit을 확장하거나 다른 프로그래밍 언어로 포팅된 것들이다. 오늘날 단위테스트는 QA팀의 역할이 아니라 개발자의 역할로 인식되고 있다.
JUnit이 이처럼 소프트웨어 개발에 큰 영향을 주고 테스팅 자동화를 가능하게 했지만, 단위테스트라는 역할에 머물러 있었고 단위 태스트간 상태 공유나 의존성 순서 등을 표현할수 없어 기능테스트(Functional Test)나 통합테스트(Integration Test)등에는 적용하기가 어려웠다. 이러한 JUnit의 영향과 단점의 인식에서 Cedric Beust에 의해서 TestNG라는 새로운 테스팅 프레임워크가 개발되었다.
TestNG는 단위테스트를 비롯하여 기능테스트, 통합테스트, 인수테스트 등 모든 범주의 테스트를 지원하는 것을 추구한다. JUnit보다 더욱 유연하고 쉬운 테스트가 가능하며, 주요 특징은 다음과 같다.
- JDK 5 어노테이션 지원 (JDK 1.4는 JavaDoc 어노테이션을 통해 지원)
- testng.xml을 통한 유연한 테스트 설정
- @DataProvider을 통한 Data-Driven Testing 지원
- 테스트 그룹 및 테스트간 종속성(순서) 지원
- 파리미터 지원
- 예외 테스트 지원
- 병렬 테스트 및 타임아웃 지원
- API와 내장된 BeanShell을 통한 테스트 유연성
- 다양한 도구와 플러그인 지원
한동안 버전업이 없던 JUnit은 TestNG로부터 새로운 기능을 도입하였고 JUnit 4를 발표했다. JDK 5의 어노테이션을 비롯하여 예외 테스트, 타임아웃 및 몇몇 설정 가능한 메소드들을 추가했다.
JUnit 4가 새로운 기능을 추가를 하면서 테스트 구현체를 보면 얼핏 두 프레임워크가 크게 차이가 없을 듯 보이지만, 여전히 JUnit 4는 TestNG가 지원하는 테스트간 종속성이나 @DataProvider를 통한 파라미터 테스팅 등을 지원하지 못하며, 수많은 테스트들을 수행할 때 필요한 유연한 테스트 설정을 TestNG 만큼 지원하지 못하고 있다. 이는 프레임워크 설계 사상에 있어 JUnit 4는 단위테스트만을, TestNG는 단위테스트를 비롯한 다양한 테스트들에 대한 지원을 추구하고 있다는 점에서 다른 듯 하다.
참조: http://www.ibm.com/developerworks/java/library/j-cq08296/
JUnit 기본 사용법 :: 2007/12/22 22:23
JUnit은 자바 세계에서 가장 널리 사용되어지고 있는 단위 테스팅 도구이다. Eclipse를 비롯한 대부분은 IDE는 JUnit을 기본으로 지원하고 있다. 단위테스트에 국한되어 있어 모든 테스트를 소화하기엔 부족한 점이 있지만, 기능의 확장을 위해 이를 기반으로 한 Add-ons 이나 Extensions 들이 많이 나와있다. 현재까지 가장 많이 쓰여 왔던 JUnit 3.8 버전의 사용법을 간단히 정리해본다.
1. 기본 테스트 예제
import junit.framework.TestCase;
public class SimpleTest extends TestCase {
private int x = 3;
private int y = 2;
public void testAddition() {
int z = x + y;
assertEquals(5, z);
}
} |
- public void 타입으로 선언된 test* 로 시작되는 테스트 메소드 작성.
- assert 로 테스트 결과 검증.
2. setUp과 tearDown을 이용한 각 테스트 메소드 실행시마다 초기화 및 종료화 처리 예제
import junit.framework.TestCase;
public class SetupTest extends TestCase {
private int x;
private int y;
protected void setUp() {
x = 3;
y = 2;
System.out.println("setUp()");
}
public void testAddition() {
int z = x + y;
assertEquals(5, z);
}
public void testSubtraction() {
int z = x - y;
assertEquals(1, z);
}
protected void tearDown() {
System.out.println("tearDown()");
}
} |
3. TestSetup를 이용한 클래스내 모든 테스트 실행 전 초기화와 실행 후 종료화 처리 예제
import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
public class TestSetupTest extends TestCase {
private static int x;
private static int y;
public static Test suite() {
TestSetup setup = new TestSetup(
new TestSuite(TestSetupTest.class)) {
protected void setUp() {
x = 3;
y = 2;
System.out.println("setUp()");
}
protected void tearDown() {
System.out.println("tearDown()");
}
};
return setup;
}
public void testAddition() {
int z = x + y;
assertEquals(5, z);
}
public void testSubtraction() {
int z = x - y;
assertEquals(1, z);
}
} |
4. 예외 테스트 예제
import junit.framework.TestCase;
public class ExceptionTest extends TestCase {
public void testDivisionByZero() {
try {
int n = 2 / 0;
fail("Divided by Zero!"); // 실패
}
catch (ArithmeticException ae) {
assertNotNull(ae.getMessage()); // 성공
}
}
} |
5. TestSuite를 이용한 모든 테스트 실행 예제
import junit.framework.Test;
import junit.framework.TestSuite;
public class AllTests {
public static Test suite() {
TestSuite suite = new TestSuite("All JUnit Tests");
suite.addTestSuite(ExceptionTest.class);
suite.addTestSuite(SetupTest.class);
suite.addTestSuite(SimpleTest.class);
suite.addTest(TestSetupTest.suite());
return suite;
}
public static void main(String[] args) {
junit.textui.TestRunner.run(suite());
}
} |
참조: http://www.clarkware.com/articles/JUnitPrimer.html
참조: http://www.cs.wm.edu/~noonan/junit/doc/faq/faq.htm

