JUnit 5 – Die neue Generation des Unit-Testens steht in den Startlöchern

Montag, 19.6.2017

JUnit5_Testautomatisierung.jpg

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:

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.

kostenloser Download

 

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.

JUnit5_Nested_Annotation_DisplayName.png

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))));
}
  JUnit5_TestFactory.jpg

 

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.

JUnit5-Architektur.jpg

 

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

Diese Beiträge könnten Sie ebenfalls interessieren

Keinen Beitrag verpassen – viadee Blog abonnieren

Jetzt Blog abonnieren!

Kommentare

Tobias Voß

Tobias Voß

Tobias Voß arbeitet als IT-Architekt in agilen Projekten bei der viadee. Er berät Kunden im Versicherungs- und Bankenumfeld bei der Umsetzung individueller Softwaresysteme mit den Schwerpunkten Java, Architektur und Prozessautomatisierung und leitet den Kompetenzbereich Java & Architektur der viadee.

Tobias Voß bei Xing  Tobias Voß auf Twitter