JUnit 5 setzt auf Java 8 und verbessert die Anbindung von Erweiterungen
Die aktuelle Version des Java-Test-Frameworks besteht aus mehreren Modulen, die in drei Unterprojekte aufgeteilt sind, mit denen sich Tests flexibler handhaben lassen. Außerdem haben die Macher die Anbindung von Erweiterungen grundlegend geändert.
Nach fast zwei Jahren Entwicklungsarbeit ist nun JUnit 5 erschienen. Die Macher haben das Java-Test-Framework von Grund auf neu entwickelt, um Altlasten abzustoßen. Dazu gehört vor allem die problematische Erweiterung von JUnit 4 durch Runner auf der einen und Rules auf der anderen Seite. Außerdem setzt das Framework nun auf Java 8 als zugrunde liegende Plattform. So lassen sich unter anderem Lambdas verwenden
Anders als der Vorgänger ist JUnit 5 nun modular aufgebaut. Es besteht aus den drei Unterprojekten Platform, Jupiter und Vintage. JUnit Platform ist die Grundlage zum Start von Tests und soll die Brücke zu Build-Werkzeugen und Entwicklungsumgebungen bilden. Über das Interface TestEngine bietet sie eine API zum Entwickeln von Tests. Schließlich bietet sie die Möglichkeit, ein Konsolenfenster zu öffnen, um Tests von der Kommandozeile anzustoßen. Es gibt auch JUnit-4-basierte Runner. Das Unterprojekt JUnit Vintage bietet zudem eine TestEngine, die passend zum Namen Tests ermöglicht, die auf JUnit 3 oder 4 basieren.
Flexible Erweiterung
JUnit Jupiter verbindet das Programmiermodell von JUnit 5 mit dem neuen Erweiterungsmodell. Letzteres ist wohl die spannendste Neuerung und war eine wesentliche Motivation für das Team, das Basissystem neu zu entwickeln: JUnit 4 bietet die beiden konkurrierende Erweiterungsmöglichkeiten Runner und Rules, die unterschiedliche Stärken und Schwächen haben und eben nicht einheitlich und beliebig austauschbar sind.
Stattdessen kennt JUnit 5 eine einheitliche Extension-API. Entwickler können Erweiterungen über @ExtendWith registrieren und dabei mehrere Extensions miteinander verknüpfen:
@ExtendWith({ FooExtension.class, BarExtension.class })
class MyTests {
// ...
}
Neben dieser deklarativen Erweiterung bietet JUnit Jupiter die Option der Registrierung von Erweiterungen über java.util.ServiceLoader, um die passenden Erweiterungen direkt aus dem classpath zu laden. Die Extension-API bietet zudem mit ExecutionCondition eine Möglichkeit, Bedingungen für die Ausführungen von Tests zu definieren. Zudem besitzen Tests einen wohldefinierten Lebenszyklus, der aus den folgenden Schritten besteht:
- BeforeAllCallback
- BeforeEachCallback
- BeforeTestExecutionCallback
- AfterTestExecutionCallback
- AfterEachCallback
- AfterAllCallback
Entwicklungsumgebungen und Build-Werkzeuge
Java 2017
Mehr Informationen zu JUnit 5 sowie zu Java 9, Java EE 8 und aktuellen Entwicklungen im Java-Umfeld gibt es in dem iX-Developer-Sonderheft, das unter anderem im heise Shop erhältlich ist.
IntelliJ IDEA arbeitet bereits seit Version 2016.2 mit JUnit 5 zusammen. JetBrains liefert das Framework als Bestandteil der IDE aus, aber Entwickler können manuell neuere Varianten installieren. Eclipse Oxygen (4.7) hat die Unterstützung noch als Beta-Funktion gekennzeichnet. Bereits beim Release der IDE im Juni kündigten die Entwickler des Werkzeugs aber vollständigen Support an, sobald die fertige Version erscheint. Für Gradle haben die JUnit-Macher ein rudimentäres Plug-in veröffentlicht, und für Maven existiert ein Tool zur Anbindung über Surefire.
Weitere Details lassen sich dem GitHub-Repository sowie der ausführlichen Dokumentation von JUnit 5 entnehmen. Ersteres enthält zudem den Quellcode, Letztere Hinweise zur Migration von älteren JUnit-Versionen. Aufgrund der Umstellung benötigt das Release mindestens Java 8. Entwickler können es aber freilich zum Testen von Anwendungen verwenden, die für ältere JDKs kompiliert sind. (rme)