2.JUnit
JUnit은 앞서 확인한 간이 테스트 프레임워크의 특징이자, 단점들을 해소하여 미리 구현해놓은 단위 테스트 프레임워크로,
개발자는 구현한 기능에 대해 테스트 코드만 작성할 수 있도록 지원하며, 그 외에도 여러 상황에 대한 테스트를 수행할 수 있도록 다양한 기능을 제공함
1. Calculator를 JUnit으로 테스트하기
JUnit5 버전을 활용하여 Calculator를 테스트하는 코드를 작성한 결과는 다음과 같음
// import..
public class CalculatorTest {
@Test // '하나의 테스트 케이스'를 나타내는 Annotation
public void testAdd() { // 테스트 메서드의 반환타입은 void이어야 함
Calculator calculator = new Calculator();
double result = calculator.add(3, 5);
assertEquals(8, result, 0);
}
@Test // 다른 테스트 케이스 - 뺄셈 기능
public void testSub() {
Calculator calculator = new Calculator();
double result = calculator.sub(5, 3);
assertEquals(2, result, 0);
}
}1. 테스트 대상별로 격리된 환경 제공
JUnit은 @Test 를 통해 앞서 간이 테스트 프레임워크에서 확인한 다음의 특성을 추상화된 Annotation의 형태로 제공하고 있음
→ 단위 테스트는 다른 단위 테스트와 독립적으로 실행되어야 함
// import..
public class CalculatorTest {
@Test // '하나의 테스트 케이스'를 나타내는 Annotation
public void testAdd() { // 테스트 메서드의 반환타입은 void이어야 함
Calculator calculator = new Calculator();
double result = calculator.add(3, 5);
assertEquals(8, result, 0);
}
@Test // 다른 테스트 케이스 - 뺄셈 기능
public void testSub() {
Calculator calculator = new Calculator();
double result = calculator.sub(5, 3);
assertEquals(2, result, 0);
}
}JUnit은 테스트 메서드들 간의(testAdd, testSub) 격리된 환경을 보장하고, 의도하지 않은 부수효과(SideEffect)를 방지하기 위해 @Test 메서드를 호출하기 전에 테스트 클래스 인스턴스(CalculatorTest)를 매번 새로 생성함
왜냐하면 테스트는 실행 순서에 관계ㅔ없이 항상 동일한 결과를 얻을 수 있어야 하기 때문
→ 뺄셈 기능 테스트인 testSub()를 실행하고 testAdd()를 실행했을 때와 그 반대로 실행했을 때 각 테스트케이스들의 성공/실패 결과가 다르면 안됨
2. 단정문을 통해 테스트 수행 결과 확인하기
JUnit은 테스트 수행에 따른 성공/실패 결과를 확인하기 위한 유틸 메서드를 제공하며 이를 단정문(Assertion)이라고 함
// import..
public class CalculatorTest {
@Test // '하나의 테스트 케이스'를 나타내는 Annotation
public void testAdd() { // 테스트 메서드의 반환타입은 void이어야 함
Calculator calculator = new Calculator();
double result = calculator.add(3, 5);
assertEquals(8, result, 0);
}
@Test // 다른 테스트 케이스 - 뺄셈 기능
public void testSub() {
Calculator calculator = new Calculator();
double result = calculator.sub(5, 3);
assertEquals(2, result, 0);
}
}이를 통해 개발자는 아래와 같이 테스트 성공/실패에 따른 별도의 분기 로직을 작성할 필요가 없음
if (result != 8) {
// 예외를 던지도록 지정
throw new IllegalStateException("잘못된 결과: " + result);
} else {
System.out.println("테스트 성공: " + result);
}테스트 케이스에 단언문 메서드 작성이 누락될 경우, JUnit 테스트 프레임워크는 테스트 성공으로 응답하기 때문에 거짓 양성(False positive, 오탐)이 발생할 수 있기 때문에 주의해야 함
// import..
public class CalculatorTest {
@Test
public void testAdd() {
Calculator calculator = new Calculator();
double result = calculator.add(3, 5);
// assertEquals(8, result, 0);
}
}→ 테스트 성공(?)