JUnit ist seit 20 Jahren DER Standard für automatisiertes Testen in Java. Im dritten Quartal 2017 soll JUnit 5 erscheinen. Es soll die Vorteile von Java 8, vor allem die Lambda-Ausdrücke, voll ausnutzen. Dazu wurde in JUnit 5 auf eine erweiterungsfähige Architektur sowie eine komplett neue Code-Basis und Paketstruktur gesetzt. Es gibt neue Features und viele bekannte Annotationen haben einen prägnanteren Namen bekommen.
In Blogs und Tweets findet man zahlreiche Gegenüberstellungen und Zusammenfassungen dazu. Diese hier ist gut gelungen:
Die wichtigsten Änderungen in #JUnit5 auf einen Blick https://t.co/JboAXgVAeZ
— Tobias Voß (@tobiaslvoss) 16. Mai 2017
Von einem Kollegen wurde ich kürzlich danach gefragt, welches die drei wichtigsten Neuerungen in JUnit 5 sind. Hier sind sie – natürlich aus meiner persönlichen Sichtweise. Eine komplette Übersicht über alle Neuerungen finden Sie in unserem kostenlosen Whitepaper.
Strukturierte Testfälle mit @Nested
Eines der neuen und überaus nützlichen Features ist die @Nested
-Annotation, mit der Testklassen hierarchisch strukturiert werden können. Die Annotation kann an inneren Klassen einer Testklasse verwendet werden und führt zu einer hierarchischen Aufbereitung im Testergebnis. Damit lassen sich die Testfälle gemäß der Haupteigenschaften der zu testenden Klasse strukturieren und die Übersichtlichkeit der Tests wird erhöht. Außerdem lassen sich auch @BeforeEach
und @AfterEach
innerhalb geschachtelter Testklassen verwenden, sodass der benötigte Testkontext unterschiedlich aufgebaut werden kann.
Die Abbildung zeigt die Aufbereitung eines Testergebnisses unter Verwendung der @Nested
-Annotation. Durch @DisplayName
wird eine kurze inhaltliche Beschreibung des Testfalls ausgegeben, sodass die ausgeführten Testfälle nicht nur in ihrer Struktur, sondern auch in ihrer Bedeutung direkt verständlich sind. Die Annotation @DisplayName
ist ebenfalls neu und bietet die Möglichkeit, Testfälle mit einem sprechenden Anzeigenamen zu benennen, der auch Leerzeichen, Sonderzeichen und sogar Emojis enthalten darf.
Dynamische Testfälle mit @TestFactory
Ein schöner Anwendungsfall für Lambda-Ausdrücke ist die Möglichkeit, mit JUnit 5 dynamisch Testfälle zur Laufzeit zu erzeugen, zum Beispiel auf Basis einer Menge von Eingabeparametern. Dadurch lässt sich eine Menge Boilerplate-Code in den Testklassen vermeiden. Hier ein Beispiel für den Test repräsentativer gültiger Werte für Auszahlungsbeträge eines Geldautomaten. Aus dem Stream mit sechs Elementen werden zur Laufzeit sechs Testfälle generiert, die alle überprüfen, dass die Auszahlung erfolgreich ist. Analoge Testmethoden lassen sich auch für die anderen Äquivalenzklassen bilden.@TestFactory Stream<DynamicTest> testGueltig() { return Stream.of(10, 50, 100, 200, 5, 500) .map(i -> dynamicTest("Wert=" + i, () -> assertTrue(geldautomat.auszahlen(i)))); }
Parallelbetrieb mit JUnit 4
Die wenigsten Projekte starten auf der grünen Wiese und können komplett auf JUnit 5 setzen. Auch eine Migration aller Testfälle von Version 4 auf 5 wird bei Betrachtung des Kosten-Nutzen-Verhältnisses für die wenigsten Anwender infrage kommen. Deswegen ist der Parallelbetrieb beider Versionen in einem Projekt notwendig. Dafür bietet JUnit optimale Unterstützung in zwei Varianten. JUnit5 kann in Version 4 geschriebene Testfälle über die junit-vintage-engine ausführen. Und JUnit5 bringt mit dem junit-platform-runner einen Adapter mit, um sich für IDEs und Build-Werkzeuge wie JUnit4 zu verhalten.
Ein gelungenes Release mit vielen weiteren Verbesserungen
Es ist positiv überraschend, wie viel Potenzial auch nach 20 Jahren in einem neuen Release von JUnit steckt. Die neue Version ist sehr gelungen und bietet einige interessante Features durch die konsequente Nutzung von Lambda-Ausdrücken. Angesichts von zwei Varianten für den Parallelbetrieb mit der Vorversion ist eine sanfte Migration auch bei bestehenden Projekten möglich. Neben den drei genannten Highlights hat das Entwicklerteam viele weitere Verbesserungen eingebaut und auch unter der Haube ordentlich umgebaut. Die modulare Architektur verspricht eine gute Wartbarkeit für die Zukunft. Und mit dem einheitlichen Erweiterungsmodell wird die Integration anderer Testwerkzeuge verbessert und die Nutzung von JUnit als Plattform vereinfacht.
zurück zur Blogübersicht