web-dev-qa-db-ja.com

テストオラクルとは何ですか?それは何のために使用されますか?

ソフトウェアテストOracle の概念を本当に理解していません。それは言う:

Oracleは、プログラムがテストに合格したか失敗したかを判断するためのメカニズムです。

次のコードについて考えてみます。

// class that should be tested
public int sum(int a, int b) {
  return a + b;
}

// test class
static Main tester = new Main();
@Test
public void testSum() {
  assertEquals("2 + 3 is 5", 5, tester.sum(2, 3));
}

テストする必要のあるクラスは、常に2つの整数の合計を返します。
パラメーター2と3として渡し、5を期待します。2と3が合計され、期待値(5)と比較されます。この場合、テストは成功します。

オラクルはここでどの程度正確に私を助けてくれますか?オラクルはこの例に関与していますか?

16
user1170330

テストOracleは、プログラム(または関数やメソッド)の出力が正しいかどうかに関する情報源です。

テストOracleは、考えられるすべての入力に対して、または特定の入力に対してのみ正しい出力を指定する場合があります。実際の出力値を指定せず、それらに対する制約のみを指定する場合があります。

オラクルは

  • 同じ入力を受け取り、同じ出力を生成するプログラム(テスト対象のシステムとは別)
  • 特定の特定の入力に対して特定の正しい出力を提供するドキュメント
  • 人間が与えられた入力の正しい出力を計算するために使用できる文書化されたアルゴリズム
  • どういうわけか出力を見て、それが正しいかどうかを判断できる人間の領域の専門家
  • または、出力が正しいことを伝えるその他の方法。

曖昧ではないにしても、概念は少なくとも非常に広いです。

Oracleはテストランナーではありませんが、テストランナーは、Oracleを、テスト対象システムの出力を比較するための正しい出力のソースとして、またはSUTの出力を評価するための制約のソースとして使用できます。

あなたの例では、あなたはあなたのオラクルとして加算のアルゴリズムを実行するためにあなたの個人的な能力を使用しました。代わりに、そのアルゴリズムの別の実装をOracleとして使用できます。

assertEquals("2 + 3 is 5", 2 + 3, tester.sum(2, 3));
15

オラクルの質問をこのように提起しましょう。プログラムが正しい答えを返すことをどのように確認できますか?

この関数の場合、次の擬似コードを使用して簡単に答えを確認できます(申し訳ありませんが、C++ではありません)。

repeat many times {
    int a = randomNumber();
    int b = randomNumber();
    int result = sum(a, b);
    assertEquals("random case", a, result - b);
}

このOracleは、減算を使用して関数をチェックします。これにより、人の労力をほとんどかけずに数百万または数十億のテストを実行できます。

4
Paul