5

以下のようなカウント関数をテストしていた場合、1 つの関数で複数の関数をテストすることと、各テストにテスト関数を使用することは、「正しい」または「間違っている」と見なされますか?

function testGetKeywordCount() {
    $tester = $this -> getDatabaseTester($this -> CompleteDataFile);
    $tester -> onSetUp();

    $KeywordID = 0;
    $this -> setExpectedException('InvalidArgumentException');
    $this -> keyword -> getKeywordCount($KeywordID,'Active');

    $KeywordID = 1;
    $this -> setExpectedException('InvalidArgumentException');
    $this -> keyword -> getKeywordCount($KeywordID,'InvalidStatus');

    $this -> assertEquals(1, $this -> keyword -> getKeywordCount($KeywordID,'Active'));

    $tester -> onTearDown();
}
4

6 に答える 6

4

それぞれが独自の条件をテストする複数のテスト関数が必要です。そうすれば、デバッグせずに障害を見つけやすくなります。

于 2009-04-17T21:03:45.617 に答える
4

シナリオごとに 1 つのテスト ケースを用意するのが理想的です。ただし、場合によっては、1 つのテスト ケースで複数のシナリオをテストする方が便利です (実装作業の観点から効率的です)。最初の失敗で停​​止せず、テスト ケースで可能な限り実行を試みるフレームワークを使用する場合、そのフレームワークはテスト ケースごとの複数のシナリオに適しています。

単体テストに費やす時間をできるだけ少なくし、その間にできるだけ多くのカバレッジを得ることを好みます。

最終的には、単体テストをどのように実装するかは重要ではなく、それらのテストの正確性が重要になります。

于 2009-04-17T21:08:25.450 に答える
1

アサーションを 2 つの個別のテストに分割するための 1 つの議論は、アサーションの 1 つが失敗すると、1 つの失敗が発生するということです。両方のアサーションが失敗すると、2 つの失敗が発生します。

また、各テストの名前をできるだけ示唆的なものにすることで、何かが壊れたときに追加の手がかりを得ることができます。

于 2009-06-22T18:23:01.613 に答える
1

テスト フレームワークでは、テスト ルールごとに 1 つのアサーションに従う努力が常に有効であるとは限りません。

その 1 つがRuby のRSpecで、ネストされたサンプル グループを設定できます。例えば:

  • ユーザー
    • パスワードなし
      • 無効です
      • 例外をスローします
    • パスワード付き
      • 以前に使用されたもの
        • 無効です
        • 例外をスローします
        • トリップ セキュリティ警告
      • それは以前に使用されたことがない
        • 有効です
        • アカウントページにリダイレクト

段階的にシナリオを構築し、途中で各ステップをテストすることで、テスト アプローチごとに 1 つのアサーションに固執しやすくなります。また、テストされていないシナリオを見つけやすくなります。

于 2009-04-17T22:28:06.757 に答える
0

上記のサンプルコードでは、単体テストについては説明しません。
あなたの例は、機能の流れをテストする、より自動化された機能テストです。

ただし、この場合、複数のアサーションを持つことは問題ありません。

2つのアサーションが前後していないことを確認してください。

悪い例

public void ValidateRulesEntry_Valid_ValidConditionsFromFile()
{
    string condition = "Target.HasValue";
    string returnMessage;

    bool successFul = CodeParserTryParseCondition(condition, out returnMessage);


    Assert.IsTrue(successFul);
    Assert.IsFalse(string.IsNullOrEmpty(returnMessage));
    Assert.IsTrue(returnMessage == "OK");

}  

最後の2つのアサーションは、最初のアサーションIsTrue(successFul)に依存しています。

考えてみてください:そのテストが失敗した場合->理由を教えてください(デバッグ出力を調べずに)

于 2009-05-20T13:19:55.820 に答える