2 Stimmen

Was ist der empfohlene Weg, um Daten zu protokollieren, die in JUnit Fehler verursacht haben?

Ich bin relativ neu bei JUnit und habe heute einige meiner ersten Tests geschrieben. Für eine bestimmte Methode wollte ich zufällige Werte übergeben (alle innerhalb des korrekten Bereichs). Wenn die Methode aus irgendeinem Grund fehlschlägt, möchte ich wissen, welcher Wert dazu geführt hat. Was ist also der empfohlene Weg, um dies zu tun?

(Oder ist es schlecht, zufällige Werte in JUnit-Tests zu verwenden?)

3voto

ShuggyCoUk Punkte 35230

Wenn Sie wirklich zufällige Werte verwenden möchten, platzieren Sie einfach den Wert, der verwendet wird, im Textteil der Assert-Methoden. Wenn also ein Assert fehlschlägt, wird der Eingabewert vorhanden sein und Sie können untersuchen, warum es ein Problem gab.

Dies ist Fuzz-Testing und ist eine leistungsstarke Technik, aber am nützlichsten, wenn Sie den verfügbaren Quellcode nicht haben oder wenn Sie ein System mit komplexem internen Zustand und mehreren Interaktionen testen.

Eine nützlichere Art des Testens für Sie könnte Weißkastentests sein, bei denen Testeingaben bewusst ausgewählt werden, um die verschiedenen Klassen von Eingaben abzudecken, die Sie erhalten könnten. JTest scheint ein automatisiertes Tool dafür in Java zu sein. MS Research bietet PEX für C# an.

Es ist normalerweise ausreichend, einfach ein Abdeckungstool zu verwenden und zu validieren, dass Sie die relevanten Pfade abdecken, wenn Sie es manuell machen, obwohl die Grenzfälle, die von den automatisierten Tools bereitgestellt werden, oft lehrreich sind.

2voto

Sie können versuchen, http://www.openfuture.de/Log4Unit/ zum Protokollieren zu verwenden, aber ich würde davon abraten, zufällige Werte für Unit-Tests zu verwenden, da sie wiederholt werden sollen. Wenn Sie eine Vielzahl von Werten testen möchten, verwenden Sie einfach eine for-Schleife und einige Änderungen am Indexwert, der leicht wiederholt werden kann.

Wenn Sie darüber nachdenken, gibt es wirklich keine Situation, in der es vorteilhafter wäre, Zufallswerte anstelle von "fest codierten" zu verwenden. Wenn Sie eine gute Verteilung über einen Wertebereich wünschen, können Sie eine Funktion verwenden oder Zufallswerte mit einem festen Seed verwenden (um dieselben Zahlen zu erhalten).

Wenn ein Test fehlschlägt, möchten Sie ihn beheben und den Test erneut ausführen können. Das ist das Problem mit Zufallszahlen in Unit-Tests.

2voto

Morendil Punkte 3830

Melde einfach die tatsächlichen und erwarteten Werte im Parameter "Diagnosemeldung" deiner Aussagen. Das ist die gängige Praxis für JUnit-Tests, und die "Helfer" -Assert-Methoden neigen dazu, dies standardmäßig zu tun, z. B. assertEquals wird etwas wie "erwartet 6 und erhalten 7" sagen.

Zufällige Werte sind OK, solange du sicherstellen kannst, dass der zufällige Bereich eine Äquivalenzklasse für den zu testenden Code darstellt.

2voto

nbeyer Punkte 1157

Haben Sie versucht, die 'assertThat'-Methoden und Hamcrest-Matcher zu verwenden, die Teil von JUnit 4.4+ sind? Schauen Sie sich die README [1] an und suchen Sie nach 'assertThat'.

Ich bin ziemlich begeistert vom semantischeren Erscheinungsbild des Codes und die Fehlermeldungen sind viel informativer.

[1] http://junit.sourceforge.net/README.html

1voto

guerda Punkte 22205

Ich würde parameterisierte Testfälle vorschlagen, damit Sie zufällige Werte verwenden können (im Data-Method) und es in Ihrem Runner "protokolliert" wird, wenn eine Methode fehlschlägt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X