JUnit은 Java에서 TDD나 단위 테스트에 대해 말할때 뺴놓고 말할 수 없을 정도로 매우 중요한 단위 테스트 프레임워크이다.
JUnit은 단위 테스트를 수행하는데 있어 기본적으로 다음과 같은 기능을 제공한다.
테스트 픽스처(test fixture)
란 테스트를 반복적으로 수행할 수 있게 도와주고 매번 동일한 결과를 얻을 수 있게 도와주는 기반이 되는 상태나 환경을 의미한다. 일관된 테스트 실행 환경이라고도 하며, 테스트 컨텍스트(test context)
라고 하기도 한다.
1장에서 사용한 setup()은 테스트 픽스처를 만들고 정리하는 작업을 수행하는 메서드인데, 이런 메서드를 테스트 픽스처 메서드(test fixture method)
라고 한다.
정확히는 단위 테스트 케이스와 단위 테스트 메서드가 제대로 된 명칭이다. 테스트 케이스
는 테스트 작업에 대한 시나리오적인 의미가 더 강하고 테스트 메서드
는 JUnit의 메서드를 지칭한다.
규칙 1: TestCase를 상속받는다.
규칙 2: 테스트 메서드의 이름은 반드시 test로 시작해야 한다.
public class CalculatorTest extends TestCase {
public void testCalculateSum() {
...
}
}
assertEquals("설명값", 예상값, 실제값);
두 값이 같은지 비교하는 단정문으로, 예상값과 실제값이 서로 일치하는지 판단한다. 예상값과 실제값은 Java의 기본 타입(primitive type) 전체에 대해 중첩구현되어 있기 때문에 다양한 값을 서로 비교할 수 있다.
assertEquals("설명값", double 예상값, double 실제값, double delta);
float 이나 double 데이터형의 경우 delta라는 오차 보정 값을 사용해 범위 내의 값은 동일한 값으로 판단하게끔 할 수 있다.
assertSame("설명값", 예상값, 실제값);
assertSame은 두 객체가 정말 동일한 객체인지 주소값으로 비교하는 단정문이다. 따라서 객체를 비교할 때 equals 메서드를 사용하지 않고 등가비교(==)를 한다.
// 특정 객체가 캐시에서 가져온 객체와 동일한지 판단
cache.add(someObject, KEY);
assertSame("캐시처리 실패", someObject, cache.lookup(KEY));
// 싱글톤으로 만들어진 객체 비교
static public void assertSame(String message, Object expected, Object actual) {
if (expected == actual)
return;
failNotSame(message, expected, actual);
}
assertTrue("설명값", 예상값);
예상값의 참/거짓을 판별하는 단정문이다. boolean 타입 메서드를 이용할 경우나, 부등호 비교, 범위 비교 등을 판단할 때 사용한다.
assertNull("설명값", 예상값);
대상 값의 null 여부를 판단하는 단정문이다.
💡 assert 시리즈는 예상값이 assert 문장 다음에 이어지는 글자와 상태가 일치한다는 걸 확인하는 문장이다. assert를 '~이어야 함' 으로 해석하면 된다.
fail("설명값");
이 메서드가 호출되면 해당 테스트 케이스는 그 즉시 실패한다. 테스트 케이스를 작성 중인데 완료하지 못한 채 구현을 중단해야 하는 경우 끝 부분에 fail()을 추가해놓으면 나중에 이어서 개발할때 도움이 된다.
혹은 예외처리를 테스트하기 위해 사용하기도 한다.
public void testWithdraw_현재잔고이하_인출요구시() throws Exception {
account = new Account(10000);
try {
account.withdraw(20000);
fail();
} catch (OverWithdrawRequsetException e) {
assertTrue(true); // 빈 줄로 남겨둬도 무방하나 명시적으로 표시함
}
}
JUnit 프레임워크는 독립적인 소프트웨어이다. 때문에 명령행 프롬프트에서 실행하거나 셸 스크립트 등을 이용해 실행할 수도 있다. 이를 위해 JUnit은 테스트 러너
라는 테스트 실행 클래스를 제공한다. 기본적으로 세 가지 실행 방법을 제공하는데 Swing UI, 텍스트 그리고 Java AWT UI이다.