JUnit 5 mit Nicolai Parlog

Am 19.1. war Nicolai Parlog bei der Java User Group in Darmstadt und hat einen Vortrag zum Thema JUnit 5 gehalten bei dem er die Neuerungen von JUnit vorgestellt hat.

JUnit 5
Los ging es mit „Basisänderungen“:

  • Man kann bei einem Test die Paket-Sichtbarkeit weglassen .
  • Bei den Lifecycle-Methoden gibt es andere Annotationen.
  • @Ignored, heißt jetzt @Disabled und hat einen Text.
  • Man kann eigenen Annotationen über die Extention-Points definieren.
  • Bei assertEquals ist die Message jetzt der letzte Parameter.
  • Mit Lambdas lässt sich beim assertEquals die Message erst dann erstellen, wenn sie notwendig ist (lazy).
  • Es gibt ein @assertAll mit dem sich mehrere Dinge überprüfen lassen und der Test bricht nicht nach dem ersten Fehler eines assertEquals() ab.
  • Es gibt ein assertThrows, um den Type der Exception zu überprüfen.
  • Es gib die Annotation @Nested, um Tests für innere Klassen zu organisieren.
  • Man kann Tests mit @DisplayName einen Namen geben, der angezeigt wird.
  • Man kann Tests Parameter übergeben, die mit Test-Factories erstellt werden.

Nachdem die Basis-Neuerungen vorgestellt waren, ist Nicolai auf dynamische Tests eingegangen. D.h. Tests, die zur Laufzeit erstellt werden. Um dynamische Tests zu erstellen, gibt es die Annotation @TestFactory.
Damit lassen sich parametrisierte Tests erstellen, bei denen die Parameter im Quellcode oder auch in einer Datei liegen können. Und man kann natürlich Lambdas verwenden. Wobei das Feature aktuell noch nicht ganz fertig ist.
Der nächste Punkt, auf den Nicolai eingegangen ist, waren die Extensions.
Bei JUnit 5 gibt es zahlreiche Extension Points an denen man Erweiterungen definieren kann. Beispielsweise, um Dinge vor jedem und nach jedem Test auszuführen. Oder um Parameter zu übergeben oder eigene Annotation zu definieren, so dass Tests nur unter bestimmten Bedingungen ausgeführt werden. Außerdem gibt es einen Extension Store, der hierarchisch und mit Namespaces, einfache Key-Value-Paare speichern kann, so dass man Werte zwischenspeichernd kann, aber die Tests weiterhin stateless sind. Zusätzlich wurden Meta-Annotationen eigeführt, um Tests noch verständlicher zu machen.

JUnit 5
Eine der wichtigsten Neuerungen bei JUnit 5 sind die Änderungen an der Architektur. Das hat Nicolai besonders betont. Die bisher beschriebenen Änderungen sind schön und auch hilfreich, aber dafür hätte man keine neue Major-Version veröffentlichen müssen. Aber die Änderungen an der Architektur bringt JUnit als Plattform weiter voran.
Problem war bisher oft, das die Tools und die IDEs sich auf Schnittstellen von Junit verlassen haben und dadurch Änderungen an JUnit selbst schwierig waren. Das sollte durch die neue Architektur korrigiert werden.
Die Idee ist, dass die Tests gegen eine API geschrieben werden (JUnit-Jupiter API) und es dann eine Engine gibt, die die Tests ausführt. Und zusätzlich eine JUnit-Platform Engine und einen JUnit-Platform Runner über den die IDE und die Tools die Tests ausführen. Durch diese Architektur wird es relativ einfach neue Testframeworks zu entwickeln, weil sie direkt auch von den IDEs unterstützt werden und dadurch überhaupt erst die Chance haben, benutzt zu werden und sich durchzusetzen.
Abschliessend ist Nicolai noch auf den aktuellen Stand der IDE und Tool-Unterstützung eingegangen.
Alle IDEs bis auf Netbeans arbeiten an einer Unit 5 Unterstützung. Auch die Gradle- und Maven-Unterstützungen sind in Arbeit.
Aus meiner Sicht wird es eine Reihe interessanter Features mit JUnit 5 geben und ich bin schon auf das Release gespannt.
Viele Dank an Nicolai für die tolle Übersicht und den Vortrag!

Die Folien gibt es hier

Und wer den Vortrag verpasst hat, kann sich eine Aufzeichnung von der Devoxx hier ansehen:

Kommentare sind abgeschaltet.