<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=JUnit_5</id>
	<title>JUnit 5 - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://mletkin.net/index.php?action=history&amp;feed=atom&amp;title=JUnit_5"/>
	<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=JUnit_5&amp;action=history"/>
	<updated>2026-05-06T17:01:14Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in MimiPedia</subtitle>
	<generator>MediaWiki 1.39.4</generator>
	<entry>
		<id>https://mletkin.net/index.php?title=JUnit_5&amp;diff=121&amp;oldid=prev</id>
		<title>Ullrich: Die Seite wurde neu angelegt: „Category:Java Category:junit Das Test-Framework bietet den Rahmen in dem die Unit-Tests geschrieben werden. Es führt die Unit-Tests aus und stellt die…“</title>
		<link rel="alternate" type="text/html" href="https://mletkin.net/index.php?title=JUnit_5&amp;diff=121&amp;oldid=prev"/>
		<updated>2023-05-06T18:29:03Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „&lt;a href=&quot;/index.php?title=Kategorie:Java&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;Kategorie:Java (Seite nicht vorhanden)&quot;&gt;Category:Java&lt;/a&gt; &lt;a href=&quot;/index.php?title=Kategorie:Junit&quot; title=&quot;Kategorie:Junit&quot;&gt;Category:junit&lt;/a&gt; Das Test-Framework bietet den Rahmen in dem die Unit-Tests geschrieben werden. Es führt die Unit-Tests aus und stellt die…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;[[Category:Java]]&lt;br /&gt;
[[Category:junit]]&lt;br /&gt;
Das Test-Framework bietet den Rahmen in dem die Unit-Tests geschrieben werden. Es führt die Unit-Tests aus und&lt;br /&gt;
stellt die Ergebnisse bereit, die dann von Eclipse, Jenkins oder Sonar ausgewertet und dargestellt werden.&lt;br /&gt;
&lt;br /&gt;
Neben JUnit – in der damaligen Version 4 – begann sich TestNG zunächst als Alternative zu etablieren. Doch&lt;br /&gt;
während JUnit kontinuierlich weiterentwickelt wurde und mit JUnit 5 eine bemerkenswerte Erweiterung erfuhr,&lt;br /&gt;
scheinen sich die Aktivitäten um TestNG mehrheitlich im Sande verlaufen zu haben. Das muß nicht so bleiben,&lt;br /&gt;
TestNG kann – wie auch Junit 4 – weiterhin als Test-Framework eingesetzt werden, aktuell wird jedoch die Nutzung&lt;br /&gt;
von JUnit 5 empfohlen. Vor allem die Möglichkeiten, gleichartige Tests als parametrisierte Tests&lt;br /&gt;
zusammenzufassen oder über eine Test-Factory erzeugen zu lassen kann eine Menge Tipp-Arbeit ersparen.&lt;br /&gt;
&lt;br /&gt;
Diese Einführung beschreibt zunächst die grundlegenden Komponenten von Unit-Tests für tiefergehende Details&lt;br /&gt;
sei auf die [https://junit.org/junit5/docs/current/user-guide/ JUnit5-Dokumentation] verwiesen.&lt;br /&gt;
= Test-Aufbau =&lt;br /&gt;
== Die Test-Klasse ==&lt;br /&gt;
Die Test-Klasse wird durch rechts-Klick auf die zu testende Klasse und anschließende Auswahl von &amp;quot;New JUnit Test Case&amp;quot; erzeugt.&lt;br /&gt;
Das funktioniert bei allen Frameworks im Prinzip genauso. Das Ergebnis ist eine ganz gewöhnliche Klasse; daß es sich um eine Test-Klasse handelt,&lt;br /&gt;
erkennt JUnit daran, daß sie mindestens eine Test-Methode&lt;br /&gt;
enthält. Bei Bedarf kann der Klasse per @DisplayName eine Beschreibung mitgegeben werden, die in der&lt;br /&gt;
Auswertung anstelle des Klassennamen auftaucht.&lt;br /&gt;
{{java|code=&lt;br /&gt;
import org.junit.jupiter.api.DisplayName;&lt;br /&gt;
import org.junit.jupiter.api.Test;&lt;br /&gt;
&lt;br /&gt;
@DisplayName(&amp;quot;Tests für Datumskonverierung&amp;quot;)&lt;br /&gt;
public class ConvertTest {&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Der Name der kann zwar völlig beliebig gewählt werden, doch gehen Maven-Plugins wie surefire in der Regel von&lt;br /&gt;
bestimmten Namenskonventionen aus. Unit-Test-Klassen enden bei uns daher immer mit dem Suffix Test.&lt;br /&gt;
&lt;br /&gt;
== Die Test-Methode ==&lt;br /&gt;
Eine Test-Methode hat keine Parameter, liefert {{java|void}} als Ergebnis und ist mit {{java|@Test}} annotiert. Auch ihr kann&lt;br /&gt;
per {{java|@DisplayName}} eine Beschreibung mitgegeben werden, die in der Auswertung anstelle des Methodennamen auftaucht&lt;br /&gt;
{{java|code=&lt;br /&gt;
@Test&lt;br /&gt;
@DisplayName(&amp;quot;localDate wird nach Date konvertiert&amp;quot;)&lt;br /&gt;
void test4711() {&lt;br /&gt;
    // ...&lt;br /&gt;
}&lt;br /&gt;
}}&lt;br /&gt;
Mit Ausnahme von private ist jede Sichtbarkeit erlaubt, &amp;quot;package visible&amp;quot; bedeutet dabei den wenigsten Schreibaufwand.&lt;br /&gt;
Was die Frameworks unmittelbar von einander unterscheidet ist das Import-Statement. Für JUnit 5 muß es lauten&lt;br /&gt;
{{java|code=import org.junit.jupiter.api.Test;}}&lt;br /&gt;
Methoden ohne @Test-Annotation werden vom Test-Runner ignoriert – sie sind ganz gewöhnliche Methoden.&lt;br /&gt;
Neben den einfachen Tests gibt es&lt;br /&gt;
*parametrisierte Test, hier werden unterschiedliche Daten mit der gleichen Test-Methode ausgeführt&lt;br /&gt;
*dynamische Tests, hier wird eine Factory definiert, die Test-Fälle generiert&lt;br /&gt;
*wiederholte Tests, hier werden einfache Tests mehrmals ausgeführt&lt;br /&gt;
Eine Einführung in parametrisierte Tests gibt es hier(see page 10). Für die anderen Test-Arten sei auf die JUnit5-Doku2&lt;br /&gt;
verwiesen. Dynamische Tests sind aktuell noch als &amp;quot;experimentell&amp;quot; markiert.&lt;br /&gt;
&lt;br /&gt;
== viele, viel Tests ==&lt;br /&gt;
Clean-Code-Regeln verlangen, für jeden Test -- und Test ist hier wirklich &amp;quot;so klein wie möglich&amp;quot; zu verstehen -- eine eigene&lt;br /&gt;
Test-Methode anzulegen, mit genau einem Test also einer Assertion.&lt;br /&gt;
Das führt in der Realität zu viel Code und viel Wiederholung, was sich mit Clean Code auch wieder nicht verträgt.&lt;br /&gt;
Um das zu vermeiden bietet JUnit5 sehr mächtige [[Parametrisierte Tests]].&lt;br /&gt;
&lt;br /&gt;
== Vorbereitung – Nachbereitung ==&lt;br /&gt;
Ist es nötig vor bzw. nach den Tests Aktionen durchzuführen, werden dafür Methoden definiert und entsprechend&lt;br /&gt;
annotiert. Dabei gibt es zwei Situationen die im Folgenden beschrieben werden. Alle vier Annotationen werden&lt;br /&gt;
vererbt und können überschrieben werden. Sie können auch bei default-Methoden von Interfaces verwendet&lt;br /&gt;
werden, was die Möglichkeit eröffnet, mehrere inhaltlich getrennte Aktionen an eine Testklasse zu heften.&lt;br /&gt;
=== Einmal für alle Tests ===&lt;br /&gt;
Sind die Aktionen nur einmal für die gesamte Test-Klasse durchzuführen verwendet man diese Annotationen:&lt;br /&gt;
:{{java|@BeforeAll}} wird ausgeführt, bevor der erste Test der Klasse ausgeführt wird&lt;br /&gt;
:{{java|@AfterAll}} wird ausgeführt, nachdem der letzte Test der Klasse ausgeführt wurde&lt;br /&gt;
Die so annotierte Methode muß statisch sein und void liefern, in der Regel haben sie auch keine Parameter.&lt;br /&gt;
&lt;br /&gt;
=== Für jeden Tests ===&lt;br /&gt;
Sind die Aktionen für jeden einzelnen Test der durchzuführen verwendet man diese Annotationen:&lt;br /&gt;
:{{java|@BeforeEach}} wird ausgeführt, bevor ein Test der Klasse ausgeführt wird&lt;br /&gt;
:{{java|@AfterEach}} wird ausgeführt, nachdem ein Test der Klasse ausgeführt wurde&lt;br /&gt;
Die so annotierte Methode muß statisch sein und void liefern, in der Regel haben sie auch keine Parameter.&lt;br /&gt;
Die Methoden werden nicht nur vor jeder Test-Methode ausgeführt, sondern vor jedem Tests.&lt;br /&gt;
Das macht bei Einzel-Tests keinen Unterschied, bedeutet aber, daß die Methoden jeden Einzeltests eines&lt;br /&gt;
parameterisierten Tests und jeden Einzeltest aus einer Test-Factory umrahmen können.&lt;br /&gt;
&lt;br /&gt;
= Tests überspringen =&lt;br /&gt;
Um einen Test zu überspringen, setzt man die Annotation @Disabled vor die @Test-Annotation.&lt;br /&gt;
Mit @Disabled kann auch die Test-Klasse annotiert werden, dann werden alle Tests der Klasse ignoriert.&lt;br /&gt;
=Assertions=&lt;br /&gt;
Junit5 bietet – wie Junit4 – die Klasse Assertions mit einer ganzen Reihe von Assertion-Methoden an. Die&lt;br /&gt;
Features wurden aber nicht weiter ausgebaut. Daher werden die JUnit-Assertions hier nicht beschrieben.&lt;br /&gt;
Stattdessen wird der Einsatz von AssertJ empfohlen und auf die entsprechende Wiki-Einführung(see page 14)&lt;br /&gt;
verwiesen. AssertJ ist wesentlich mächtiger und die Notation ist wesentlich leichter und schneller zu lesen, was für&lt;br /&gt;
die unerläßliche Pflege der Unit-Tests unabdingbar ist.&lt;br /&gt;
= Migration =&lt;br /&gt;
Vorhandene JUnit4-Tests lassen sich mit dem Legacy-Runner der JUnit5-Engine ausgeführt werden ohne daß Änderungen erforderlich sind.&lt;br /&gt;
Das bietet die Möglichkeit, mit den alten Tests zu starten und diese dann schrittweise umzustellen.&lt;br /&gt;
Für TestNG-Tests gilt das leider nicht. Um einen JUnit4-Test in eine JUint5-Test umzuwandeln sind&lt;br /&gt;
jedoch einige Änderungen nötig:&lt;br /&gt;
* Die Annotationen, Assertions- und Assumptions-Klasse liegen nun im package&lt;br /&gt;
:{{java|org.junit.jupiter.api}}&lt;br /&gt;
*die Before/After[Class]-Annotationen müssen auf die oben beschriebenen Annotationen umgestellt werden&lt;br /&gt;
*JUnit4-Rules werden nicht mehr unterstützt und müssen in das neue Extension-Modell überführt werden.&lt;br /&gt;
*{{java|@Ignore}} muß durch {{java|@Disabled}} ersetzt werden&lt;br /&gt;
*{{java|@Category}} muß duch {{java|@Tag}} ersetzt werden&lt;br /&gt;
Weitere Details finden sich in der JUnit5-Doku4.&lt;/div&gt;</summary>
		<author><name>Ullrich</name></author>
	</entry>
</feed>