JUnit TestWatcher

13.02.2024

Wir zeigen hier, wie man eine JUnit-Erweiterung schreibt, welche Test-Ausführung überwacht. Konkret soll die Ausführung weiterer Tests in einer Test-Klasse verhindert werden, sobald einer der Test-Methoden fehlschlägt.

Hintergrund

Wozu braucht man so etwas?

Wir haben einen Integrationstest, der einen gesamten Workflow abbildet. Die Einzelschritte sind jeweils als eigene Test-Methoden implementiert.
Mittels Order-Annotation werden sie in einer festgelegten Reihenfolge ausgeführt. Natürlich könnten wir auch alle Schritte in eine einzige Test-Methode packen, dann würde auch beim ersten Fehler abgebrochen. Nachteil wäre hier aber, dass wir den Fortschritt nur übers Logging sehen könnten.
Indem wir jeden Schritt als einzelne Test-Methode abbilden, sehen wir direkt in der Entwicklungsumgebung, in welchem Schritt wir uns befinden. Nun macht es aber keinen Sinn, die weiteren Test-Methoden des Integrationstests auszuführen, wenn ein vorhergehender Schritt fehlschlägt. Daher wollen wir in diesem Fall die Ausführung der weiteren Integrationstest-Schritte überspringen.

 

Herausforderung

Um dies zu realisieren, wollen wir natürlich nicht in jede Test-Methode immer wieder denselben Code einbauen: Per Assumption abfragen, ob bereits ein Fehler aufgetreten ist, Abfangen von Fehlern, Setzen eines Merkers für die Assumption.

 

Lösung

Daher erstellen wir einfach eine eigene kleine Extension. In dieser implementieren wir das Interface BeforeEachCallback. Dadurch haben wir auch die Methode beforeEach zur Verfügung. In dieser können wir eine Assumption einbauen, welche die aktuelle Test-Methode überspringt, wenn ein Fehler-Flag gesetzt ist. Nun müssen wir noch das Fehler-Flag setzen. Dazu implementieren wir zusätzlich das TestWatcher-Interface. Mit diesem können wir die Testausführung überwachen. Wirklich interessant sind für uns hier nur die Methoden testAborted und testFailed. Hier setzen wir jeweils einfach das Flag anyFailed auf true.

Die Verwendung der Extension ist denkbar einfach. In jeder Unit-Test-Klasse, wo dieses Verhalten gewünscht ist, können wir nun einfach die Extension mit @ExtendsWith hinzufügen:

 


JUnit 5 Assumptions

JUnit 5 TestWatcher Javadoc

Baeldung – Artikel zu JUnit 5 TestWatcher API

Zurück zur Übersicht

Kommentar verfassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

*Pflichtfelder

*