Marc Philipp Selbstständig

An JUnit 5 wurde vor der Veröffentlichung von Version 5.0 fast zwei Jahre entwickelt. Der aktuelle Stand erfüllt die meisten Anforderungen, die wir heutzutage an ein modernes Testing-Framework haben. Die neue JUnit Platform bietet sehr gute Integration in IDEs und Build-Tools und erlaubt uns gleichzeitig sowohl JUnit 3/4, Jupiter als auch andere Testing- Frameworks zu verwenden. Zum Einstieg gibt es neben dem User Guide eine ganze Reihe von Beispielprojekten für alle gängigen Build-Tools.

Im September 2017 wurde die Version 5.0 von JUnit nach fast zweijähriger Entwicklung endlich fertiggestellt. Das JUnit-Team hat die Arbeit danach jedoch keineswegs eingestellt, sondern neben einigen Bugfix-Releases mittlerweile drei neue Featurereleases veröffentlicht.

Nach einer kurzen Einführung in das neue Programmiermodell für Tests konzentrieren wir uns in diesem Artikel auf die Neuerungen in den Featurereleases (zum Beispiel Kotlin-Support, Tag Expressions und parallele Testausführung) und lernen, dass JUnit 5 viel mehr ist, als ein Testing-Framework für Java.

Das neue Programmiermodell

Das mit JUnit 5.0 vorgestellte neue Programmiermodell zum Schreiben von Tests und Erweiterungen trägt den Namen JUnit Jupiter API. Da das JUnit-Team bezweckt, dieses API über mehrere Major-Versionen hinweg weiterzuentwickeln, enthält der Name bewusst keine Versionsnummer. Eine kleine Referenz zur Zahl Fünf gibt es dennoch, denn Jupiter ist, von der Sonne aus gezählt, der fünfte Planet in unserem Sonnensystem.

Am besten lässt sich das neue Programmiermodell anhand eines Beispiels erklären. Dazu betrachten wir Unit -Tests für eine Calculator-Klasse, die einen einfachen Taschenrechner repräsentiert (Listing 1). Eine Calculator-Instanz hat jederzeit einen aktuellen Wert, der durch Anwendung einer Rechenoperation, d.h. den Aufruf einer Methode, modifiziert wird. Alle Codebeispiele in diesem Artikel sind auf GitHub verfügbar.

import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.Tag;
import org.junit.jupiter.api.Test;
import java.math.BigDecimal;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;

class CalculatorTests {

  private Calculator calculator;

  @BeforeEach
  void createCalculator() {
    calculator = new Calculator();
  }

  @Test
  @DisplayName("1 + 1 = 2")
  @Tag("addition")
  void onePlusOneIsTwo() {
    long newValue = calculator.set(1).add(1).longValue();

    assertEquals(2, newValue);
  }

  @Test
  @DisplayName("(2 * 3) / 4 = 6/4 = 3/2 = 1.5")
  @Tag("multiplication")
  @Tag("division")
  void divideResultOfMultiplication() {
    BigDecimal newValue = calculator.set(2).multiply(3).divide(4).get();

    assertEquals(new BigDecimal("1.5"), newValue);
  }

  @Test
  @Tag("input-validation")
  void cannotSetValueToNull() {
    IllegalArgumentException exception
      = assertThrows(IllegalArgumentException.class, () -> calculator.set(null));

    assertEquals("cannot set value to null", exception.getMessage());
  }
}

Auf den ersten Blick sieht die Testklasse sehr ähnlich aus wie eine, die auf JUnit 4 basiert. So werden Testmethoden weiterhin mit @Test annotiert. Auf den zweiten Blick fällt allerdings auf, dass die Annotationen nun aus dem org.junit.jupiter.api-Package und nicht aus org.junit importiert werden. Des Weiteren müssen Testklassen und -methoden in Jupiter nicht mehr public sein, die Standardsichtbarkeit genügt.

Wie man anhand der createCalculator()-Methode sehen kann, gibt es weiterhin eigene Annotationen für Methoden der Testklasse, die am Lebenszyklus eines Tests teilnehmen möchten. Allerdings haben sie leicht andere Namen als in JUnit 4 (zum Beispiel @BeforeEach statt @Before).

Wie die onePlusOneIsTwo()-Methode zeigt, ist man beim Benennen der Tests nun nicht mehr auf die Syntax von Methodennamen in Java beschränkt, sondern kann mit Hilfe der @DisplayName-Annotation beliebige Zeichenketten verwenden. Dennoch kann man in IDEs direkt von dem Eintrag im Testbaum zur Methode navigieren.

Den vollständigen Artikel lesen Sie in der Ausgabe:

Java Magazin 3.19 - "Chaos Engineering"

Alle Infos zum Heft
579878102Neues von JUnit
X
- Gib Deinen Standort ein -
- or -