Es gibt einen Kompromiss. Je mehr Sie in einem Test einpacken, desto wahrscheinlicher ist es, dass Sie einen Zwiebeleffekt haben, der versucht, ihn zum Bestehen zu bringen. Mit anderen Worten, der erste Fehler beendet diesen Test. Sie werden nichts über die anderen Behauptungen wissen, bis Sie den ersten Fehler behoben haben. Das heißt, eine Reihe von Unit-Tests zu haben, die sich bis auf den Setup-Code größtenteils ähneln, ist eine Menge an Arbeit, nur um herauszufinden, dass einige wie geschrieben funktionieren und andere nicht.
Mögliche Tools, basierend auf Ihrem Framework:
- Theorien . Mit einer Theorie können Sie eine Reihe von Fakten zu einem Datensatz testen. Das Framework füttert Ihre Tests dann mit mehreren Testdatenszenarien - entweder über ein Feld oder über eine statische Methode, mit der die Daten generiert werden. Wenn einige Ihrer Fakten unter bestimmten Voraussetzungen zutreffen und andere nicht das Konzept einer Annahme einführen . Sie
Assume.that()
überspringen einfach den Test für die Daten, wenn die Vorbedingung nicht erfüllt ist. Auf diese Weise können Sie "Funktioniert wie erwartet" definieren und dann einfach eine Menge Daten einspeisen. Wenn Sie die Ergebnisse anzeigen, haben Sie einen Eintrag für die übergeordneten Tests und dann einen Untereintrag für jedes Datenelement.
- Parametrisierte Tests . Parametrisierte Tests waren ein Vorläufer von Theorien, daher gibt es möglicherweise nicht die Voraussetzungsprüfung, die Sie für Theorien haben können. Das Endergebnis ist das gleiche. Wenn Sie die Ergebnisse anzeigen, verfügen Sie über einen übergeordneten Eintrag für den Test selbst und anschließend über einen bestimmten Eintrag für jeden Datenpunkt.
- Ein Test mit mehreren Aussagen . Die Einrichtung nimmt weniger Zeit in Anspruch, aber es kommt immer wieder vor, dass Probleme entdeckt werden. Wenn der Test zu lang ist und zu viele verschiedene Szenarien getestet werden, gibt es zwei große Risiken: Es wird zu lange dauern, bis der Test ausgeführt wird, und Ihr Team wird die Nase voll davon haben und den Test ausschalten.
- Mehrere Tests mit ähnlicher Implementierung . Es ist wichtig zu beachten, dass sich die Tests nicht überlappen, wenn die Aussagen unterschiedlich sind. Dies wäre jedoch die übliche Weisheit eines TDD-Teams.
Ich bin nicht der festen Überzeugung, dass assert
Ihr Test nur eine Aussage enthalten kann, aber ich setze die Einschränkungen dahingehend, dass alle Behauptungen die Nachbedingungen einer einzelnen Aktion testen sollten. Wenn der einzige Unterschied zwischen den Tests Daten sind, bin ich der Meinung, dass ich die fortschrittlicheren datengesteuerten Testfunktionen wie parametrisierte Tests oder Theorien verwenden sollte.
Wägen Sie Ihre Optionen ab, um das beste Ergebnis zu erzielen. Ich werde sagen, dass "WorksAsExpectedWhenNull" sich grundlegend von allen Fällen unterscheidet, in denen Sie mit einer Sammlung zu tun haben, die eine unterschiedliche Anzahl von Elementen aufweist.