Overføre fra JUnit 4 til JUnit 5

1. Oversikt

I denne artikkelen ser vi hvordan vi kan migrere fra JUnit 4 til den siste JUnit 5-utgivelsen - med en oversikt over forskjellene mellom de to versjonene av biblioteket.

For generelle retningslinjer for bruk av JUnit 5, se vår artikkel her.

2. Fordeler med JUnit 5

La oss starte med den forrige versjonen - JUnit 4 har noen klare begrensninger:

  • Hele rammeverket var inneholdt i et enkelt krukkebibliotek. Hele biblioteket må importeres, selv når bare en bestemt funksjon er nødvendig. I JUnit 5 får vi mer granularitet og kan bare importere det som er nødvendig
  • Én testløper kan bare utføre tester i JUnit 4 om gangen (f.eks. SpringJUnit4ClassRunner eller Parameterisert ). JUnit 5 lar flere løpere jobbe samtidig
  • JUnit 4 avanserte aldri utover Java 7, og savner mange funksjoner fra Java 8. JUnit 5 benytter Java 8-funksjonene godt

Ideen bak JUnit 5 var å omskrive JUnit 4 fullstendig for å løse de fleste av disse ulempene.

3. Forskjeller

JUnit 4 ble delt inn i moduler som består av JUnit 5:

  • JUnit-plattform - denne modulen rammer alle utvidelsesrammer som vi kan være interessert i å utføre, oppdage og rapportere
  • JUnit Vintage - denne modulen tillater bakoverkompatibilitet med JUnit 4 eller til og med JUnit 3

3.1. Kommentarer

JUnit 5 kommer med viktige endringer i kommentarene. Den viktigste er at vi ikke lenger kan bruke @Test kommentar for å spesifisere forventninger.

De forventet parameter i JUnit 4:

@Test (forventet = Exception.class) offentlig tomrom skalRaiseAnException () kaster Unntak {// ...}

Nå kan vi bruke en metode hevder Kaster:

offentlig tomrom skalRaiseAnException () kaster unntak {Assertions.assertThrows (Exception.class, () -> {// ...}); }

De pause attributt i JUnit 4:

@Test (timeout = 1) public void shouldFailBecauseTimeout () kaster InterruptedException {Thread.sleep (10); }

Nå, den assertTimeout metode i JUnit 5:

@Test offentlig ugyldig shouldFailBecauseTimeout () kaster InterruptedException {Assertions.assertTimeout (Duration.ofMillis (1), () -> Thread.sleep (10)); }

Andre merknader som ble endret i JUnit 5:

  • @Før merknader blir omdøpt til @BeforeEach
  • @Etter merknader blir omdøpt til @EfterEach
  • @BeforeClass merknader blir omdøpt til @BeforeAll
  • @Etter timen merknader blir omdøpt til @Tross alt
  • @Overse merknader blir omdøpt til @Funksjonshemmet

3.2. Påstander

Vi kan nå skrive påstandsmeldinger i en lambda i JUnit 5, slik at lat evaluering kan hoppe over kompleks meldingskonstruksjon til det er nødvendig:

@Test offentlig ugyldig shouldFailBecauseTheNumbersAreNotEqual_lazyEvaluation () {Assertions.assertTrue (2 == 3, () -> "Tall" + 2 + "og" + 3 + "er ikke like!"); }

Vi kan også gruppere påstander i JUnit 5:

@Test offentlig ugyldig shouldAssertAllTheGroup () {List list = Arrays.asList (1, 2, 4); Assertions.assertAll ("List is not incremental", () -> Assertions.assertEquals (list.get (0) .intValue (), 1), () -> Assertions.assertEquals (list.get (1) .intValue ( ), 2), () -> Assertions.assertEquals (list.get (2) .intValue (), 3)); }

3.3. Antagelser

Den nye Antagelser klassen er nå inne org.junit.jupiter.api.Assumptions. JUnit 5 støtter fullt ut de eksisterende antagelsesmetodene i JUnit 4 og legger også til et sett med nye metoder som bare tillater kjøring av visse påstander under spesifikke scenarier:

@Test offentlig ugyldig nårEnvironmentIsWeb_thenUrlsShouldStartWithHttp () {assumingThat ("WEB" .equals (System.getenv ("ENV")), () -> {assertTrue ("http" .startsWith (address));}); }

3.4. Merking og filtrering

I JUnit 4 kunne vi gruppere tester ved å bruke @Kategori kommentar. Med JUnit 5 er den @Kategori merknader blir erstattet med @Stikkord kommentar:

@Tag ("annotasjoner") @Tag ("junit5") @RunWith (JUnitPlatform.class) offentlig klasse AnnotationTestExampleTest {/*...*/}

Vi kan inkludere / ekskludere bestemte koder ved hjelp av maven-surefire-plugin:

   maven-surefire-plugin junit5 

3.5. Nye merknader for løpstester

De @RunWith ble brukt til å integrere testkonteksten med andre rammer eller for å endre den generelle gjennomføringsflyten i testsakene i JUnit 4.

Med JUnit 5 kan vi nå bruke @ExtendWith kommentar for å gi lignende funksjonalitet.

For eksempel, for å bruke Spring-funksjonene i JUnit 4:

@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration ({"/app-config.xml", "/test-data-access-config.xml"}) offentlig klasse SpringExtensionTest {/*...*/}

Nå, i JUnit 5 er det en enkel utvidelse:

@ExtendWith (SpringExtension.class) @ContextConfiguration ({"/app-config.xml", "/test-data-access-config.xml"}) offentlig klasse SpringExtensionTest {/*...*/} 

3.6. Kommentarer om nye testregler

I JUnit 4 er @Regel og @ClassRule merknader ble brukt for å legge til spesiell funksjonalitet i testene.

I JUnit 5. kan vi gjengi den samme logikken ved hjelp av @ExtendWith kommentar.

La oss for eksempel si at vi har en tilpasset regel i JUnit 4 for å skrive loggspor før og etter en test:

offentlig klasse TraceUnitTestRule implementerer TestRule {@Override public Erklæring gjelder (Uttalelsesbase, Beskrivelse av beskrivelse) {return new Statement () {@Override public void evaluere () kaster Throwable {// Før og etter en evaluering som sporer her ...}} }}

Og vi implementerer det i en testpakke:

@Rule public TraceUnitTestRule traceRuleTests = ny TraceUnitTestRule (); 

I JUnit 5 kan vi skrive det samme på en mye mer intuitiv måte:

offentlig klasse TraceUnitExtension implementerer AfterEachCallback, BeforeEachCallback {@Override public void beforeEach (TestExtensionContext context) throw Exception {// ...} @Override public void afterEach (TestExtensionContext context) throw Exception {// ...}}

Bruker JUnit 5 AfterEachCallback og BeforeEachCallback grensesnitt tilgjengelig i pakken org.junit.jupiter.api.extension, vi implementerer denne regelen enkelt i testpakken:

@RunWith (JUnitPlatform.class) @ExtendWith (TraceUnitExtension.class) offentlig klasse RuleExampleTest {@Test offentlig ugyldig nårTracingTests () {/*...*/}}

3.7. JUnit 5 Vintage

JUnit Vintage hjelper til med migrering av JUnit-tester ved å kjøre JUnit 3 eller JUnit 4-tester innenfor JUnit 5-sammenheng.

Vi kan bruke den ved å importere JUnit Vintage Engine:

 org.junit.vintage junit-vintage-engine $ {junit5.vintage.version} test 

4. Konklusjon

Som vi har sett i denne artikkelen, er JUnit 5 et modulært og moderne inntrykk av JUnit 4-rammeverket. Vi har introdusert de store forskjellene mellom disse to versjonene og antydet hvordan vi kan migrere fra en til en annen.

Den fulle implementeringen av denne opplæringen finner du over på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found