JUnit으로 테스트 작성하기
2007. 4. 13. 13:59JUnit으로 테스트 작성하기
1. 단위 테스트 구조화
■ 테스트에 필요한 모든 조건과 상황을 준비 설정한다.(필요한 객체를 모두 생성하기, 필요한 자원을 모두 할당하기 등)
■ 테스트 대상이 되는 메서드를 호출
■ 테스트 대상이 되는 메서드가 원하는 대로 동작한다는 것을 검증한다.
■ 리팩토링
2. JUnit의 단정 메서드
■ assertEquals
assertEquals([String message], expected, actual, tolerance)
예) assertEquals("Should be 3 1/3", 3.33, 10.0/3.0, 0.01);
■ assertNull
assertNull([String message], java.lang.Object object)
assertNotNull([String message], java.lang.Object object)
인자로 넘겨받은 객ㄹ체가 null인지(또는 null이 아닌지) 판정하고, 반대인 경우 실패로 처리.
■ assertSame
assertSame([String message], expected, actual)
assertNotSame([String message], expected, actual)
expected와 actual이 같은 객체를 참조하는지 아닌지를 판정.
■ assertTrue
assertTrue([String message], boolean condition)
assertFalse([String message], boolean condition)
boolean 조건이 참인지 아닌지 판정
■ fail
fail([String message])
테스트를 바로 실패처리. 절대 수행되지 않아야 될 부분(예외가 발생되는 부분 다음)을 표시하는데 사용.
3. JUnit 프레임워크
import junit.framework.TestCase;
public class LargestTest extends TestCase {
private Largest largest;
/*
* 각각의 테스트 메서드들이 실행되기 전에 호출된다.
*/
protected void setUp() throws Exception {
largest = new Largest();
}
/*
* 각각의 테스트 메서드들이 실행되고 난 다음에 호출된다.
*/
protected void tearDown() throws Exception {
super.tearDown();
}
/*
* Test method for 'tdd.junit.ch2.Largest.largest(int[])'
*/
public void testLargest() {
assertEquals(9, largest.largest(new int[] {9,8,7}));
assertEquals(-7, largest.largest(new int[] {-9,-8,-7}));
}
}
4. JUnit 테스트 조합
여러개의 테스트 케이스를 통합한 것을 테스트 스위트(TestSuite)라고 한다. 테스트 스위트를 작성해 두면 여러개의 테스트 케이스를 한 번에 실행시킬 수 있다.
import junit.framework.Test;
import junit.framework.TestSuite;
public class AllTests {
public static Test suite() {
TestSuite suite = new TestSuite("Test for tdd.junit");
//$JUnit-BEGIN$
suite.addTestSuite(TestJukebox.class);
suite.addTestSuite(TestMyStack.class);
//$JUnit-END$
return suite;
}
}
5. JUnit 사용자 정의 단정 메서드
경우에 따라 사용자 정의 단정 메서드를 만들어야 할 경우 작성.
import junit.framework.*;
/**
* Project-wide base class for Testing
*/
public class ProjectTest extends TestCase {
/**
* Assert that the amount of money is an even
* number of dollars (no cents)
*
* @param message Text message to display if the assertion fails
* @param amount Money object to test
*/
public void assertEvenDollars(String message, Money amount) {
assertEquals(message, amount.asDouble() - (int)amount.asDouble(), 0.0, 0.001);
}
/**
* Assert that the amount of money is an even
* number of dollars (no cents)
*
* @param amount Money object to test
*/
public void assertEvenDollars(Money amount) {
assertEvenDollars("", amount);
}
}
이를 사용하기 위해서는 TestCaset를 바로 상속하지 않고 이 기반 클래스를 상속하여 사용.
6. JUnit과 예외
[테스트 메서드내 예외 선언]
public void testForException() {
try{
sortMyList(null);
fail("Should have thrown an exception"); /* 예외발생시 실패 선언 */
} catch(RuntimeException e) {
assertTrue(true); /* 성공처리 선언 - "제어 흐름이 반드시 여기를 지나야 한다"는 문서화 역할 */
}
}
[테스트 메서드 예외 선언]
public void testData1 throws FileNotFoundException {
FileInputStream in = new FileInputStream("data.txt");
출처 : Tong - I제로I님의 CVS/Ant/JUnit통