Junit 4, das berühmte Java Unit -Test -Framework, ist seit langem aus. Zu dieser Zeit stellte ich fest, dass Junit 5 in der Beta -Version war, also wollte ich einen Artikel schreiben, um Junit 5 vorzustellen. Da es sich jedoch immer noch um eine Beta -Version handelt, sind einige Teile nicht perfekt und ich bin ein wenig faul und schreibe sie nicht gut. Ich erinnerte mich heutzutage plötzlich an diesen Vorfall. Als ich es auf der offiziellen Website überprüfte, stellte ich fest, dass die offizielle Version von Junit 5 am 10. September endlich herauskam! Dann habe ich den Artikel erneut geschrieben und Ihnen das neueste Jungit -Framework vorgestellt.
Frameworkstruktur
Im Vergleich zu JUNIT 4 ist die Struktur von Junit 5 sehr klar und bietet eine gute Unterstützung für erweiterte Funktionen wie benutzerdefinierte Plug-Ins, IDE-Testausführung usw. Dies ist aus der Projektstruktur aus zu sehen.
JUNIT -Plattform
Der Paketname dieser Gruppe lautet org.junit.platform. Wie Sie aus dem Namen sehen können, besteht die Hauptfunktion dieser Gruppe darin, als grundlegende Plattform für das Testframework zu dienen. Die Module unter diesem Paket umfassen grundlegende APIs, Ausführungsmotoren und Ausführende, grundlegende Befehlszeilenausführungsfunktionen, Befehlszeilenschnittstellen, Maven- und Gradle-Test-Plug-Ins und andere grundlegende Funktionen.
Junit Jupiter
Jupiter ist der Codename von Junit 5. Die Module unter diesem Paket enthalten die Hauptfunktionen von Junit 5. Wenn wir JUNIT 5 verwenden möchten, müssen wir diesen Modulessatz einbeziehen.
JUNIT VINTAGE
Vintage ist der Codename für die alte Version von Junit. Die Module unter diesem Paket ermöglichen es uns, Tests von Old Junit 3 und 4 auf der neuen Junit -Plattform auszuführen.
Klassenbibliothek importieren
Während sich Junit 5 noch in der Beta -Phase befindet, gibt es Beispiele für die Integration von Junit 5 in Maven und Gradle in die offizielle Dokumentation. In der offiziellen Version verschwand jedoch der Inhalt dieses Teils, wobei nur zwei Links zum Beispielprojekt zurückgelassen wurden (Kopieren und Einfügen).
Mit Maven
Junit5-Maven-Consumer ist das offizielle Beispiel für Maven. Ich wollte ursprünglich die relevante POM -Konfiguration hier veröffentlichen, aber als ich sah, dass die Konfiguration von Maven zu lang war, würde ich es besser vergessen. Wenn Sie Anforderungen haben, überprüfen Sie bitte die POM -Konfiguration dieses Projekts selbst.
Mit Gradle
Wenn Sie Gradle verwenden, ist dieses Problem viel einfacher. Es gibt auch detaillierte Beschreibungen im Probenprojekt von JUNIT5-Gradle-Consumer.
Zunächst unterstützt Gradle standardmäßig keine Junit 5, sodass das Junit Platform Gradle Plug-In aktiviert werden muss, um es zu unterstützen.
Buildscript {Repositories {mavencentral ()} Abhängigkeiten {classPath 'org.junit.platform: junit-plattform-Gradle-plugin: 1.0.0'}} Plugin anwenden: 'org.junit.platform.gradle.plugin'Dann gibt es die Konfiguration dieses Gradle -Plugins. Standardmäßig werden alle Motoren und Tags ausgeführt. Wenn Sie Tests nur für bestimmte Motoren und Tags durchführen möchten, können Sie Folgendes in Überzeugung und ändern sie nach Ihren eigenen Bedürfnissen. Wenn Sie diese fortgeschrittenen Anforderungen nicht haben, können Sie diesen Teil natürlich löschen.
JUNITPLATFORM {// Plattformversion '1.0.0' Filter {Engines {// include 'junit-jupiter', 'junit-vintage' // ausschließe 'Custom-Engine'} Tags {// 'schnelle' exklude 'Slow'} // includeclassnamepatter '. Datei ('Build/Test-Results/junit-plattform') // Dies ist der Standard // logManager 'org.apache.logging.log4j.jul.logmanager'}Wenn Sie nur JUNIT 5 -Tests durchführen müssen, importieren Sie einfach die folgenden zwei Abhängigkeiten. Die Abhängigkeiten der JUNIT -Plattform werden automatisch importiert.
Abhängigkeiten {TestCompile ("org.junit.jupiter: junit-jupiter-api: 5.0.0") testRuntime ("org.junit.jupiter: junit-Jupiter-Engine: 5.0.0")}}Wenn Sie unter der neuen Plattform Old Junit 3 und 4 Tests durchführen möchten, müssen Sie die folgenden Abhängigkeiten importieren.
Abhängigkeiten {TestCompile ("Junit: jungit: 4.12") testRuntime ("org.junit.Vintage: junit-vintage-motor: 4.12.0")}Tests schreiben
Junit 4 Test
Wenn die gesamte vorherige Konfiguration abgeschlossen ist, können Sie jetzt mit dem Schreiben von Tests beginnen. Lassen Sie uns zunächst den Old Junit 4 -Test überprüfen.
public class JUnit4Test {@BeforeClass public static void init() {System.out.println("Before Class");}@AfterClass public static void clean() {System.out.println("After class");}@Before public void before() {System.out.println("Before");}@After public void after() OderVerwenden Sie Gradle -Test und andere Befehle, um diesen Test auszuführen. Das Ergebnis ähnelt diesem.
Vor ClassBeforetest 1Test 2Af Class
Junit 5 Test
Schauen wir uns an, wie Sie den äquivalenten Junit 5 -Test schreiben können. Die offensichtlichste Veränderung ist zu sehen: Zunächst wurden mehrere Anmerkungen in berühmteren Namen umbenannt; Ein weiterer Punkt ist, dass die Testmethode keine öffentliche Methode sein muss, sodass wir die Tastatur weniger Male eingeben können.
public class junit5Test {@beForeall static void beforeall () {System.out.println ("vor");}@Afterall static void nachall {System.out.println ("After");}@test void Test1 () {System.out.println ("Test 1");}@test void test2 () {System.out.println ("test 2");}}Schreiben Sie Behauptungen
Um zu überprüfen, ob die Testfälle korrekt sind, müssen wir einige Behauptungen schreiben. Junit 5 verfügt über viele Behauptungen, die uns helfen können, Testfälle zu schreiben. Darüber hinaus sind diese Behauptungen mit überlasteten Versionen ausgestattet, die Lambda -Ausdrücke akzeptieren können, die für die Verwendung von Java 8 sehr geeignet sind. Natürlich denke ich persönlich, dass es bequemer ist, sie zu behaupten.
statische org.junit.assert.assertRue; importieren statische org.junit.jupiter AssertRue (wahr); Assertequals (100, 100, "zwei gleiche Zahlen"); Assertall ("Nummer", () -> AssertEquals ("Name", "Name"), () -> AssertEquals (500, 500)); AssertThrows (InvalyParameterexception.class, () -> {neue InvalyParameterexception ();}); int resert = assertTimeout (duration.ofseconds (5), () -> {int i = 0, j = 0; while (i <= 100) {für (; j <= 100000; j ++) j ++; i ++;} return i;}); Assertequals (100, Ergebnis); }}Abhängigkeitsinjektion
Jetzt können sowohl der Konstruktor- als auch die Testmethoden der Testklasse Parameter akzeptieren. Die Parameterresolver -Schnittstelle definiert, wie Parameter zur Laufzeit injiziert werden. Mit mehreren integrierten Integration können wir Informationen über die Laufzeit des Testfalles erhalten.
Erstens ist Testinfoparameterresolver. Wenn die Methode eine Instanz des Typs testinfo gibt, injiziert das JUNIT 5 -Framework die Instanz automatisch. In verschiedenen Methoden dieser Instanz können wir den Namen, den Anzeigenamen, die Beschriftung und andere Informationen der Testklasse und der Testmethode erhalten.
public class DependentyInjunctionDemo {@test @DisplayName ("Abhängigkeitsinjektion") @Tag ("Test") void testDisplayName (testinfo testinfo) {assertequals ("Abhängigkeitsinjektion", testinfo.getDisplayname ()); Assertequals (Collections.Singleton ("Test"), TestInfo.Gettags ()); }}Es gibt auch Parser in eingebaute Parameter wie Wiederholungsinfoparameterresolver, die später eingeführt werden.
Gemeinsame Anmerkungen
Anzeigename
Wir können benutzerdefinierte Namen zum Testen von Klassen und Testmethoden hinzufügen, die vom Testläufer und Testberichten angezeigt werden. Der Anzeigename wird nicht wie einen variablen Namen angezeigt. Es kann eine lange Saite sein, die Räume enthält, oder sogar ein Emoji -Emoji.
@DisplayName ("Die Testklasse kann den Anzeigenamen") ") öffentliche Klasse DisplayNamedemo {@test @DisplayName (" Die Testmethode kann auch den Anzeigennamen angeben ") void testwithlongDisplayname () {} @Test @Displayname (" Der Anzeigename kann auch Emoticons} ’�� ��") void testwithislayname enthalten.Tests deaktivieren
@Disabled Annotation kann für Testklassen oder Testmethoden verwendet werden, und der entsprechende Test kann deaktiviert werden.
@DisabledPublic Class deaktiviertestDemo {@test // @deaktiviert void testDisabled () {}}Wiederholungstest
Wenn Sie mehrmals eine Testmethode ausgeführt werden müssen, verwenden Sie die Annotation @repeatedTest.
öffentliche Klasse RepeatedTestDemo {@repeatedTest (10) void testrepeated10Times () {}}Sie können auch eine Instanz -Wiederholung injizieren, um die aktuelle Anzahl der Wiederholungen und die Gesamtzahl der Wiederholungen zu überprüfen.
public class repuedTestDemo {@beforeach void vorab (Wiederholungsinfo) {System.out.printf (" %d - %d/n", info.getCurrentrepetition (), info.gettotalrepetitions ());}@repetedtest (10) void testrepeatedKommt mit Tags
Als ich die Konfiguration von Gradle einführte, sagte ich, dass Sie bestimmte Beschriftungen in der Konfiguration filtern können. Es ist auch sehr einfach, Tags im Code zu geben. Verwenden Sie einfach @TAG -Annotation.
@Tag ("TaggedTest") public class Tagdemo {@test @Tag ("TaggedTest1") void testWithTag1 () {} @test @Tag ("TaggedTest2") void testWithTag2 () {}}}Verschachtelte Tests
Manchmal können verschachtelte Tests erforderlich sein, um die Einschlussbeziehung zwischen bestimmten Tests anzuzeigen. Verschachtelte Tests verwenden @nested Annotation.
@DisplayName ("äußerer Test") öffentliche Klasse NestedDemo {@Test void testouter () {} @nested @DisplayName ("Inner Test") Klasse InnertestDemo {@test void testernner () {{}}}}Es ist zu beachten, dass nur statische innere Klassen verschachtelte Anmerkungen verwenden können. Da Java nicht zulässt, dass interne Klassen keine statischen Methoden haben, können @BeForeAll und @afterall Anmerkungen nicht erfolgen. Wenn Sie diese Einschränkung durchbrechen möchten, müssen Sie der verschachtelten inneren Klasse die Annotation von @Testinstance (Lifecycle.Per_Class) hinzufügen. Weitere Informationen finden Sie unter dem Testinstanz -Lebenszyklus.
IDE -Unterstützung
Obwohl Junit 5 jetzt herausgekommen ist. Die Unterstützung verschiedener Toolchains hat jedoch nicht mithalten. Derzeit haben nur Intellij IDEA und Eclipse 4.7 (Sauerstoff) Unterstützung für Junit 5. Wenn Sie sich also in einer formellen Situation befinden, ist es sicherer, Junit 4 zu verwenden.
Häufig gestellte Fragen
Unterscheiden Sie zwischen verschiedenen Versionen von @Test Annotation
Gerade als ich diesen Artikel geschrieben habe, habe ich ein Problem mit meinem Testbeispiel gestoßen. Der Test konnte nicht übergeben und die folgende Fehlermeldung angezeigt werden.
Fehler (1): jungit Vintage: yitian.study.test.assertionDemo: InitializationError ClassSource [className = 'yitian.study.test.assertionDemo', filePosition = null] => java.lang.Exception: method testastionion () sollte veröffentlicht werden () sollte öffentlich öffentlich sein.
Schüler mit gutem Englisch sollten es erkennen können. Diese Fehlermeldung besagt, dass die Testmethode öffentlich sein muss. Aber wie bereits erwähnt, hat Junit 5 diese Einschränkung abgesagt. Warum tritt dieser Fehler immer noch auf? Ich sah genau hin und fand den Fehler. Vielleicht liegt es daran, dass Junit 4 in der Vergangenheit viel verwendet wurde, sodass die IDE standardmäßig mit der @Test -Annotation abgeschlossen wird, die automatisch abgeschlossen ist.
import org.junit.test;
Dieses Paket ist die @Test -Annotation unter Junit 4. Wenn wir JUNIT 5 verwenden möchten, benötigen wir die folgende @Test -Annotation.
import org.junit.jupiter.api.test;
Führen Sie den Test erneut durch, und es gab tatsächlich kein Problem. Natürlich verweist ich zum Lernen und Gebrauch auch auf das Jungit 4 -Paket, so dass dieser Konflikt auftritt. Wenn Sie keine besonderen Bedürfnisse haben, wird empfohlen, nur JUNIT 5 JAR -Pakete zu importieren, um Verwirrung zu verhindern. Natürlich ist es in Ordnung, sie alle zu importieren, aber Sie müssen darauf achten, sie zu unterscheiden und keine Annotationen von JUNIT 4 in JUnit 5 -Tests zu schreiben. Schließlich werde ich meine Testbeispiele anschließen. Diejenigen, die interessiert sind, können einen Blick darauf werfen.
Zusammenfassen
Der oben genannte ist der gesamte Inhalt dieses Artikels über jungit5 verwandte Inhalte, und ich hoffe, dass dies für alle hilfreich sein wird. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!