Ist es in Ordnung, zurückgestellte Behauptungen wie diese hinzuzufügen? [..]
Nein , das ist es nicht. Warum? Denn wenn Sie aus irgendeinem Grund die zweite Zusicherung entfernen, wird der Test immer noch grün und Sie würden denken, dass er immer noch funktioniert, aber nicht, da die Auflistung nicht aufgezählt wird. Wenn Sie zwei oder mehr unabhängige Behauptungen haben, werden diese ihre Arbeit auch dann fortsetzen, wenn Sie eine davon deaktivieren.
Betrachten Sie diese Kombination:
Assert.IsTrue(actualKittens.All(x => x.IsCute());
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());
Selbst wenn Sie jetzt eine der Zusicherungen deaktivieren oder entfernen, würde die andere weiterhin ihre Aufgabe erfüllen. Auch wenn du vergessen , die Sammlung zu materialisieren, dauert die Ausführung möglicherweise länger, funktioniert aber weiterhin. Unabhängige Tests sind robuster und zuverlässiger.
Es gibt auch eine zweite Nr . Ich bin nicht sicher, wie andere Frameworks damit umgehen, aber wenn Sie die MS Test-Plattform verwenden, wissen Sie nicht, welcher Test fehlgeschlagen ist. Wenn Sie auf den fehlgeschlagenen Test doppelklicken, wird angezeigt, dass der Test CollectionAssert
fehlgeschlagen ist. In Wirklichkeit war es jedoch der verschachtelte Test , bei dem ein Fehler aufgetreten ist Assert
, und das Debuggen ist äußerst schwierig. Hier ist ein Beispiel:
[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());
}
Dies bedeutet, dass der erste Test eigentlich nutzlos ist, da es nicht hilft, einen Fehler zu finden. Sie wissen nicht, ob es fehlgeschlagen ist, weil eine Zahl ungültig war oder weil beide Sammlungen unterschiedlich waren.
Warum? So kann ich auch mit Aussagen, die eine materialisierte Sammlung erwarten, nur einmal iterieren
Ich frage mich, warum es dir wichtig ist? Dies sind Unit-Tests. Sie müssen nicht jedes Bit optimieren, und für Tests sind in der Regel nicht Millionen von Elementen erforderlich, sodass die Leistung kein Problem darstellen sollte.
Sie müssen solche Tests beibehalten. Warum sollten Sie sie dann komplexer gestalten, als es erforderlich ist? Schreiben Sie einfache Aussagen, die funktionieren.
sequence.WithSideEffect(item => Assert.IsCute(item))
, um es sauberer zu machen.