Tests, die von Anfang an bestanden werden, treten normalerweise auf, wenn etwas allgemeiner implementiert wird, als es für die vorliegenden Tests tatsächlich erforderlich ist. Dies ist ganz normal : Unit-Tests können nur eine kleine, endliche Anzahl von Eingabewerten für eine bestimmte Funktion liefern, aber die meisten Funktionen sind für einen großen Bereich möglicher Eingabewerte geschrieben. Oft ist eine Implementierung, die speziell für die aktuellen Testfälle entwickelt wurde, komplizierter als eine allgemeinere Lösung. Wenn dies der Fall ist, wäre es umständlich und fehleranfällig, den Code künstlich so zu gestalten, dass er nur für die Testfälle funktioniert und für alles andere fehlschlägt.
Angenommen, Sie benötigen eine Funktion, um das Minimum einiger Werte aus einem bestimmten Array zurückzugeben. Sie haben eine Implementierung durchgeführt, die von einem Test mit einem Array gesteuert wurde, das nur einen oder zwei Werte enthält. Aber anstatt dies auf komplizierte Weise zu implementieren, indem Sie Vergleiche mit verschiedenen Elementen (möglicherweise nur den ersten beiden Elementen) durchführen, rufen Sie eine Minimum-Array-Funktion aus der Standardbibliothek Ihres Sprachökosystems auf und machen die Implementierung so zu einem Einzeiler . Wenn Sie jetzt einen Test mit einem Array mit fünf Elementen hinzufügen, wird der Test wahrscheinlich von Anfang an bestanden.
Aber woher weißt du dann, dass der Test aufgrund eines Fehlers im Test selbst nicht "grün" ist? Eine einfache und unkomplizierte Möglichkeit, dies zu erreichen, besteht darin, das zu testende Subjekt vorübergehend zu ändern , damit der Test fehlschlägt. Beispielsweise könnten Sie if (array.size()==5) return 123
Ihrer Funktion absichtlich eine Zeile hinzufügen . Jetzt schlägt Ihr Fünf-Elemente-Test fehl, also wissen Sie
- Der Test wird ausgeführt
- Der Assert-Aufruf im Test wird ausgeführt
- Der Assert-Aufruf im Test bestätigt das Richtige
Das sollte Ihnen ein gewisses Vertrauen in den Test geben. Wenn Sie gesehen haben, dass der Test fehlgeschlagen ist, machen Sie die Änderung rückgängig, und der Test sollte erneut bestanden werden.
Alternativ können Sie das erwartete Ergebnis eines Tests ändern: Angenommen, Ihr bestehender Test enthält eine Aussage wie
int result = Subject.UnderTest(...);
Assert.AreEqual(1,result);
Dann können Sie den Test bearbeiten und die "1" durch "2" ersetzen. Wenn der Test fehlschlägt (wie erwartet), wissen Sie, dass er ordnungsgemäß funktioniert, und Sie können den Austausch rückgängig machen und prüfen, ob der Test jetzt grün wird. Das Risiko, durch eine solche Ersetzung einen Fehler in den Test einzuführen, ist sehr gering, sodass dies für die meisten Fälle in der realen Welt wahrscheinlich akzeptabel ist.
Eine andere, möglicherweise umstrittene Methode besteht darin, einen Haltepunkt für den Test festzulegen und einen Debugger zu verwenden, um ihn zu durchlaufen. Dies sollte Ihnen auch ein gewisses Maß an Sicherheit geben, dass der Testcode tatsächlich ausgeführt wird, und Ihnen die Möglichkeit geben, den Pfad durch den Test durch schrittweise Überprüfung zu validieren. Es muss jedoch sehr darauf geachtet werden, Fehler in einem Codepfad nicht speziell für einen fehlgeschlagenen Test zu übersehen. Bei komplexen Tests können Sie beides in Betracht ziehen - künstliche Fehler verursachen und einen Debugger verwenden, um sie zu überprüfen.