用語集 · テストの基礎
テストオラクル(Test Oracle)
英語: Test oracle
別名: test oracles, オラクル, オラクル問題, oracle problem
定義
仕様、以前のバージョン、参照モデル、ルールなど、出力が正しいかどうかを判断するためにテストが使う「正解の拠り所」です。
テストオラクルとは、何が正解かを教えてくれるもののことです。テストを実行すると出力が得られますが、その出力を合格か不合格かと判定する仕組みがオラクルです。通常はテストケースに書かれた期待結果がオラクルですが、多くのシステムでは期待結果を導き出すことこそがテストで最も難しい部分です。この難しさはオラクル問題として知られています。
オラクルの種類
- 仕様で定められた結果。 要件に「200 ドルの注文に 10% 割引を適用すると合計 180 ドル」とあれば、アサーションはその値と比較します。
- 参照実装。 信頼できる別の実装と比較します。以前のリリース、競合製品の計算、あるいは高速に最適化されたアルゴリズムを検証するための、シンプルだが遅いアルゴリズムなどです。
- 一貫性と性質(プロパティ)。 正確な出力はわからなくても、出力が従うべきルールはわかることがあります。ソートは同じ要素を非減少順で返さなければならず、エンコードしてからデコードすれば元の入力に戻らなければなりません。
- 保存されたベースライン。 スナップショットテストやビジュアルリグレッションテストは、承認済みの以前の出力を正しいものとして扱います。
- 人間の判断。 レイアウトや生成されたテキストが許容できるかどうかをテスターが判断します。柔軟ですが、遅く一貫性に欠けます。
例:性質ベースのオラクル
ソート関数のあらゆる入力に対して期待される出力を手で書くことはできませんが、正しい結果なら必ず持っている性質を確認することはできます。
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;
}
なぜ重要なのか
テストの質はオラクルの質で決まります。決済画面をクリックで進め、エラーが表示されなかったことだけをアサーションするテストのオラクルは非常に弱く、誤った金額を請求していても合格してしまいます。弱いオラクルは、コードカバレッジが高くても良いスイートとは限らない大きな理由の 1 つです。オラクル問題は AI システムのテストでも中心的な課題です。出力が毎回変わるため、チームはゴールデンデータセット、評価基準(ルーブリック)、あるいは判定役を務める別のモデルに頼っています。