테스트 명세(Test Specification)와 테스트 오라클(Test Oracle) Java 구현 방법
Prof. Jong Min Lee이(가) 약 2달 전에 추가함
Java로 테스트 명세(Test Specification)와 테스트 오라클(Test Oracle)을 어떻게 구현하는지 예제를 통해 설명드릴게요. 여기서는 JUnit을 사용한 간단한 단위 테스트를 예로 들어볼게요.
예제 시나리오: 계산기 클래스¶
// 테스트 대상 클래스 (SUT: System Under Test)
public class Calculator {
public int add(int a, int b) {
return a + b;
}
public int divide(int a, int b) {
if (b == 0) throw new IllegalArgumentException("Cannot divide by zero");
return a / b;
}
}
테스트 명세 예시 (Test Specification)¶
테스트 명세는 테스트 케이스의 입력값, 사전 조건, 기대 결과 등을 정의합니다. 아래는 JUnit을 사용한 테스트 명세입니다:
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
public class CalculatorTest {
// 테스트 명세: add(2, 3)의 결과는 5여야 한다
@Test
public void testAddition() {
Calculator calc = new Calculator();
int result = calc.add(2, 3); // 입력값
assertEquals(5, result); // 기대 결과
}
// 테스트 명세: divide(10, 2)의 결과는 5여야 한다
@Test
public void testDivision() {
Calculator calc = new Calculator();
int result = calc.divide(10, 2);
assertEquals(5, result);
}
// 테스트 명세: 0으로 나누면 예외가 발생해야 한다 (사전 조건 포함)
@Test
public void testDivideByZero() {
Calculator calc = new Calculator();
assertThrows(IllegalArgumentException.class, () -> {
calc.divide(10, 0);
});
}
}
테스트 오라클 예시 (Test Oracle)¶
위 코드에서 assertEquals()
와 assertThrows()
는 테스트 오라클의 역할을 합니다. 즉, 실제 결과가 기대 결과와 일치하는지를 판단하는 판단 기준이죠.
assertEquals(5, result)
→ 명시적 오라클: 기대 결과가 명확히 정의됨assertThrows(...)
→ 휴리스틱 또는 명시적 오라클: 특정 조건에서 예외가 발생해야 한다는 규칙 기반 판단
요약¶
요소 | 역할 | Java 코드에서의 구현 |
---|---|---|
테스트 명세 | 테스트의 입력, 절차, 기대 결과 정의 | 테스트 메서드, 입력값, 주석 등 |
테스트 오라클 | 결과가 옳은지 판단 | assertEquals , assertThrows , 커스텀 비교 로직 등 |