1

単体テストの場合、同じメソッドをテストするエッジケースにはそれぞれ別のテストメソッドが必要です。たとえば、次の関数に渡される空の文字列をテストします。

public function add($numbers)
{
    $numbers = preg_replace('/\s/', '', $numbers);
    if ($numbers === "") {
        return 0;
    }
}

私は明らかに次のようなエッジケースをキャッチしたい:

""
" " 
"\t \n"
"asd"

では、この方法が機能することを証明するには、いくつのテスト方法が必要になるでしょうか?

public function testAddEmptyString()
{
    $stringCalculator = new StringCalculator();
    $this->assertSame(0, $stringCalculator->add(""));
}

public function testAddEmptyStringWithSpaces()
{
    $stringCalculator = new StringCalculator();
    $this->assertSame(0, $stringCalculator->add("  "));
}

public function testAddEmptyStringWithCharacters()
{
    $stringCalculator = new StringCalculator();
    $this->assertSame(0, $stringCalculator->add("asd"));
}

これは、テストクラスには、重要なメソッドの大量のメソッドが含まれているようです

4

4 に答える 4

1

この単純なケース (実際の関数、つまり、副作用も例外もなく、基本的にテスト ケースごとに 1 行) では、単一のテスト メソッドで十分だと思います。

セットアップ コードを必要とするより複雑なテスト ケースがある場合は、それぞれに独自のテスト メソッドを用意する必要があります。

于 2012-10-29T22:03:23.390 に答える
0

これはもちろん意見の問題であるため、私見では、テスト方法は常に単一のシナリオをテストする必要があります。

そうは言っても、テストコードを本番コードと同じように愛情を込めて扱う必要があることを考慮して、クリーンな設計(この場合はDRY )を目指して努力する必要があります。

すべての言語には、これを達成するための独自の方法がありますが、通常はメソッドを抽出することでうまくいきます。それ自体は、それらが分離されていて、意図が明確であるなどの条件で、多くのテストを行うことに害はありません.

例として、xUnit (C#) がこの問題を解決した方法を次のパターンで示します。

[Theory]
[InlineData("")]
[InlineData(" ")]
[InlineData("\t \n")]
[InlineData("asd")]
public void Add_NonNumber_ZeroReturned(string numbers)
{
    var underTest = new UnderTest();
    var result = underTest.Add(numbers);
    Assert.Equal(0, result);
}
于 2012-10-30T14:05:39.257 に答える
0

テストとは別に、これらすべてのエッジ ケース値の配列を用意する必要があります。

String[] edgeCaseValues = {""," ","\t \n","asd"};

次に、テストでは、それらを単純にループして関数に渡すことができます

foreach(var edgeCaseValue in edgeCaseValues)
{
    $stringCalculator = new StringCalculator();
    $this->assertSame(0, $stringCalculator->add(edgeCaseValue));
}

このようにして、それらを他のテストで再利用できます。新しいエッジ ケースの値を追加すると、それらはすべてすべてのテストに追加されます。

于 2012-10-30T14:16:04.020 に答える
0

個別のテスト メソッドを多数用意する必要があります。その数は気にしないでください。

複数のテストをメソッドに押し込もうとすることの悪い点は、テストが失敗したときに、テストの一部が失敗すると残りのテストが実行されなくなるため、実際の破損の程度がわからないことです。テストの中断を見つけて修正すると、さらに多くの失敗が発生する可能性があります。

さまざまなケースが個別のテストで処理されるようにテストを編成すると、すべての失敗が一度に表示されます。

すべてのエッジ ケースが異なるデータを渡すインスタンスであり、それらがすべて同じ方法で呼び出される場合は、テスト フレームワークがパラメーター化されたテストをサポートしているかどうかを確認する必要があります。

于 2012-10-30T14:10:06.043 に答える