테스트 명세(Test Specification)와 테스트 오라클(Test Oracle) Java 구현 방법
Prof. Jong Min Lee이(가) 하루 전에 추가함
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 , 커스텀 비교 로직 등 |