junit test execution order
Denne vejledning forklarer, hvordan man indstiller udførelsesordren for JUnit-testsager. Du lærer om kommentarer og klasser for at indstille JUnit-testudførelsesordren i JUnit 4 vs JUnit 5:
Vi lærte, hvordan man opretter en testpakke, hvordan man tilføjer en kategori eller et tag til testsagerne, og hvordan man filtrerer ud test (ekskluderer eller inkluderer testcases) baseret på kategorien eller tagget i vores tidligere tutorial.
Desuden lærte vi, at det har vi i JUnit 4 @Category, @IncludeCategory, og @ExcludeCategory til filtrering af testsagerne, mens JUnit 5 har @IncludeTags og @ExcludeTags at gøre det samme.
JUnit 5 har yderligere filtreringsmuligheder ved hjælp af annoteringer @IncludePackages, @ExcludePackages, og også kommentarer til at inkludere eller ekskludere klasser ved hjælp af klassens navnemønstre.
=> Tjek her for at se AZ af JUnit-træningsvejledninger .
Hvad du lærer:
JUnit-testudførelsesordre
I denne vejledning lærer vi, hvordan man indstiller en ordre for hver testsag, så de kører i den indstillede rækkefølge. Vi lærer at bestille test i JUnit 4 såvel som i JUnit 5.
Testmetoderne følger ikke en bestemt rækkefølge som standard.Testcases behøver ikke nødvendigvis at blive udført i den rækkefølge, de er skrevet i.
Der er forskellige måder eller tilstande til at indstille rækkefølgen til eksekvering af testsagerne. Vi dykker også dybt ned i, hvordan JUnit 4 varierer med hensyn til bestilling af testsagerne sammenlignet med JUnit 5.
JUnit 4: @FixedMethodOrder, Class MethodSorters
Fra og med JUnit 4.11 har vi kommentaren @FixMethodOrder og MethodSorters.class støtte faciliteten til at indstille en ordre til en tests udførelse.
Pakken org.junit.runners. * skal importeres for at inkludere klassen Metode Sortere . Denne klasse bestemmer, hvordan testsagerne skal bestilles. Metode Sortere har tre enum værdier.
Nedenfor er klassens enumværdier sammen med det formål, hver af værdien tjener:
MethodSorters.DEFAULT | Denne enumværdi sorterer testudførelsen i en bestemt rækkefølge. Det er dog aldrig forudsigeligt i hvilken rækkefølge det kan køre testsagerne. |
Dette er grunden til, at du har kontrol over din beslutning om, hvilken testcase der skal køre først, og hvilke der skal følge derefter. | |
Jeg har observeret, at en klasse med flere metoder sorteret med DEFAULT enum, når den udføres, forbliver ordren den samme hver gang under testudførelsen. | |
Der er dog ingen måde, hvorpå jeg kunne forudsige eller finde ud af, hvordan ordren blev sat. | |
MethodSorters.JVM | Rækkefølgen for testudførelse med JVM-enum er, som navnet antyder, bestemt af JVM. |
I dette tilfælde udføres testene hver gang du kører klassen ikke i den samme, men i tilfældig rækkefølge. | |
Med andre ord ændres rækkefølgen af test under hver kørsel. | |
MethodSorters.NAME_ASCENDING | Dette enum sorterer testmetoderne i leksikografisk rækkefølge af metodens navn. Derfor kan du være sikker på, da dette er den mest forudsigelige måde at bestille din testudførelse på. |
Du kan derfor på forhånd beslutte rækkefølgen af tests baseret på den leksikografiske rækkefølge af dets navn, du har indstillet. |
Annotationen @FixedMethodOrder tager inputparameteren af Metode Sortere med sin enumværdi. Den nødvendige pakke til kommentaren er org.junit.FixedMethodOrder.
Lad os se, hvordan det implementeres gennem koden.
Kodeimplementering for MethodSorters.DEFAULT
Lad os oprette en JUnit-klassefil ' Junit4TestOrder.java ' hvor vi vil bruge MethodSorters.DEFAULT
Koden til 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 '); } }
Vi kører klassen tre gange og ser den samme rækkefølge af tests køres som nedenfor, men testsagerne udføres måske eller måske ikke i den sorterede rækkefølge.
Konsolvinduet viste resultaterne som nedenfor - rækkefølgen af testudførelsen er TestCase_3, TestCase_1 og TestCase_2, og rækkefølgen ændres ikke med antallet af kørsler.
Kodeimplementering for MethodSorters. JVM
Vi opdaterer nu 'Junit4TestOrder.java' til at have MethodSorters.JVM
Kodestykket til Junit4TestOrder.java
@FixMethodOrder(MethodSorters . JVM ) public class JUnit4TestOrder {
Vi kører klassen to gange, og rækkefølgen af testens udførelse ændres for hver kørsel.
Konsolvinduet til først Kør er som vist nedenfor:
Konsolvinduet til sekund Kør er som vist nedenfor:
Overhold nøje ændringen i rækkefølgen, som testene udføres i begge kørsler. Rækkefølgen af test i de to kørsler har været forskellig.
Kodeimplementering for MethodSorters.NAME_ASCENDING
Vi opdaterer nu 'Junit4TestOrder.java' til at have MethodSorters.NAME_ASCENDING
Kodestykket til Junit4TestOrder.java
@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JUnit4TestOrder {
Vi kører klassen to gange, rækkefølgen af de udførte tests forbliver den samme og udføres efter stigende rækkefølge af metodens navn.
Konsolvinduet viser resultatet af de test, der er udført i rækkefølgen TestCase_1, TestCase_2 og TestCase_3.
JUnit 5: @TestMethodOrder, @Order, Interface MethodOrderer
For at kontrollere rækkefølgen af udførelse af test hjælper nedenstående enheder med at gøre det samme:
- Annotationen @ TestMethodOrder
- Annotationen @ Bestil
- Klasser, der hører til MethodOrderer-grænseflader
De indbyggede MethodOrderer-klasser og deres detaljer er som nedenfor:
Metode Bestilling er bygget i klassen | Fra pakke | detaljer |
---|---|---|
Alfanumerisk | org.junit.jupiter.api.MethodOrderer.Alphanumeric | Sorterer testmetoder alfanumerisk baseret på deres navne |
OrderAnnotation | org.junit.jupiter.api.MethodOrderer.OrderAnnotation | Sorterer testmetoder numerisk baseret på de værdier, der sendes til kommentaren @ Order |
Tilfældig | org.junit.jupiter.api.MethodOrderer.Random | Sorterer testmetoder tilfældigt ligesom i tilfældet MethodSorters.JVM i JUnit 4 |
Lad os nu se på demonstrationen af hver af disse bestillingsstrategier:
Kodeimplementering til Alphanumeric.class
Lad os oprette en JUnit 5-klassefil med navnet JUnit5TestOrder.java, samme som JUnit4TestOrder.java, og lad os bruge kommentaren med Alphanumeric.class til at bestille testene alfanumerisk.
Koden til 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 '); } }
Vi kørte klassen tre gange og ser stadig den samme rækkefølge af test køres i den alfanumeriske sorterede rækkefølge af testmetodens navn.
Efter udførelse af klassefilen, rækkefølgen af testudførelsen:
- Testcase_1,
- Testcase_2 og
- Testcase_3
Bemærk: Den alfanumeriske sorteringsstrategi er store og små bogstaver så hvis vi havde en anden testsag med navnet testcase_1.
Ordren til udførelse ville være:
- Testcase_1,
- Testcase_2,
- Testcase_3,
- testcase_1.
Derfor har store bogstaver prioritet over små bogstaver metode navne.
Kodeimplementering til tilfældig klasse
Vi opdaterer nu JUnit 5 klasse JUnit5TestOrder.java til at bruge kommentaren med Random.class
Kodestykket til Junit5TestOrder.java
@TestMethodOrder (Random.class) public class JUnit5TestOrder {
Vi kørte klassen to gange, og vi så, at hver gang vi kørte klassen, blev rækkefølgen af testudførelsen tilfældigt ordnet.
Efter udførelse af klassefilen til første gang , rækkefølgen af testudførelsen var:
- Testcase_2,
- Testcase_1
- Testcase_3
Ordren til udførelse, da den løb for sekund tiden viste:
- Testcase_2,
- Testcase_3
- Testcase_1 .
Kodeimplementering for OrderAnnotation.class
Vi opdaterer nu JUnit 5 klasse JUnit5TestOrder.java til at bruge kommentaren med OrderAnnotation.class. Annotationen @Bestille vil også spille en vigtig rolle i prioriteringen af testmetoderne her.
Kodestykket til 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 '); } }
Så i denne strategi for opsætning af ordren til testudførelse tvinger @Order-annotering testmetoderne til at køre pr. ordreværdi bliver sat til det.
Jo lavere værdien af @ Order for en testmetode er, jo højere er dens prioritet under udførelse.
Efter udførelse kørte rækkefølgen af testene som følger:
- Testcase_3,
- Testcase_1
- Testcase_2, fordi rækkefølgen for testsagerne er henholdsvis 1,2 og 3.
Det er derfor, det ikke betyder noget, om testsagerne er skrevet i rækkefølge. Desuden betyder det ikke noget, om metodens navne er eller ikke er i alfanumerisk rækkefølge.
JUnit 5: Oprettelse af brugerdefineret ordre
Derudover understøtter JUnit 5 de indbyggede ordreklasser også brugerdefinerede ordrer ved at implementere grænsefladen Metode Bestilling . Fra og med JUnit 5 version 5.4 understøttes den tilpassede sortering.
Lad os hurtigt se, hvordan man opretter og implementerer en brugerdefineret ordre efter metodelængde.
Trin 1: Oprettet en brugerdefineret ordreklasse, der implementerer MethodOrderer-interface og navngiver klassen som TestCaseLengthOrder
Koden til 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())); } }
TestCaseLengthOrder kode forklaring:
- En brugerdefineret ordreklasse oprettes ved at implementere MethodOrderer-grænsefladen.
- void orderMethods (MethodOrderContext context) {} metode, der er den indbyggede metode implementeret fra Interface MethodOrderer. Her defineres implementeringen af testbestillingslogikken.
- MethodDescriptor er en grænseflade, der omslutter detaljer om en metode:
- Metoden MethodDescriptor.getMethod () får metodens navn til denne deskriptor.
- Metodenavnet konverteres til streng med metoden getName () dvs. MethodDescriptor.getMethod (). GetName () og
- Metodelængden () henter længden af metoden (ligesom string.length () henter længden af en strengværdi).
- Alle metodens navne sammenlignes med hinanden ved hjælp af CompareTo () -metoden.
- Metoden getMethodDescriptors () får listen over alle metodebeskrivere i en klasse.
- Metoden sort () sorterer MethodDescriptor-objekterne.
Nu hvor vi har forstået hver API i MethodOrderer klart, håber vi, at det er let at fortolke ovenstående kode.
Trin 2 : Brug den tilpassede ordreklasse, ligesom du bruger en hvilken som helst indbygget rækkefølge i testklassen.
Som input til kommentaren @ TestMethodOrder.
Koden til 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(){ }
Trin 3:
Efter udførelse af JUnit_CustomOrder.class , rækkefølgen af testudførelsen er som følger baseret på den stigende rækkefølge af længden af testsagenes navn:
- tilføje(),
- subt (),
- del ()
- formere sig()
Konklusion
For at afslutte denne tutorial om JUnit Test Execution Order.
- Vi lærte, hvordan man indstiller rækkefølgen af testsager ved hjælp af specifikke kommentarer såvel som specifikke klasser.
- Vi lærte også forskellige måder at bestille test på JUnit 4 og JUnit 5, baseret på hvilke ordrestrategierne ændrede sig.
- Desuden lærte vi, hvordan vi i JUnit 5 også kunne oprette en tilpasset sorteringsklasse og bruge den til bestilling af testsagerne under udførelsen.
=> Se på JUnit Beginners Guide her.
Anbefalet læsning
- JUnit-test: Sådan skriver du JUnit-testtilfælde med eksempler
- Liste over JUnit-kommentarer: 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
- Hvad er en JUnit-testarmatur: Vejledning med JUnit 4-eksempler
- JUnit Tutorial for begyndere - Hvad er JUnit-test
- Flere måder at udføre JUnit-test på
- Sådan køres udførelse i stor skala af appiumtests parallelt