Einstieg in JUnit 5

Bereits vor einiger Zeit – im September 2017 – ist JUnit 5 erschienen und damit eine von Grund auf überarbeitete Version des Unit-Test-Frameworks.

Dieser Beitrag soll einen tieferen Einblick bieten, insbesondere für diejenigen, die noch mit JUnit 4 (oder sogar JUnit 3) arbeiten und erkennen werden, dass ohne große Hindernisse auf JUnit 5 gewechselt werden kann, ohne alte Tests direkt migrieren zu müssen.

Überblick

Hin und wieder kommt es vor, dass JUnit 5 und JUnit Jupiter synonym verwendet werden. Das ist nicht ganz korrekt, denn JUnit 5 besteht aus drei Teilen, von denen Jupiter nur einer ist:

Überblick der JUnit-5-Architektur

JUnit Jupiter:
Die API, gegen die wir unsere Tests schreiben und eine Implementierung der JUnit Platform Engine API, die die Tests durchführt.

JUnit Vintage:
Eine Engine-Implementierung, die es erlaubt Tests, die für JUnit 4 oder JUnit 3 geschrieben wurden, auszuführen.

JUnit Platform:
Die bereits genannte API, die alle TestEngines implementieren müssen.

Dependencies mit Gradle und Maven

Aus der veränderten Struktur und der Möglichkeit, alte Tests mit der Vintage Engine auszuführen, ergeben sich mehrere Optionen, ein Projekt mit Gradle oder Maven aufzusetzen.

Die alten JUnit 4 oder JUnit 3 Tests lassen sich mit entsprechender Konfiguration ohne Probleme ausführen, was eine Kombination aus bestehenden, alten Tests und neuen, mit JUnit 5 geschriebenen, ermöglicht.

Gradle

Einfache Konfiguration für Gradle 4.6 Expand source
Inklusive Vintage Konfiguration für Gradle 4.6  Expand source

Maven

Einfache Konfiguration für Maven Expand source
Inklusive Vintage Konfiguration für Maven Expand source

Unterschiede zu JUnit 4

Wenn bereits mit JUnit 4 gearbeitet wurde, ist der Einstieg in JUnit 5 nicht schwer. Es gibt dennoch einige Änderungen – aber vor allem auch Neuerungen, die beachtet werden sollten.

Annotationen

In diesem Artikel wird nicht auf sämtliche Annotationen eingegangen. Hier nicht aufgeführte Annotationen wie @TestFactory oder @ExtendWith werden Bestandteil eines folgenden Artikels.

JUnit 4
JUnit 5
Anmerkungen
@Test @Test
  • Deklariert eine Testmethode
  • Keine Attribute mehr (exception, timeout);
    stattdessen über Assertions innerhalb der Testmethode
@BeforeClass @BeforeAll
@AfterClass @AfterAll
@Before @BeforeEach
@After @AfterEach
@Ignored @Disabled
  • Mit Annotationen aus dem Package org.junit.jupiter.api.condition
    lassen sich darüber hinaus Tests unter bestimmten Bedingungen
    verhindert oder explizit ausgeführt werden
@Category @Tag
  • Ermöglicht das Filtern von Tests bspw. über Gradle oder Maven
@Tags
  • Alternative zur mehrfachen Nutzung von @Tag
@DisplayName
  • Erlaubt lesbare Bezeichnungen von Tests

@Test

Viele Änderungen gibt Beispiel bei den Annotationen, von denen @Test die wohl wichtigste ist. Hier fehlen die alten Attribute expected und timeout, die jetzt mithilfe der Assertions assertThrows und assertTimeout definiert werden.

Neues @Test Expand source

Insbesondere das neue Exception-Testing dürfte hier interessant sein. Eine Exception ist in JUnit 5 „nur“ eine weitere Assertion unter vielen und kann in beliebiger Häufigkeit im Test vorkommen. Wenn weitere Bestandteile der Exception geprüft werden sollen, wie z.B. die Message, ist auch das ohne weiteres möglich, da assertThrows die geworfene Exception zurückgibt und somit alle nötigen Informationen zur Verfügung stehen, um weitere Annahmen zu testen.

@Disabled

Die neue Annotation @Disabled ersetzt das bisherige @Ignored. Gänzlich neu sind wohl die Annotationen des Packages org.junit.jupiter.api.condition, die es erlauben, unter bestimmten Bedingungen Tests nicht auszuführen oder überhaupt erst ausführen zu lassen.

@Disabled und konditionales disabled / enabled Expand source

@Tag

@Tag ersetzt die alte Annotation @Category aus dem experimental Package. Sie lässt sich bei Bedarf entweder wiederholen oder durch @Tags ersetzen.

Neue @Tag Annotation Expand source

Die gesetzten @Tag Annotationen lassen sich dann beispielsweise über Gradle oder Maven herausfiltern.

Die oberen Tests lassen sich mit folgender Gradle-Konfiguration und entsprechenden Command Line Befehlen ausführen:

Gradle (mindestens Version 4.6) Test Konfiguration Expand source

Fazit

JUnit 5 bietet eine vollständige Überarbeitung des beliebten Unit-Testing-Frameworks, die überzeugt. Es ist möglich, gut strukturierte, leicht lesbare Tests zu schreiben und die gut durchdachte Architektur erlaubt es leicht Anpassungen vorzunehmen oder die Jupiter-Engine komplett zu ersetzen.