Rækkefølgen af tests i JUnit
1. Oversigt
Som standard, JUnit kører tests ved hjælp af en deterministisk, men uforudsigelig rækkefølge (MethodSorters.DEFAULT).
I de fleste tilfælde er denne adfærd perfekt og acceptabel; men der er tilfælde, hvor vi har brug for at håndhæve en bestemt ordre.
2. Testordre i JUnit 5
I JUnit 5, vi kan bruge @TestMethodOrder for at kontrollere udførelsesrækkefølgen for test.
Vi kan bruge vores egne Metode Bestilling, som vi vil se senere, eller vi kan vælge en af tre indbyggede bestillere:
- @Bestille Kommentar
- Alfanumerisk Bestille
- Tilfældig ordre
2.1. Bruger @Bestille Kommentar
Vi kan bruge @Bestille anmærkning for at håndhæve test til at køre i en bestemt rækkefølge.
I det følgende eksempel køres metoderne i denne rækkefølge - første test (), derefter anden test (), og endelig, tredje test ():
@TestMethodOrder (OrderAnnotation.class) offentlig klasse OrderAnnotationUnitTest {privat statisk StringBuilder output = ny StringBuilder (""); @Test @Order (1) public void firstTest () {output.append ("a"); } @Test @Order (2) offentlig ugyldig secondTest () {output.append ("b"); } @Test @Order (3) offentlig ugyldig thirdTest () {output.append ("c"); } @AfterAll offentlig statisk ugyldighed assertOutput () {assertEquals (output.toString (), "abc"); }}
2.2. Ved brug af Alfanumerisk Bestille
Vi kan også køre tests baseret på deres navne i alfanumerisk rækkefølge:
@TestMethodOrder (Alphanumeric.class) offentlig klasse AlphanumericOrderUnitTest {privat statisk StringBuilder output = ny StringBuilder (""); @Test offentligt annullerer myATest () {output.append ("A"); } @ Test offentlig annullerer myBTest () {output.append ("B"); } @ Test offentligt ugyldigt myaTest () {output.append ("a"); } @AfterAll offentlig statisk ugyldighed assertOutput () {assertEquals (output.toString (), "ABa"); }}
Bemærk, at alfanumerisk rækkefølge er mellem store og små bogstaver, så store bogstaver kommer først og derefter små bogstaver.
Testene køres i denne rækkefølge: myATest (), myBTest () og endelig myaTest ().
2.3. Brug af en brugerdefineret ordre
Langt om længe, vi kan bruge vores egen brugerdefinerede ordre ved at implementere Metode Bestilling interface.
I vores CustomOrder, vi bestiller testene baseret på deres navne i en alfanumerisk rækkefølge, der ikke er følsom over for store og små bogstaver:
offentlig klasse CustomOrder implementerer MethodOrderer {@Override public void orderMethods (MethodOrdererContext context) {context.getMethodDescriptors (). sort ((MethodDescriptor m1, MethodDescriptor m2) -> m1.getMethod (). getName (). CompareToIgnoreCase (m2.get) .getnavn ())); }}
Så bruger vi CustomOrder at køre de samme tests fra vores tidligere eksempel i denne rækkefølge - myATest (), myaTest (), og endelig, myBTest ():
@TestMethodOrder (CustomOrder.class) public class CustomOrderUnitTest {// ... @AfterAll public static ugyldig assertOutput () {assertEquals (output.toString (), "AaB"); }}
3. Testordre i JUnit 4
Hvis du stadig bruger JUnit 4, er API'erne til bestillingstest lidt anderledes.
Lad os også gennemgå mulighederne for at opnå dette i tidligere versioner.
3.1. Ved brug af MethodSorters.DEFAULT
Denne standardstrategi sammenligner testmetoder ved hjælp af deres hashkoder. I tilfælde af en hashkollision anvendes den leksikografiske rækkefølge:
@FixMethodOrder (MethodSorters.DEFAULT) offentlig klasse DefaultOrderOfExecutionTest {privat statisk StringBuilder-output = ny StringBuilder (""); @Test offentlig ugyldig secondTest () {output.append ("b"); } @Test offentlig ugyldig thirdTest () {output.append ("c"); } @Test offentlig ugyldig firstTest () {output.append ("a"); } @AfterClass offentlig statisk ugyldighed assertOutput () {assertEquals (output.toString (), "cab"); }}
Når vi udfører testene i klassen ovenfor, ser vi, at de alle består, inklusive assertOutput ().
3.2. Ved brug af MethodSorters.JVM
En anden bestillingsstrategi er MethodSorters.JVM – denne strategi bruger den naturlige JVM-ordre - som kan være forskellig for hver kørsel:
@FixMethodOrder (MethodSorters.JVM) offentlig klasse JVMOrderOfExecutionTest {// samme som ovenfor}
Hver gang vi udfører testene i denne klasse, får vi et andet resultat.
3.3. Ved brug af MethodSorters.NAME_ASCENDING
Endelig kan denne strategi bruges til at køre test i deres leksikografiske rækkefølge:
@FixMethodOrder (MethodSorters.NAME_ASCENDING) offentlig klasse NameAscendingOrderOfExecutionTest {// samme som ovenfor @AfterClass offentlig statisk ugyldig assertOutput () {assertEquals (output.toString (), "abc"); }}
Når vi udfører testene i denne klasse, ser vi ligeledes, at de alle består, inklusive assertOutput (), som bekræfter den eksekveringsordre, som vi angav med kommentaren.
4. Konklusion
I denne hurtige vejledning gennemgik vi måderne til at indstille den eksekveringsrækkefølge, der er tilgængelig i JUnit.
Og som altid kan eksemplerne i denne artikel findes på GitHub.