Empfohlenes Webinar: KI-gestütztes API-Testing: Ein No-Code-Ansatz zum Testen | Zum Video

Nutzen Sie die Vorteile von JUnit 5

Kopfschuss von Brian McGlauflin,
6. Mai 2020
8 min lesen

Neben der Unterstützung von Entwicklern bei der Implementierung von Unit-Tests in Java und der Verbesserung der Programmiergeschwindigkeit bietet JUnit-Testing viele Vorteile. In diesem Beitrag werden Sie durch diese Vorteile geführt und erfahren, warum Sie JUnit-Tests für Ihre Entwicklung verwenden sollten.

Eine Version dieses Artikels wurde erstmals auf der Website veröffentlicht Oracle-Blog.

Es ist ein paar Jahre her seit der Veröffentlichung von Einheit 5. Wenn Sie es noch nicht für Ihre Entwicklungstests verwendet haben, sollten Sie dies tun. JUnit 5 bietet eine Vielzahl neuer Funktionen und Verbesserungen, mit denen Sie Zeit und Kopfschmerzen sparen können. Lassen Sie uns einen Blick darauf werfen, wie Sie mit JUnit 5 beginnen, um die Vorteile der neuesten Technologie zu nutzen.

Gründe für die Migration von JUnit 4 zu JUnit 5

Wenn Sie JUnit 4 schon länger verwenden, scheint das Migrieren von Tests eine entmutigende Aufgabe zu sein. Die gute Nachricht ist, dass Sie wahrscheinlich keine Tests konvertieren müssen - JUnit 5 kann JUnit 4-Tests mit dem ausführen Vintage Bibliothek, so dass Sie einfach mit dem Schreiben neuer Tests mit JUnit 5 beginnen können.

Hier sind vier gute Gründe, JUnit 5 zu verwenden:

  • JUnit 5 nutzt Funktionen von Java 8 oder höher wie Lambda-Funktionen, um Tests leistungsfähiger und einfacher zu warten.
  • JUnit 5 hat einige sehr nützliche neue Funktionen zum Beschreiben, Organisieren und Ausführen von Tests hinzugefügt. Beispielsweise erhalten Tests bessere Anzeigenamen und können hierarchisch organisiert werden.
  • JUnit 5 ist in mehrere Bibliotheken unterteilt, sodass nur die Funktionen, die Sie benötigen, in Ihr Projekt importiert werden. Mit Build-Systemen wie Maven und dem Gradle, einschließlich der richtigen Bibliotheken ist einfach.
  • JUnit 5 kann mehr als eine Erweiterung gleichzeitig verwenden, was JUnit 4 nicht konnte (es konnte jeweils nur ein Läufer verwendet werden). Dies bedeutet, dass Sie die Spring-Erweiterung problemlos mit anderen Erweiterungen kombinieren können (z. B. Ihrer eigenen benutzerdefinierten Erweiterung).

So migrieren Sie zu JUnit 5

Der Wechsel von JUnit 4 zu JUnit 5 ist recht einfach, selbst wenn Sie bereits über JUnit 4-Tests verfügen. Die meisten Organisationen müssen alte JUnits nicht in JUnit 5 konvertieren, es sei denn, neue Funktionen werden benötigt.

  1. Aktualisieren Sie Ihre Bibliotheken und erstellen Sie Systeme von JUnit 4 auf JUnit 5. Stellen Sie sicher, dass Sie das JUnit-Vintage-Engine-Artefakt in Ihren Testlaufzeitpfad aufnehmen, damit Ihre vorhandenen Tests ausgeführt werden können.
  2. Erstellen Sie neue Tests mit den neuen JUnit 5-Konstrukten.
  3. (Optional) Konvertieren Sie die Tests JUnit 3 und JUnit 4 in JUnit 5.

Wichtige Unterschiede zwischen JUnit 5 und JUnit 4

JUnit 5-Tests sehen größtenteils genauso aus wie JUnit 4, es gibt jedoch einige Unterschiede, die Sie beachten sollten.

Importe

JUnit 5 verwendet das Neue org.JUnit.jupiter Paket für seine Anmerkungen und Klassen. Zum Beispiel, org.JUnit.Test wird org.JUnit.jupiter.api.Test.

Anmerkungen

Der @Prüfung Annotation hat keine Parameter mehr; Jedes davon wurde in eine Funktion verschoben. Um beispielsweise anzuzeigen, dass ein Test eine Ausnahme in JUnit 4 auslösen soll:

JUnit 4-Testfall wirft einen Ausnahmecodeausschnitt

In JUnit 5 wurde dies geändert in:

JUnit 5-Testfall wirft einen Ausnahmecodeausschnitt

Ebenso haben sich die Zeitüberschreitungen geändert. In JUnit 4 sahen sie so aus:

Codeausschnitt zum Timeout des JUnit 4-Testfalls

In JUnit 5 sehen Zeitüberschreitungen folgendermaßen aus:

Codeausschnitt zum Timeout des JUnit 5-Testfalls

Hier sind andere Anmerkungen, die sich geändert haben:

  • @Vor geworden @BeforeEach
  • @Nach dem geworden @Nach jedem
  • @Vor dem Unterricht geworden @Vor allen
  • @Nach dem Unterricht geworden @Schließlich
  • @Ignorieren geworden @Behindert
  • @Kategorie geworden @Etikett
  • @Regel und dem @Klassenregel sind weg - verwenden @ExtendWith und dem @RegisterErweiterungEx beantragen müssen

Behauptungen

JUnit 5 Assertions sind jetzt in org.JUnit.jupiter.api.Assertions. Die meisten gängigen Behauptungen mögen assertEquals () und dem assertNotNull () sehen genauso aus wie zuvor, aber es gibt ein paar wesentliche Unterschiede:

  • Die Fehlermeldung ist jetzt das letzte Argument, zum Beispiel: assertEquals ("meine Nachricht", 1, 2) wäre assertEquals (1, 2, "meine Nachricht")
  • Die meisten Zusicherungen akzeptieren jetzt ein Lambda, das die Fehlermeldung erstellt, die nur aufgerufen wird, wenn die Zusicherung fehlschlägt.
  • assertTimeout () und dem assertTimeoutPreemptively () habe die ersetzt @Auszeit Annotation (Beachten Sie, dass JUnit 5 eine @ Timeout-Annotation enthält, die jedoch anders funktioniert als JUnit 4).
  • Es gibt mehrere neue Behauptungen, die unten beschrieben werden.

Beachten Sie, dass Sie weiterhin Zusicherungen von JUnit 4 in einem JUnit 5-Test verwenden können, wenn Sie dies bevorzugen.

Annahmen

Annahmen wurden verschoben nach org.JUnit.jupiter.api.Annahmen.

Die gleichen Annahmen existieren, aber jetzt unterstützen Boolescher Lieferant sowie Hamcrest Matcher, um die Bedingungen zu erfüllen. Lambdas können (vom Typ Executable) verwendet werden, damit Code ausgeführt wird, wenn die Bedingung erfüllt ist.

Hier ist ein Beispiel in JUnit 4:

Annahme des JUnit 4-Testfalls

In JUnit 5 wird es so:

Annahme des JUnit 5-Testfalls

JUnit erweitern

In JUnit 4 bedeutete das Anpassen des Frameworks im Allgemeinen die Verwendung von a @ RunWith Anmerkung zur Angabe eines benutzerdefinierten Läufers. Die Verwendung mehrerer Läufer war problematisch und erforderte normalerweise eine Verkettung oder die Verwendung von a @Regel. Dies wurde in JUnit 5 mithilfe von Erweiterungen vereinfacht und verbessert.

Zum Beispiel sahen Gebäudetests mit dem Spring-Framework in JUnit 4 folgendermaßen aus:

JUnit 4-Testfall mit Spring-Framework

Mit JUnit 5 fügen Sie stattdessen die Federerweiterung hinzu:

JUnit 5-Testfall mit Spring-Erweiterung

Der @ExtendWith Anmerkungen sind wiederholbar, was bedeutet, dass mehrere Erweiterungen einfach kombiniert werden können.
Du Sie können auch einfach unsere eigenen benutzerdefinierten Erweiterungen definieren, indem Sie eine Klasse erstellen, aus der eine oder mehrere Schnittstellen implementiert werden org.JUnit.jupiter.api.extensionund füge es dann unserem Test mit hinzu @ExtendWith.

 

Konvertieren von Tests in JUnit 5

Um einen vorhandenen JUnit 3- oder JUnit 4-Test in JUnit 5 zu konvertieren, sollten die folgenden Schritte für die meisten Tests funktionieren:

  1. Aktualisieren Sie die Importe, um JUnit 4 zu entfernen und JUnit 5 hinzuzufügen. Aktualisieren Sie beispielsweise den Paketnamen für die @Prüfung Annotation und sowohl der Paket- als auch der Klassenname für Zusicherungen (von Behauptet zu Behauptungen). Machen Sie sich noch keine Sorgen, wenn Kompilierungsfehler auftreten. Durch Ausführen der folgenden Schritte sollten diese behoben werden.
  2. Ersetzen Sie alte Anmerkungen und Klassennamen global durch neue. Ersetzen Sie zum Beispiel alle @Vor mit @BeforeEach, und alles Behauptet mit Behauptungen.
  3. Behauptungen aktualisieren. Bei allen Zusicherungen, die eine Nachricht bereitstellen, muss das Nachrichtenargument an das Ende verschoben werden. Achten Sie besonders darauf, wenn alle drei Argumente Zeichenfolgen sind! Aktualisieren Sie außerdem Zeitüberschreitungen und erwartete Ausnahmen (Beispiele siehe oben).
  4. Aktualisieren Sie die Annahmen, wenn Sie sie verwenden.
  5. Ersetzen Sie alle Instanzen von @ RunWith, @Regel, oder auch @Klassenregel mit dem entsprechenden @ExtendWith Anmerkungen. Möglicherweise müssen Sie online aktualisierte Dokumentationen für die Erweiterungen finden, die Sie für Beispiele verwenden.

Beachten Sie, dass für die Migration parametrisierter Tests etwas mehr Refactoring erforderlich ist, insbesondere wenn Sie JUnit 4 verwendet haben Parametriert (Das Format der parametrisierten JUnit 5-Tests ist viel näher JUnitParams).

Neue Funktionen

Bisher habe ich nur vorhandene Funktionen besprochen und wie sie sich geändert haben. JUnit 5 bietet jedoch viele neue Funktionen, um unsere Tests aussagekräftiger und wartbarer zu machen.

Anzeigenamen

Mit JUnit 5 können Sie die hinzufügen @Anzeigename Anmerkung zu Klassen und Methoden. Der Name wird beim Generieren von Berichten verwendet, um den Zweck von Tests zu beschreiben und Fehler aufzuspüren, zum Beispiel:

JUnit 5-Test mit @DisplayName-Annotation zu Klassen und Methoden

Sie können auch einen Anzeigenamengenerator verwenden, um Ihre Testklasse und / oder Methode zu verarbeiten und Testnamen in einem beliebigen Format zu generieren. Einzelheiten und Beispiele finden Sie in der JUnit-Dokumentation.

Behauptungen

JUnit 5 führte einige neue Behauptungen ein, wie zum Beispiel:

  • assertIterableEquals () führt eine gründliche Überprüfung von zwei Iterablen mit equals () durch
  • assertLinesMatch () überprüft, ob zwei Listen von Zeichenfolgen übereinstimmen; Es akzeptiert reguläre Ausdrücke im Argument "erwartet".
  • assertAll () gruppiert mehrere Behauptungen zusammen. Der zusätzliche Vorteil besteht darin, dass alle Zusicherungen ausgeführt werden, auch wenn einzelne Zusicherungen fehlschlagen.
  • assertThrows () und dem assertDoesNotThrow () habe die ersetzt erwartet Eigentum in der @Prüfung Anmerkung

Verschachtelte Tests

Testsuiten in JUnit 4 waren nützlich, aber verschachtelte Tests in JUnit 5 sind einfacher einzurichten und zu verwalten und beschreiben die Beziehungen zwischen Testgruppen besser, zum Beispiel:

Verschachtelte Tests in JUnit 5

In der Exreichlich oben können Sie das sehen I Verwenden Sie eine einzelne Klasse für alle Tests im Zusammenhang mit Myclass. I kann überprüfen, ob die Klasse in der äußeren Testklasse instanziierbar ist, und I Verwenden Sie eine verschachtelte innere Klasse für alle Tests, bei denen Myclass wird instanziiert und initialisiert. Das @BeforeEach Die Methode gilt nur für Tests in der verschachtelten Klasse.

Der @DisplayNames Anmerkungen zu den Tests und Klassen geben sowohl den Zweck als auch die Organisation der Tests an. Dies hilft, den Testbericht zu verstehen, weil U can siehe die Bedingungen, unter denen der Test durchgeführt wird (Überprüfen Sie MyClass mit Initialisierung) und was der Test überprüft (meineMethode gibt true zurück). Dies ist ein gutes Testdesignmuster für JUnit 5.

Parametrisierte Tests

In JUnit 4 gab es eine Testparametrisierung mit integrierten Bibliotheken wie JUnit4Parametriert oder Bibliotheken von Drittanbietern wie JUnitParams. In JUnit 5 sind parametrisierte Tests vollständig integriert und übernehmen einige der besten Funktionen von JUnit4Parametriert und dem JUnitParams, Zum Beispiel:

Parametrisierte Tests in JUnit 5

Das Format sieht aus wie JUnitParams, wo Parameter direkt an die Testmethode übergeben werden. Beachten Sie, dass die zu testenden Werte aus verschiedenen Quellen stammen können. Hier habe ich nur einen einzigen Parameterr so ist es einfach, a zu verwenden @ValueSource. @EmptySource und dem @NullSource um das anzuzeigen I Sie möchten der Liste der Werte, mit denen ausgeführt werden soll (und Ihnen), eine leere Zeichenfolge und eine Null hinzufügen kann sie wie oben kombinieren, wenn beide verwendet werden). Es gibt mehrere andere Wertquellen, wie z @EnumSource und dem @ArgumenteQuelle (ein benutzerdefinierter Werteanbieter). Wenn Sie mehr als einen Parameter benötigen, können Sie auch verwenden @ MethodSource or @CsvSource. Weitere Details und Beispiele finden Sie in der JUnit 5-Dokumentation.

Ein weiterer in JUnit 5 hinzugefügter Testtyp ist @ Wiederholter Test, wobei ein einzelner Test eine bestimmte Anzahl von Malen wiederholt wird.

Bedingte Testausführung

JUnit 5 bietet die Ausführungsbedingung Erweiterungs-API zum bedingten Aktivieren oder Deaktivieren eines Tests oder Containers (Testklasse). Das ist wie mit @Behindert Bei einem Test können jedoch benutzerdefinierte Bedingungen definiert werden. Es gibt mehrere integrierte Bedingungen, wie z.

  • @EnabledOnOs und dem @DisabledOnOs: Aktiviert einen Test nur unter bestimmten Betriebssystemen.
  • @EnabledOnJre und dem @DisabledOnJre: Gibt an, dass der Test für bestimmte Java-Versionen aktiviert oder deaktiviert werden soll.
  • @EnabledIfSystemProperty: Aktiviert einen Test basierend auf dem Wert einer JVM-Systemeigenschaft.
  • @EnabledIf: Verwendet Skriptlogik, um einen Test zu aktivieren, wenn Skriptbedingungen erfüllt sind.

Testvorlagen

Testvorlagen sind keine regulären Tests. Sie definieren eine Reihe von auszuführenden Schritten, die dann an anderer Stelle unter Verwendung eines bestimmten Aufrufkontexts ausgeführt werden können. Das bedeutet, dass Sie eine Testvorlage einmal definieren und dann zur Laufzeit eine Liste mit Aufrufkontexten erstellen können, um diesen Test damit auszuführen. Weitere Details und Beispiele finden Sie in der Junit 5-Dokumentation.

Dynamische Tests

Dynamische Tests sind wie Testvorlagen - die auszuführenden Tests werden zur Laufzeit generiert. Während Testvorlagen mit einem bestimmten Satz von Schritten definiert und mehrmals ausgeführt werden, verwenden dynamische Tests denselben Aufrufkontext, können jedoch unterschiedliche Logik ausführen. Eine Verwendung für dynamische Tests wäre das Streamen einer Liste abstrakter Objekte und das Ausführen eines separaten Satzes von Zusicherungen für jedes Objekt basierend auf ihren konkreten Typen. Gute Beispiele finden Sie in der Junit 5-Dokumentation.

Schlussfolgerung

JUnit 5 ist ein leistungsstarkes und flexibles Update des JUnit-Frameworks. Es bietet eine Vielzahl von Verbesserungen und neuen Funktionen zum Organisieren und Beschreiben von Testfällen sowie zum Verständnis der Testergebnisse. Das Aktualisieren auf JUnit 5 ist schnell und einfach. Aktualisieren Sie einfach Ihre Projektabhängigkeiten und verwenden Sie die neuen Funktionen.

Möchten Sie sehen, wie Sie das Erstellen von JUnit-Testfällen und zugehörigen Stubs/Mocks mit dem Unit-Test-Assistenten von Jtest vereinfachen können?