프로젝트

일반

사용자정보

테스트 명세(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, 커스텀 비교 로직 등