junit test execution order
In diesem Lernprogramm wird erläutert, wie Sie die Ausführungsreihenfolge für JUnit-Testfälle festlegen. Sie erfahren mehr über Anmerkungen und Klassen zum Festlegen der Ausführungsreihenfolge für JUnit-Tests in JUnit 4 gegenüber JUnit 5:
In unserem vorherigen Lernprogramm haben wir gelernt, wie Sie eine Testsuite erstellen, eine Kategorie oder ein Tag zu den Testfällen hinzufügen und wie Sie Tests basierend auf der Kategorie oder dem Tag herausfiltern (Testfälle ausschließen oder einschließen).
Außerdem haben wir gelernt, dass wir in JUnit 4 haben @Category, @IncludeCategory, und @ExcludeCategory zum Filtern der Testfälle während JUnit 5 hat @IncludeTags und @ExcludeTags das Gleiche tun.
JUnit 5 bietet zusätzliche Filteroptionen mithilfe von Anmerkungen @IncludePackages, @ExcludePackages, und auch Anmerkungen zum Einschließen oder Ausschließen von Klassen unter Verwendung von Klassennamenmustern.
=> Hier finden Sie A-Z der JUnit-Schulungsanleitungen .
Was du lernen wirst:
JUnit Test Execution Order
In diesem Tutorial erfahren Sie, wie Sie für jeden Testfall eine Reihenfolge festlegen, damit diese in der festgelegten Reihenfolge ausgeführt werden. Wir werden lernen, wie man Tests sowohl in JUnit 4 als auch in JUnit 5 bestellt.
Die Testmethoden folgen standardmäßig nicht einer bestimmten Reihenfolge.Die Testfälle müssen nicht unbedingt in der Reihenfolge ausgeführt werden, in der sie geschrieben wurden.
Es gibt verschiedene Möglichkeiten oder Modi, um die Ausführungsreihenfolge für die Testfälle festzulegen. Wir werden auch eingehend untersuchen, wie sich JUnit 4 bei der Reihenfolge der Testfälle im Vergleich zu JUnit 5 unterscheidet.
Einheit 4: @FixedMethodOrder, Class MethodSorters
Ab JUnit 4.11 haben wir die Annotation @FixMethodOrder und MethodSorters.class Unterstützung der Möglichkeit, einen Auftrag für die Ausführung eines Tests festzulegen.
Das Paket org.junit.runners. * muss importiert werden, um die Klasse einzuschließen MethodSorter . Diese Klasse entscheidet, wie die Testfälle bestellt werden müssen. MethodSorter haben drei Aufzählung Werte.
Nachstehend sind die Aufzählungswerte der Klasse zusammen mit dem Zweck aufgeführt, dem jeder der Werte dient:
MethodSorters.DEFAULT | Dieser Aufzählungswert sortiert die Testausführung in einer bestimmten Reihenfolge. Es ist jedoch nie vorhersehbar, in welcher Reihenfolge die Testfälle ausgeführt werden könnten. |
Aus diesem Grund haben Sie die Kontrolle darüber, welcher Testfall zuerst ausgeführt werden soll und welcher als nächstes folgen soll. | |
Ich habe festgestellt, dass bei einer Klasse mit mehreren Methoden, die bei der Ausführung mit DEFAULT enum sortiert wurden, die Reihenfolge jedes Mal während der Testausführung gleich bleibt. | |
Ich kann jedoch auf keinen Fall vorhersagen oder herausfinden, wie die Reihenfolge festgelegt wurde. | |
MethodSorters.JVM | Die Reihenfolge der Testausführung mit JVM-Aufzählung wird, wie der Name schon sagt, von der JVM festgelegt. |
In diesem Fall werden die Tests jedes Mal, wenn Sie die Klasse ausführen, nicht in derselben, sondern in zufälliger Reihenfolge ausgeführt. | |
Mit anderen Worten, die Reihenfolge der Tests ändert sich während jedes Laufs. | |
MethodSorters.NAME_ASCENDING | Diese Aufzählung sortiert die Testmethoden in lexikografischer Reihenfolge des Methodennamens. Daher können Sie sicher sein, dass dies die vorhersehbarste Art ist, Ihre Testausführung zu bestellen. |
Sie können daher die Reihenfolge der Tests im Voraus anhand der von Ihnen festgelegten lexikografischen Reihenfolge des Namens festlegen. |
Die Anmerkung @FixedMethodOrder nimmt den Eingabeparameter von auf MethodSorter mit seinem Aufzählungswert. Das für die Annotation benötigte Paket ist org.junit.FixedMethodOrder.
Mal sehen, wie es durch den Code implementiert wird.
Code-Implementierung für MethodSorters.DEFAULT
Erstellen wir eine JUnit-Klassendatei. Junit4TestOrder.java ' wo wir verwenden werden MethodSorters.DEFAULT
Der Code für Junit4TestOrder.java
@FixMethodOrder(MethodSorters.DEFAULT) public class JUnit4TestOrder { @Test public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
Wir führen die Klasse dreimal aus und sehen die gleiche Reihenfolge der Tests wie unten, jedoch können die Testfälle in der sortierten Reihenfolge ausgeführt werden oder nicht.
Das Konsolenfenster zeigte die folgenden Ergebnisse an: Die Reihenfolge der Testausführung lautet TestCase_3, TestCase_1 und TestCase_2, und die Reihenfolge ändert sich nicht mit der Anzahl der Läufe.
Code-Implementierung für MethodSorter. JVM
Wir werden jetzt 'Junit4TestOrder.java' aktualisieren MethodSorters.JVM
Das Code-Snippet für Junit4TestOrder.java
@FixMethodOrder(MethodSorters . JVM ) public class JUnit4TestOrder {
Wir führen die Klasse zweimal aus und die Reihenfolge der Testausführung ändert sich mit jedem Lauf.
Das Konsolenfenster für die zuerst Der Lauf ist wie folgt:
Das Konsolenfenster für die zweite Der Lauf ist wie folgt:
Beobachten Sie genau die Änderung in der Reihenfolge, in der die Tests in beiden Läufen ausgeführt werden. Die Reihenfolge der Tests in den beiden Läufen war unterschiedlich.
Code-Implementierung für MethodSorters.NAME_ASCENDING
Wir werden jetzt 'Junit4TestOrder.java' aktualisieren MethodSorters.NAME_ASCENDING
Das Code-Snippet für Junit4TestOrder.java
@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JUnit4TestOrder {
Wir führen die Klasse zweimal aus, die Reihenfolge der ausgeführten Tests bleibt gleich und wird in aufsteigender Reihenfolge des Methodennamens ausgeführt.
Das Konsolenfenster zeigt das Ergebnis der Tests in der Reihenfolge TestCase_1, TestCase_2 und TestCase_3.
JUnit 5: @TestMethodOrder, @Order, Interface MethodOrderer
Um die Reihenfolge der Ausführung von Tests zu steuern, helfen die folgenden Entitäten dabei, dasselbe zu tun:
- Die Annotation @TestMethodOrder
- Die Anmerkung @Order
- Die Klassen, die zu MethodOrderer-Schnittstellen gehören
Die integrierten MethodOrderer-Klassen und ihre Details lauten wie folgt:
Die in MethodOrderer integrierte Klasse | Aus Paket | Einzelheiten |
---|---|---|
Alphanumerisch | org.junit.jupiter.api.MethodOrderer.Alphanumeric | Sortiert Testmethoden alphanumerisch nach ihren Namen |
OrderAnnotation | org.junit.jupiter.api.MethodOrderer.OrderAnnotation | Sortiert Testmethoden numerisch basierend auf den an die Annotation @Order übergebenen Werten |
Zufällig | org.junit.jupiter.api.MethodOrderer.Random | Sortiert die Testmethoden zufällig wie im Fall MethodSorters.JVM in JUnit 4 |
Schauen wir uns nun die Demonstration jeder dieser Bestellstrategien an:
Code-Implementierung für Alphanumeric.class
Erstellen Sie eine JUnit 5-Klassendatei mit dem Namen JUnit5TestOrder.java wie JUnit4TestOrder.java und verwenden Sie die Annotation mit Alphanumeric.class, um die Tests alphanumerisch zu ordnen.
Der Code für Junit5TestOrder.java
@TestMethodOrder(Alphanumeric.class) public class JUnit5TestOrder { @Test public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
Wir haben die Klasse dreimal ausgeführt und sehen immer noch die gleiche Reihenfolge der Tests in der alphanumerisch sortierten Reihenfolge des Namens der Testmethode.
Nach der Ausführung der Klassendatei die Reihenfolge der Testausführung:
- Testfall_1,
- Testfall_2 und
- Testfall_3
Hinweis: Die alphanumerische Sortierstrategie unterscheidet zwischen Groß- und Kleinschreibung Für den Fall, dass wir einen anderen Testfall mit dem Namen testcase_1 hatten.
Die Reihenfolge der Ausführung wäre:
- Testfall_1,
- Testcase_2,
- Testcase_3,
- testcase_1.
Daher hat der Großbuchstabe Vorrang vor den Methodennamen in Kleinbuchstaben.
Code-Implementierung für Random.class
Wir werden jetzt die JUnit 5-Klasse JUnit5TestOrder.java aktualisieren, um die Annotation mit Random.class zu verwenden
Das Code-Snippet für Junit5TestOrder.java
@TestMethodOrder (Random.class) public class JUnit5TestOrder {
Wir haben die Klasse zweimal ausgeführt und festgestellt, dass jedes Mal, wenn wir die Klasse ausgeführt haben, die Reihenfolge der Testausführung nach dem Zufallsprinzip festgelegt wurde.
Nachausführung der Klassendatei für die erstes Mal Die Reihenfolge der Testausführung war:
- Testcase_2,
- Testfall_1
- Testfall_3
Die Reihenfolge der Ausführung, wenn für die ausgeführt zweite Zeit zeigte:
- Testcase_2,
- Testfall_3
- Testfall_1 .
Code-Implementierung für OrderAnnotation.class
Wir werden jetzt die JUnit 5-Klasse JUnit5TestOrder.java aktualisieren, um die Annotation mit zu verwenden OrderAnnotation.class. Die Anmerkung @Bestellen wird auch hier eine wichtige Rolle bei der Prioritätensetzung der Testmethoden spielen.
Das Code-Snippet für Junit5TestOrder.java
@TestMethodOrder(OrderAnnotation.class) public class JUnit5TestOrder { @Test @Order(1) public void Testcase_3() { System.out.println('Testcase_3 executes'); } @Test @Order(2) public void Testcase_1() { System.out.println('Testcase_1 executes'); } @Test @Order(3) public void Testcase_2() { System.out.println('Testcase_2 executes '); } }
Bei dieser Strategie zum Einrichten der Reihenfolge für die Testausführung erzwingt die Annotation @Order die Ausführung der Testmethoden gemäß Bestellwert darauf eingestellt sein.
Je niedriger der Wert von @Order für eine Testmethode ist, desto höher ist die Priorität während der Ausführung.
Nach der Ausführung lief die Reihenfolge der Tests wie folgt ab:
- Testcase_3,
- Testfall_1
- Testfall_2, da die für die Testfälle festgelegte Reihenfolge 1,2 bzw. 3 ist.
Aus diesem Grund spielt es keine Rolle, ob die Testfälle in der richtigen Reihenfolge geschrieben sind. Außerdem spielt es keine Rolle, ob die Methodennamen in alphanumerischer Reihenfolge vorliegen oder nicht.
JUnit 5: Benutzerdefinierte Bestellung erstellen
Neben den integrierten Order-Klassen unterstützt JUnit 5 auch benutzerdefinierte Orders durch Implementierung der Schnittstelle MethodOrderer . Ab JUnit 5 Version 5.4 wird die benutzerdefinierte Sortierung unterstützt.
Lassen Sie uns schnell sehen, wie Sie eine benutzerdefinierte Reihenfolge nach Methodenlänge erstellen und implementieren.
Schritt 1: Erstellt eine benutzerdefinierte Auftragsklasse, die die MethodOrderer-Schnittstelle implementiert, und benennt die Klasse als TestCaseLengthOrder
Der Code für TestCaseLengthOrder.java
public class TestCaseLengthOrder implements MethodOrderer { @Override public void orderMethods(MethodOrdererContext context) { MethodDescriptor md1; MethodDescriptor md2; context.getMethodDescriptors().sort((md1, md2)-> md1.getMethod().getName().length().compareTo(md2.getMethod().getName().length())); } }
Erklärung des TestCaseLengthOrder-Codes:
- Eine benutzerdefinierte Auftragsklasse wird durch Implementieren der MethodOrderer-Schnittstelle erstellt.
- void orderMethods (MethodOrderContext-Kontext) {} Methode, die die vom Interface MethodOrderer implementierte integrierte Methode ist. Hier definieren Sie die Implementierung der Testbestelllogik.
- MethodDescriptor ist eine Schnittstelle, die Details zu einer Methode enthält:
- Die Methode MethodDescriptor.getMethod () ruft den Methodennamen für diesen Deskriptor ab.
- Der Methodenname wird mit der Methode getName () in String konvertiert, d. H. MethodDescriptor.getMethod (). GetName () und
- Die Methode length () ruft die Länge der Methode ab (genau wie string.length () die Länge eines Zeichenfolgenwerts abruft).
- Alle Methodennamen werden mit der compareTo () -Methode miteinander verglichen.
- Die Methode getMethodDescriptors () ruft die Liste aller Methodendeskriptoren in einer Klasse ab.
- Die sort () -Methode sortiert die MethodDescriptor-Objekte.
Nachdem wir jede API von MethodOrderer klar verstanden haben, hoffen wir, dass es einfach ist, den obigen Code zu interpretieren.
Schritt 2 : Verwenden Sie die benutzerdefinierte Auftragsklasse wie jede integrierte Reihenfolge in der Testklasse.
Als Eingabe für die Annotation @TestMethodOrder.
Der Code für JUnit_CustomOrder.java
@TestMethodOrder(TestCaseLengthOrder.class) class JUnit_CustomOrder{ @Test public void subt(){ } @Test public void add(){ } @Test public void multiply(){ } @Test public void divide(){ }
Schritt 3:
Nach der Ausführung von JUnit_CustomOrder.class Die Reihenfolge der Testausführung ist wie folgt, basierend auf der aufsteigenden Reihenfolge der Länge des Namens der Testfälle:
- hinzufügen(),
- subt (),
- Teilen ()
- multiplizieren()
Fazit
Zum Abschluss dieses Tutorials zur JUnit Test Execution Order.
- Wir haben gelernt, wie die Reihenfolge der Testfälle mithilfe bestimmter Anmerkungen sowie bestimmter Klassen festgelegt wird.
- Wir haben auch verschiedene Möglichkeiten zum Bestellen von Tests für JUnit 4 und JUnit 5 kennengelernt, auf deren Grundlage sich die Bestellstrategien geändert haben.
- Außerdem haben wir gelernt, wie wir in JUnit 5 auch eine angepasste Sortierklasse erstellen und diese zum Ordnen der Testfälle während ihrer Ausführung verwenden können.
=> Schauen Sie sich hier den JUnit Beginners Guide an.
Literatur-Empfehlungen
- JUnit-Tests: So schreiben Sie JUnit-Testfälle mit Beispielen
- Liste der JUnit-Anmerkungen: JUnit 4 Vs JUnit 5
- JUnit Ignore Test Case: JUnit 4 @Ignore Vs JUnit 5 @Disabled
- JUnit Test Suite & Filtering Test Cases: JUnit 4 Vs JUnit 5
- Was ist ein JUnit-Testgerät? Tutorial mit JUnit 4-Beispielen
- JUnit Tutorial für Anfänger - Was ist JUnit Testing?
- Mehrere Möglichkeiten zum Ausführen von JUnit-Tests
- Ausführen einer parallelen Ausführung von Appium-Tests in großem Maßstab