용어집 · 테스트 기초
테스트 오라클
영어: Test oracle
다른 이름: test oracles, 오라클 문제, oracle problem
정의
명세, 이전 버전, 참조 모델, 규칙처럼 테스트가 출력의 정답 여부를 판단할 때 기준으로 삼는 진실의 원천입니다.
테스트 오라클은 무엇이 정답인지 알려 주는 모든 것을 말합니다. 테스트를 실행하면 출력이 나오고, 오라클은 그 출력을 통과 또는 실패로 판정하는 메커니즘입니다. 보통은 테스트 케이스에 적힌 기대 결과가 오라클이지만, 많은 시스템에서는 기대 결과를 알아내는 것 자체가 테스트에서 가장 어려운 부분입니다. 이 어려움을 오라클 문제(oracle problem)라고 부릅니다.
오라클의 종류
- 명시된 결과. 요구사항에 200달러 주문에 10% 할인을 적용하면 합계가 180달러라고 적혀 있다면, 어설션은 그 값과 비교합니다.
- 참조 구현. 신뢰할 수 있는 다른 결과와 비교합니다. 이전 릴리스, 경쟁 제품의 계산 결과, 또는 빠르게 최적화된 알고리즘을 검사하는 단순하지만 느린 알고리즘 등입니다.
- 일관성과 속성. 정확한 출력은 몰라도 출력이 반드시 지켜야 할 규칙은 알 수 있습니다. 정렬은 같은 요소를 비내림차순(앞의 값이 뒤의 값보다 크지 않은 순서)으로 반환해야 하고, 인코딩 후 디코딩하면 원래 입력이 나와야 합니다.
- 저장된 기준선(baseline). 스냅샷 테스트와 비주얼 회귀 테스트는 이전에 승인된 출력을 정답으로 취급합니다.
- 사람의 판단. 테스터가 레이아웃이나 생성된 텍스트가 수용 가능한지 결정합니다. 유연하지만 느리고 일관성이 떨어집니다.
예시: 속성 기반 오라클
정렬 함수에 들어올 수 있는 모든 입력에 대해 기대 출력을 손으로 작성할 수는 없지만, 올바른 결과라면 반드시 가져야 할 속성은 확인할 수 있습니다.
function checkSorted(input: number[], output: number[]): boolean {
const sameLength = input.length === output.length;
const ordered = output.every((v, i) => i === 0 || output[i - 1] <= v);
const sameItems =
[...input].sort((a, b) => a - b).join(',') === output.join(',');
return sameLength && ordered && sameItems;
}
왜 중요한가
테스트의 품질은 오라클의 품질을 넘지 못합니다. 결제 과정을 클릭해 진행하면서 오류가 나타나지 않았다는 것만 어설션하는 테스트는 오라클이 매우 약합니다. 잘못된 금액이 청구되어도 통과할 것입니다. 약한 오라클은 높은 코드 커버리지가 좋은 테스트 스위트를 보장하지 못하는 주요 원인입니다. 오라클 문제는 AI 시스템 테스트에서도 핵심입니다. 출력이 매번 달라지기 때문에 팀은 골든 데이터셋, 평가 루브릭, 또는 심사자 역할을 하는 두 번째 모델에 의존합니다.