Ist es in Ordnung, verzögerte Aussagen wie diese hinzuzufügen?
var actualKittens = actualKittens.Select(kitten => {
Assert.IsСute(kitten);
return kitten
});
Warum? So kann ich auch mit Aussagen, die eine materialisierte Sammlung erwarten, nur einmal iterieren, zum Beispiel:
CollectionAssert.AreEquivalent(expectedKittens, actualKittens.ToList());
Es könnte sich auch nicht nur um Select handeln, sondern auch um eine Methode mit einem definierten Iterator und vielen Überprüfungen und Logik (z. B. Zählen und Filtern).
Der Keim des Zweifels ist die Komplexität des Lesens und Debuggens eines solchen Codes im Falle eines Testfehlers.
sequence.WithSideEffect(item => Assert.IsCute(item))
, um es sauberer zu machen.expectedKittens
? Sie haben gerade die Iterationen hinter Methodenaufrufen ausgeblendet..All()
.Antworten:
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:
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 istAssert
, und das Debuggen ist äußerst schwierig. Hier ist ein Beispiel: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.
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.
quelle
ToList
wird das Aufzählbare durchlaufen, nicht wahr?Assert.Fail
sondern amCollectionAssert
und du wirst nicht sagen können welche Aussage tatsächlich schief gelaufen ist. Ich meine, VS wird sich nichtAssert.Fail
auf das andere konzentrieren, sondern auf das andere. Jetzt können Sie debuggen.