Ich versuche, Setup und Teardown für eine Reihe von Integrationstests durchzuführen, indem ich jUnit 4.4 verwende, um die Tests auszuführen. Der Abbau muss zuverlässig erfolgen. Ich habe andere Probleme mit TestNG, daher möchte ich wieder auf jUnit portieren. Welche Hooks können ausgeführt werden, bevor Tests ausgeführt werden und nachdem alle Tests abgeschlossen wurden?
Hinweis: Wir verwenden Maven 2 für unseren Build. Ich habe versucht, Maven's pre-
& post-integration-test
Phasen zu verwenden, aber wenn ein Test fehlschlägt, stoppt Maven und läuft nicht post-integration-test
, was keine Hilfe ist.
java
testing
junit
integration-testing
sblundy
quelle
quelle
post-integration-test
wenn ein Test fehlschlägt. Siehe auch diese Wiki-Seite .Antworten:
Ja, es ist möglich, Einrichtungs- und Abbauverfahren vor und nach Tests in einer Testsuite zuverlässig auszuführen. Lassen Sie mich im Code demonstrieren:
Ihre
Test1
Klasse würde also ungefähr so aussehen:... und Sie können sich vorstellen, dass
Test2
das ähnlich aussieht. Wenn Sie ranntenTestSuite
, würden Sie bekommen:Sie sehen also, dass das Auf- und Abbauen nur vor bzw. nach allen Tests ausgeführt wird.
Der Haken: Dies funktioniert nur, wenn Sie die Testsuite ausführen und Test1 und Test2 nicht als einzelne JUnit-Tests ausführen. Sie haben erwähnt, dass Sie maven verwenden, und das todsichere Maven-Plugin führt Tests gerne einzeln und nicht als Teil einer Suite aus. In diesem Fall würde ich empfehlen, eine Oberklasse zu erstellen, die jede Testklasse erweitert. Die Oberklasse enthält dann die mit Anmerkungen versehenen Methoden @BeforeClass und @AfterClass. Obwohl nicht ganz so sauber wie die oben beschriebene Methode, denke ich, dass es für Sie funktionieren wird.
Für das Problem mit fehlgeschlagenen Tests können Sie maven.test.error.ignore so festlegen, dass der Build für fehlgeschlagene Tests fortgesetzt wird. Dies wird nicht als fortlaufende Übung empfohlen, sollte Sie jedoch funktionsfähig machen, bis alle Ihre Tests bestanden sind. Weitere Informationen finden Sie in der Dokumentation zu Maven Surefire .
quelle
Ein Kollege von mir schlug Folgendes vor: Sie können einen benutzerdefinierten RunListener verwenden und die Methode testRunFinished () implementieren: http://junit.sourceforge.net/javadoc/org/junit/runner/notification/RunListener.html#testRunFinished(org. junit.runner.Result)
Um den RunListener zu registrieren, konfigurieren Sie einfach das todsichere Plugin wie folgt: http://maven.apache.org/surefire/maven-surefire-plugin/examples/junit.html Abschnitt "Verwenden von benutzerdefinierten Listenern und Reportern"
Diese Konfiguration sollte auch vom ausfallsicheren Plugin ausgewählt werden. Diese Lösung ist großartig, da Sie keine Suiten, Nachschlagetestklassen oder ähnliches angeben müssen. Maven kann damit seine Magie entfalten und darauf warten, dass alle Tests abgeschlossen sind.
quelle
Sie können die Annotation @ClassRule in JUnit 4.9+ verwenden, wie ich in einer Antwort auf eine andere Frage beschrieben habe .
quelle
Mit Anmerkungen können Sie Folgendes tun:
quelle
Hier wir
quelle
Wie für "Hinweis: Wir verwenden Maven 2 für unseren Build. Ich habe versucht, die Testphasen vor und nach der Integration von Maven zu verwenden, aber wenn ein Test fehlschlägt, stoppt Maven und führt den Test nach der Integration nicht aus , was keine Hilfe ist. "
Sie können stattdessen das fehlersichere Plugin ausprobieren. Ich denke, es kann sicherstellen, dass die Bereinigung unabhängig vom Setup- oder Zwischenstufenstatus erfolgt
quelle
Vorausgesetzt, dass alle Ihre Tests eine "technische" Klasse erweitern und sich im selben Paket befinden, können Sie einen kleinen Trick machen:
Beachten Sie, dass diese Lösung viele Nachteile hat:
Zur Information: listClassesIn () => Wie finden Sie alle Unterklassen einer bestimmten Klasse in Java?
quelle
Soweit ich weiß, gibt es in JUnit keinen Mechanismus dafür. Sie können jedoch versuchen, Suite zu unterklassifizieren und die run () -Methode mit einer Version zu überschreiben, die Hooks bereitstellt.
quelle
Da das Maven-Surefire-Plugin nicht zuerst die Suite-Klasse ausführt, sondern Suite- und Testklassen gleich behandelt, können wir das Plugin wie folgt konfigurieren, um nur Suite-Klassen zu aktivieren und alle Tests zu deaktivieren. Suite führt alle Tests aus.
quelle
Der einzige Weg, um die gewünschte Funktionalität zu erhalten, wäre, so etwas zu tun
Ich verwende so etwas in Eclipse, daher bin ich mir nicht sicher, wie portabel es außerhalb dieser Umgebung ist
quelle
Wenn Sie keine Suite erstellen möchten und alle Ihre Testklassen auflisten müssen, können Sie mithilfe von Reflection die Anzahl der Testklassen dynamisch ermitteln und in einer Basisklasse @AfterClass herunterzählen, um den TearDown nur einmal auszuführen:
Wenn Sie lieber @BeforeClass anstelle der statischen Blöcke verwenden möchten, können Sie auch ein boolesches Flag verwenden, um die Reflexionszählung und das Test-Setup beim ersten Aufruf nur einmal durchzuführen. Ich hoffe, das hilft jemandem. Ich habe einen Nachmittag gebraucht, um einen besseren Weg zu finden, als alle Klassen in einer Suite aufzuzählen.
Jetzt müssen Sie diese Klasse nur noch für alle Ihre Testklassen erweitern. Wir hatten bereits eine Basisklasse, um einige gemeinsame Dinge für alle unsere Tests bereitzustellen, daher war dies die beste Lösung für uns.
Inspiration kommt von dieser SO-Antwort https://stackoverflow.com/a/37488620/5930242
Wenn Sie diese Klasse nicht überall erweitern möchten, kann diese letzte SO-Antwort das tun, was Sie wollen.
quelle