테스트 오라클
Prof. Jong Min Lee이(가) 하루 전에 추가함
테스트 오라클은 소프트웨어 테스트에서 "결과가 정답인지 판단할 기준" 역할을 합니다. 테스트 명세가 “어떻게 테스트할 것인가”를 다룬다면, 오라클은 “그 결과가 옳은가?”를 판단해주는 검사관 같은 존재죠. 다양한 종류가 있으며 각각의 특징과 활용 맥락이 있어요.
테스트 오라클의 유형별 상세 설명¶
유형 | 설명 | 예시 |
---|---|---|
1. 명시적 오라클 (Specified Oracle) | 사양서나 요구사항 문서에 테스트 결과가 명확히 정의된 경우 사용 | “로그인 시 200 OK 응답을 반환해야 한다”처럼 명확한 결과가 문서화되어 있는 경우 |
2. 휴리스틱 오라클 (Heuristic Oracle) | 완전한 기대 결과는 없지만, 경험이나 일반적인 상식에 따라 판단 | “앱이 열리자마자 바로 꺼지면 이상하다” → 직관적으로 오류로 판단 |
3. 일관성 오라클 (Consistent Oracle) | 동일 입력 → 동일 출력이라는 일관성 원칙에 따라 비교 | 동일한 데이터를 두 번 넣었는데 결과가 다르면 문제 발생으로 판단 |
4. 참조 오라클 / 골든 오라클 (Golden Oracle) | 신뢰 가능한 기존 시스템의 결과를 정답으로 간주하고 비교 | 이전 버전 또는 독립적으로 구현한 모듈의 결과를 기준으로 사용 |
5. 샘플링 오라클 (Sampling Oracle) | 전체 결과를 검사하기 어렵기 때문에 일부 샘플만 검사 | 수백 개 요청 중 무작위 10개만 골라 비교. 대규모 데이터 처리 시 유용 |
6. 모델 기반 오라클 (Model-based Oracle) | 시스템의 동작 모델을 정의하고, 그 모델의 결과와 비교 | 상태 전이 모델을 활용하여 실제 결과와 비교 (복잡한 시스템에서 사용) |
7. 추상 오라클 (Implicit/Abstract Oracle) | 정답은 없지만 규칙 기반 또는 성능 기반으로 판단 | 게임 프레임 속도가 5fps면 성능 기준상 오류로 판단 가능 |
Pytest에서의 적용 예시¶
def test_response_status(): # 명시적 오라클
response = client.get("/login")
assert response.status_code == 200
def test_output_consistency(): # 일관성 오라클
output1 = calculate("1+1")
output2 = calculate("1+1")
assert output1 == output2
def test_against_reference(): # 참조 오라클
expected = golden_reference_result()
actual = new_module_result()
assert actual == expected
def test_heuristic_behavior(): # 휴리스틱 오라클
result = launch_app()
assert "error" not in result.lower() and result != ""
언제 어떤 오라클을 선택할까?¶
- 명시적인 요구사항이 있다면 → 명시적 오라클
- 정답이 없고 직관이 필요한 경우 → 휴리스틱 오라클
- 여러 번 동일 입력을 줄 수 있는 기능이라면 → 일관성 오라클
- 이전 결과가 있다면 → 참조 오라클
테스트 환경에 따라 하나 이상의 오라클 유형을 조합해서 사용하는 경우도 많아요. 예를 들어, 웹 서비스를 테스트할 때 명시적 + 일관성 + 참조 오라클을 동시에 적용할 수 있죠.