Ich hoffe, dass dies nicht als dumme Frage erscheint, sondern etwas, worüber ich mich gewundert habe. Ich möchte Unit-Test eine Methode schreiben, die Logik enthält, um zu überprüfen, dass bestimmte Werte nicht Null sind.
%Vor%Ich möchte dies testen, indem ich Nullwerte in die Methode übergebe. Meine Frage ist, sollte ich einen Unit-Test für jedes Argument erstellen oder kann ich einen Unit-Test erstellen, der prüft, was passiert, wenn ich value1 auf null setze und dann überprüfe, was passiert, wenn ich value2 auf null setze.
d. h.
%Vor%oder
%Vor%Oder macht es einen Unterschied? Ich glaube, ich habe irgendwo gelesen, dass man sich auf einen Assert pro Unit Test beschränken sollte. Ist das korrekt?
Vielen Dank im Voraus Zaps
Sie sollten einen Unit Test für jeden Testfall (Assertion) schreiben, um Assertion Roulette .
Der "ideale" Unit-Test testet nur eines, um Fehler genau zu lokalisieren.
In der Praxis ist dies nicht annähernd so wichtig, wie die meisten TDD-Befürworter sagen, weil Tests nicht häufig versagen, und herauszufinden, welche Assert fehlgeschlagen ist, benötigt fast keine Zeit im Vergleich mit dem Rest der Arbeit bei der Untersuchung und Behebung des Problems .
Zusätzliche Arbeit beim Schreiben der Tests, um sich selbst zu retten, wenn es scheitert (was vielleicht nie passieren wird), ist eine Form von YAGNI .
Wenn mehrere Methoden keine zusätzliche Arbeit sind, die über das Eintippen weiterer Methodendeklarationen hinausgeht, sollten Sie es tun, aber wenn es zu doppeltem Setup-Code kommt, sehe ich absolut nichts falsch daran, mehrere Bedingungen in einer Testmethode zu testen.
Wenn Sie zwei Tests in der gleichen Testmethode durchführen, machen Ihre Tests nicht "unit-test".
Was passiert zum Beispiel, wenn der Test für den ersten null
-Wert fehlschlägt?
Wenn beide Tests dieselbe Testmethode verwenden, wird der zweite Test wahrscheinlich nicht ausgeführt. Dies bedeutet, dass der Test für den zweiten null
-Wert vom Test auf den ersten null
-Wert abhängt.
Wenn Sie andererseits zwei getrennte Testmethoden haben, können Sie jeden Fall in perfekter Isolation testen.
Nach dem Code Ihrer MyMethod
Methode zu urteilen, gibt es keine Verbindung zwischen den beiden Bedingungen; Das heißt, es sollte wahrscheinlich keine Abhängigkeit zwischen den Tests für diese beiden Bedingungen geben.
Also: Sie sollten zwei verschiedene Tests verwenden.
Um zu einem nicht-technischen Gedanken zu extrapolieren.
Sagen Sie, Sie haben ein Auto, und Sie möchten die Farbe testen.
Tests könnten sein:
Auto ist rot. Das Auto ist blau. Auto ist gemalt.
Nun könnte es sinnvoll sein, "Painted" und "Blue" zu haben, aber sie sind wirklich unterschiedliche Dinge. Und wenn Sie Rot und Blau testen, wird es immer scheitern - oder der Ausfall würde vom Standpunkt der Isolation aus keinen Sinn ergeben.
Testen Sie immer EINE Sache auf einmal, wie Sie vorschlagen, und viele Dinge umfassen die Testsuite.
Tags und Links c# unit-testing