テストは1つの理由でのみ失敗するはずですが、それは常に1つのAssert
ステートメントのみが存在することを意味するわけではありません。私見では、「アレンジ、アクト、アサート」パターンを保持することがより重要です。
重要なのは、アクションが1つしかないこと、そしてアサートを使用してそのアクションの結果を検査することです。ただし、「アレンジ、アクト、アサート、テスト終了」です。別のアクションを実行してテストを続行し、その後さらにアサートする場合は、代わりに別のテストを作成します。
同じアクションのテストの一部を形成する複数のアサートステートメントを見ることができてうれしいです。例えば
[Test]
public void ValueIsInRange()
{
int value = GetValueToTest();
Assert.That(value, Is.GreaterThan(10), "value is too small");
Assert.That(value, Is.LessThan(100), "value is too large");
}
または
[Test]
public void ListContainsOneValue()
{
var list = GetListOf(1);
Assert.That(list, Is.Not.Null, "List is null");
Assert.That(list.Count, Is.EqualTo(1), "Should have one item in list");
Assert.That(list[0], Is.Not.Null, "Item is null");
}
これらを1つのアサートに結合することもできますが、それは、すべきである、またはする必要があると主張することとは異なります。それらを組み合わせても改善はありません。
例えば最初のものは可能性があること
Assert.IsTrue((10 < value) && (value < 100), "Value out of range");
しかし、これは良くありません-それからのエラーメッセージはそれほど具体的ではなく、他の利点はありません。2つまたは3つ(またはそれ以上)のアサートを1つの大きなブール条件に組み合わせると、読みにくく、変更しにくく、失敗した理由を突き止めるのが難しい他の例を考えることができると確信しています。なぜルールのためだけにこれを行うのですか?
NB:ここで書いているコードはNUnitを使用したC#ですが、原則は他の言語とフレームワークでも同じです。構文も非常に似ている場合があります。