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:

  1. @Bestille Kommentar
  2. Alfanumerisk Bestille
  3. 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.JVMdenne 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.