このような遅延アサーションを追加しても大丈夫ですか?[..]
いいえ、そうではありません。どうして?何らかの理由で2番目のアサートを削除すると、テストはまだ緑に変わり、それでも機能するとは思われますが、コレクションが列挙されないため機能しないためです。2つ以上の独立したアサーションがある場合、それらの1つを無効にしても、彼らは仕事を続けます。
この組み合わせを検討してください。
Assert.IsTrue(actualKittens.All(x => x.IsCute());
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());
これで、一方のアサートを無効にしたり削除したりしても、もう一方のアサートはそのまま機能します。また、コレクションの具体化を忘れた場合、実行に時間がかかる可能性がありますが、それでも動作します。独立したテストは、より堅牢で信頼性があります。
2番目のnoもあります。他のフレームワークがそれをどのように処理するかはわかりませんが、MS Testプラットフォームを使用している場合、どのテストが失敗したかはわかりません。失敗したテストをダブルクリックすると、失敗したものCollectionAssert
として表示されますが、実際にはネストが失敗し、Assert
デバッグが非常に困難になります。以下に例を示します。
[TestMethod]
public void TestMethod()
{
var numbers = new[] { 1, 2, 3 }.Select(x =>
{
Assert.Fail("Wrong number.");
return x;
});
// This will fail and you won't be sure why.
CollectionAssert.AreEqual(new[] { 1, 2, 3 }, numbers.ToList());
}
これは、バグを見つけるのに役立たないため、最初のテストは実際には役に立たないことを意味します。数値が無効だったために失敗したのか、両方のコレクションが異なるために失敗したのかはわかりません。
どうして?そのため、具体化されたコレクションを期待するステートメントであっても、一度だけ繰り返すことができます
なぜあなたはそれを気にするのだろうか?これらは単体テストです。それらのすべてを最適化する必要はありません。通常、テストでは何百万ものアイテムを必要としないため、パフォーマンスは問題になりません。
このようなテストを維持する必要があるのに、なぜ必要以上に複雑にする必要があるのでしょうか?動作する単純なアサートを記述します。
sequence.WithSideEffect(item => Assert.IsCute(item))
して、よりきれいにすることができます。