junit test execution order
Denne opplæringen forklarer hvordan du setter utførelsesordren for JUnit-testtilfeller. Du vil lære om merknader og klasser for å sette JUnit-testutførelsesordren i JUnit 4 vs JUnit 5:
Vi lærte hvordan du oppretter en testpakke, hvordan du legger til en kategori eller tagg i testsakene, og hvordan du filtrerer ut tester (ekskluderer eller inkluderer testcases) basert på kategorien eller taggen i vår forrige opplæring.
Dessuten lærte vi at i JUnit 4 har vi gjort det @Category, @IncludeCategory, og @ExcludeCategory for filtrering av testsakene mens JUnit 5 har @IncludeTags og @ExcludeTags å gjøre det samme.
JUnit 5 har flere filtreringsalternativer ved hjelp av merknader @IncludePackages, @ExcludePackages, og også merknader for å inkludere eller ekskludere klasser ved hjelp av klassens navnemønstre.
=> Sjekk her for å se A-Z av opplæringsprogrammer for JUnit .
Hva du vil lære:
JUnit Test Utførelsesordre
I denne opplæringen vil vi lære å sette en ordre for hver testtilfelle slik at de kjører i angitt rekkefølge. Vi lærer hvordan du bestiller tester i JUnit 4 så vel som i JUnit 5.
Testmetodene følger ikke en spesifikk rekkefølge som standard.Test tilfellene trenger ikke nødvendigvis å utføres i den rekkefølgen de er skrevet.
Det er forskjellige måter eller moduser for å angi rekkefølgen for utførelsen for testsakene. Vi vil også dykke inn i hvordan JUnit 4 varierer når vi bestiller testtilfeller sammenlignet med JUnit 5.
JUnit 4: @FixedMethodOrder, Class MethodSorters
Fra og med JUnit 4.11 har vi merknaden @FixMethodOrder og MethodSorters.class støtte anlegget for å sette en ordre for utførelse av en test.
Pakken org.junit.runners. * må importeres for å inkludere klassen MetoderSorterere . Denne klassen bestemmer hvordan testsakene må bestilles. MetoderSorterere ha tre enum verdier.
Nedenfor er klassens enumverdier sammen med formålet hver verdi tjener:
MethodSorters.DEFAULT | Denne enumverdien sorterer testutførelsen i en bestemt rekkefølge. Det er imidlertid aldri forutsigbart i hvilken rekkefølge det kan kjøre testsakene. |
Dette er grunnen til at du har kontrollen over avgjørelsen din om hvilken testcase som skal kjøres først og hvilke som skal følges neste. | |
Jeg har observert at en klasse med flere metoder sortert med DEFAULT enum når den utføres, forblir ordren den samme hver gang under testutførelsen. | |
Imidlertid er det ingen måte jeg kunne forutsi eller finne ut hvordan ordren ble satt. | |
MethodSorters.JVM | Rekkefølgen for testutførelse med JVM enum er som navnet tilsier, bestemt av JVM. |
I dette tilfellet vil testene utføres ikke i samme, men i tilfeldig rekkefølge, hver gang du kjører kurset. | |
Med andre ord endres rekkefølgen på testene under hvert løp. | |
MethodSorters.NAME_ASCENDING | Dette enum sorterer testmetodene i leksikografisk rekkefølge av metodens navn. Derfor kan du være trygg på at dette er den mest forutsigbare måten å bestille testutførelsen på. |
Du kan derfor på forhånd bestemme rekkefølgen av testene basert på den leksikografiske rekkefølgen på navnet du har angitt. |
Kommentaren @FixedMethodOrder tar inn inngangsparameteren til MetoderSorterere med enumverdien. Pakken som trengs for merknaden er org.junit.FixedMethodOrder.
La oss se hvordan den implementeres gjennom koden.
Kodeimplementering for MethodSorters.DEFAULT
La oss lage en JUnit-klassefil ‘ Junit4TestOrder.java ' hvor vi skal bruke MethodSorters.DEFAULT
Koden for 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 kjører klassen tre ganger og ser at den samme rekkefølgen av tester kjøres som nedenfor, men testtilfellene blir kanskje ikke utført i sortert rekkefølge.
Konsollvinduet viste resultatene som nedenfor - rekkefølgen for utførelse av test er TestCase_3, TestCase_1 og TestCase_2, og rekkefølgen endres ikke med antall løp.
Kodeimplementering for MethodSorters. JVM
Vi vil nå oppdatere ‘Junit4TestOrder.java’ for å ha MethodSorters.JVM
Kodebiten for Junit4TestOrder.java
@FixMethodOrder(MethodSorters . JVM ) public class JUnit4TestOrder {
Vi kjører klassen to ganger, og rekkefølgen på testenes utførelse endres for hver løp.
Konsollvinduet for først løp er som vist nedenfor:
Konsollvinduet for sekund løp er som vist nedenfor:
Følg nøye med på endringen i rekkefølgen testene utføres i begge løpeturer. Rekkefølgen til testene i de to løpene har vært forskjellig.
Kodeimplementering for MethodSorters.NAME_ASCENDING
Vi vil nå oppdatere ‘Junit4TestOrder.java’ for å ha MethodSorters.NAME_ASCENDING
Kodebiten for Junit4TestOrder.java
@FixMethodOrder(MethodSorters.NAME_ASCENDING) public class JUnit4TestOrder {
Vi kjører klassen to ganger, rekkefølgen på utførte tester forblir den samme og utføres i henhold til stigende rekkefølge av metodens navn.
Konsollvinduet viser resultatet av testene som er utført i rekkefølgen TestCase_1, TestCase_2 og TestCase_3.
JUnit 5: @TestMethodOrder, @Order, Interface MethodOrderer
For å kontrollere rekkefølgen for utførelse av tester hjelper enhetene nedenfor med å gjøre det samme:
- Kommentaren @ TestMethodOrder
- Merknaden @ Bestill
- Klassene som tilhører MethodOrderer-grensesnitt
De innebygde MethodOrderer-klassene 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 basert på navnene deres |
OrderAnnotation | org.junit.jupiter.api.MethodOrderer.OrderAnnotation | Sorterer testmetoder numerisk basert på verdiene sendt til kommentaren @ Order |
Tilfeldig | org.junit.jupiter.api.MethodOrderer.Random | Sorterer testmetoder tilfeldig, akkurat som i tilfellet MethodSorters.JVM i JUnit 4 |
La oss nå se på demonstrasjonen av hver av disse bestillingsstrategiene:
Kodeimplementering for alfanumerisk klasse
La oss lage en JUnit 5-klassefil som heter JUnit5TestOrder.java, samme som JUnit4TestOrder.java, og la oss bruke merknaden med Alphanumeric.class for å bestille testene alfanumerisk.
Koden for 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 kjørte klassen tre ganger og ser fortsatt den samme rekkefølgen av tester kjøres i alfanumerisk sortert rekkefølge av testmetodens navn.
Etter utførelse av klassefilen, rekkefølgen på testutførelsen:
- Testcase_1,
- Testcase_2 og
- Testcase_3
Merk: Den alfanumeriske sorteringsstrategien er store og små bokstaver så i tilfelle vi hadde en ny testsak med navnet testcase_1.
Rekkefølgen ville være:
- Testcase_1,
- Testcase_2,
- Testcase_3,
- testcase_1.
Derfor har store bokstaver prioritet fremfor små bokstaver.
Kodeimplementering for tilfeldig klasse
Vi vil nå oppdatere JUnit 5 klasse JUnit5TestOrder.java for å bruke kommentaren med Random.class
Kodebiten for Junit5TestOrder.java
@TestMethodOrder (Random.class) public class JUnit5TestOrder {
Vi kjørte klassen to ganger og vi så at hver gang vi kjørte klassen, ble rekkefølgen på testutførelsen tilfeldig ordnet.
Etter utførelse av klassefilen for første gang , rekkefølgen på testutførelsen var:
- Testcase_2,
- Testcase_1
- Testcase_3
Rekkefølgen da den kjørte for sekund tiden viste:
- Testcase_2,
- Testcase_3
- Testcase_1 .
Kodeimplementering for OrderAnnotation.class
Vi vil nå oppdatere JUnit 5-klassen JUnit5TestOrder.java for å bruke merknaden med OrderAnnotation.class. Kommentaren @Rekkefølge vil også spille en viktig rolle i prioritering av testmetodene her.
Kodebiten for 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 strategien for å sette opp bestillingen for utførelse av test, tvinger @ Orden-merknader testmetodene til å kjøre i henhold til ordreverdi blir satt for det.
Jo lavere verdien @bestillingen for en testmetode har, desto høyere prioritet har den under utførelsen.
Etter utførelse gikk rekkefølgen på testene som følger:
- Testcase_3,
- Testcase_1
- Testcase_2 fordi ordren som er satt for testsakene er henholdsvis 1,2 og 3.
Dette er grunnen til at det ikke betyr noe om testsakene er skrevet i orden. Dessuten spiller det ingen rolle om metodenavnene er eller ikke er i alfanumerisk rekkefølge.
JUnit 5: Opprette tilpasset ordre
Dessuten støtter JUnit 5 de innebygde ordreklassene, også tilpassede bestillinger ved å implementere grensesnittet Metode Bestilling . Fra og med JUnit 5 versjon 5.4 støttes den tilpassede sorteringen.
La oss raskt se hvordan du oppretter og implementerer en tilpasset ordre etter metodelengde.
Trinn 1: Opprettet en tilpasset ordreklasse som implementerer MethodOrderer-grensesnitt og kalt klassen som TestCaseLengthOrder
Koden for 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 tilpasset ordreklasse opprettes ved å implementere MethodOrderer-grensesnittet.
- void orderMethods (MethodOrderContext context) {} metode som er den innebygde metoden implementert fra Interface MethodOrderer. Her definerer du implementeringen av testbestillingslogikken.
- MethodDescriptor er et grensesnitt som inneholder detaljer om en metode:
- Metoden MethodDescriptor.getMethod () får metodens navn for denne deskriptoren.
- Metodenavnet konverteres til streng med metoden getName () dvs. MethodDescriptor.getMethod (). GetName () og
- Metodelengden () henter lengden på metoden (akkurat som string.length () henter lengden på en strengverdi).
- Alle metodenavnene sammenlignes med hverandre ved å bruke metoden comparTo ().
- Metoden getMethodDescriptors () får listen over alle metodebeskrivelsene i en klasse.
- Sort () -metoden sorterer MethodDescriptor-objektene.
Nå som vi har forstått hver API av MethodOrderer klart, håper vi at det er enkelt å tolke koden ovenfor.
Steg 2 : Bruk den tilpassede ordreklassen som du bruker hvilken som helst innebygd rekkefølge i testklassen.
Som en innspill til kommentaren @ TestMethodOrder.
Koden for 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(){ }
Trinn 3:
Post utførelse av JUnit_CustomOrder.class , er rekkefølgen for utførelse av test som følger basert på stigende rekkefølge av lengden på testsakenes navn:
- Legg til(),
- subt (),
- dele opp ()
- multiplisere()
Konklusjon
For å avslutte denne opplæringen om JUnit Test Execution Order.
- Vi lærte å sette rekkefølgen på testsaker ved hjelp av spesifikke merknader så vel som spesifikke klasser.
- Vi lærte også forskjellige måter å bestille tester for JUnit 4 og JUnit 5, basert på hvilke bestillingsstrategiene endret seg.
- Dessuten lærte vi hvordan vi i JUnit 5 også kunne lage en tilpasset sorteringsklasse og bruke den til å bestille testsaker under utførelsen.
=> Ta en titt på JUnit Beginners Guide her.
Anbefalt lesing
- JUnit-tester: Hvordan skrive JUnit-testtilfeller med eksempler
- Liste over JUnit-merknader: 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
- Hva er en JUnit-testarmatur: Veiledning med JUnit 4-eksempler
- JUnit Tutorial for nybegynnere - Hva er JUnit-testing
- Flere måter å utføre JUnit-tester på
- Hvordan kjøre storskala gjennomføring av appiumtester parallelt