Overflytning fra JUnit 4 til JUnit 5

1. Oversigt

I denne artikel vil vi se, hvordan vi kan migrere fra JUnit 4 til den seneste JUnit 5-udgivelse - med en oversigt over forskellene mellem de to versioner af biblioteket.

For vores generelle retningslinjer for brug af JUnit 5, se vores artikel her.

2. Fordele ved JUnit 5

Lad os starte med den tidligere version - JUnit 4 har nogle klare begrænsninger:

  • Hele rammen var indeholdt i et enkelt krukkebibliotek. Hele biblioteket skal importeres, selv når kun en bestemt funktion er påkrævet. I JUnit 5 får vi mere granularitet og kan kun importere, hvad der er nødvendigt
  • En testløber kan kun udføre test i JUnit 4 ad gangen (f.eks. SpringJUnit4ClassRunner eller Parameteriseret ). JUnit 5 tillader flere løbere at arbejde samtidigt
  • JUnit 4 avancerede aldrig ud over Java 7 og savnede mange funktioner fra Java 8. JUnit 5 gør god brug af Java 8-funktioner

Ideen bag JUnit 5 var at omskrive JUnit 4 fuldstændigt for at løse de fleste af disse ulemper.

3. Forskelle

JUnit 4 blev opdelt i moduler, der omfatter JUnit 5:

  • JUnit Platform - dette modul gennemgår alle de udvidelsesrammer, vi måske er interesserede i testudførelse, opdagelse og rapportering
  • JUnit Vintage - dette modul tillader bagudkompatibilitet med JUnit 4 eller endda JUnit 3

3.1. Kommentarer

JUnit 5 kommer med vigtige ændringer inden for sine kommentarer. Den vigtigste er, at vi ikke længere kan bruge @Prøve kommentar til angivelse af forventninger.

Det forventet parameter i JUnit 4:

@Test (forventet = Exception.class) offentlig tomrum skalRaiseAnException () kaster undtagelse {// ...}

Nu kan vi bruge en metode hævder kaster:

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

Det tiden er gået attribut i JUnit 4:

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

Nu, den assertTimeout metode i JUnit 5:

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

Andre kommentarer, der blev ændret inden for JUnit 5:

  • @Før annotering omdøbes til @BeforeEach
  • @Efter annotering omdøbes til @AfterEach
  • @BeforeClass annotering omdøbes til @BeforeAll
  • @Efter skole annotering omdøbes til @Trods alt
  • @Ignorere annotering omdøbes til @Handicappet

3.2. Påstande

Vi kan nu skrive påstandsbeskeder i en lambda i JUnit 5, så den dovne evaluering kan springe kompleks meddelelseskonstruktion over, indtil det er nødvendigt:

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

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

@Test offentlig ugyldighed 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 nu inde org.junit.jupiter.api.Antagelser. JUnit 5 understøtter fuldt ud de eksisterende antagelsesmetoder i JUnit 4 og tilføjer også et sæt nye metoder, der kun tillader kørsel af nogle påstande under specifikke scenarier:

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

3.4. Mærkning og filtrering

I JUnit 4 kunne vi gruppere tests ved hjælp af @Kategori kommentar. Med JUnit 5 er @Kategori kommentar erstattes med @Tag kommentar:

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

Vi kan inkludere / ekskludere bestemte tags ved hjælp af maven-surefire-plugin:

   maven-surefire-plugin junit5 

3.5. Nye kommentarer til løbende tests

Det @RunWith blev brugt til at integrere testkonteksten med andre rammer eller til at ændre den samlede eksekveringsstrøm i testsagerne i JUnit 4.

Med JUnit 5 kan vi nu bruge @ExtendWith kommentar for at give lignende funktionalitet.

For eksempel at bruge Spring-funktionerne i JUnit 4:

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

Nu, i JUnit 5 er det en simpel udvidelse:

@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 @Herske og @ClassRule annoteringer blev brugt til at tilføje speciel funktionalitet til test.

I JUnit 5. kan vi gengive den samme logik ved hjælp af @ExtendWith kommentar.

Sig for eksempel, at vi har en brugerdefineret regel i JUnit 4 til at skrive logspor før og efter en test:

offentlig klasse TraceUnitTestRule implementerer TestRule {@Override public Statement gælder (Erklæringsbase, Beskrivelse af beskrivelse) {returner ny Erklæring () {@Override offentlig ugyldighed evaluere () kaster Kastbar {// Før og efter en evaluering, der 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 meget mere intuitiv måde:

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

Brug af JUnit 5'er AfterEachCallback og BeforeEachCallback grænseflader tilgængelige i pakken org.junit.jupiter.api.extension, vi implementerer let denne regel i testpakken:

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

3.7. JUnit 5 Vintage

JUnit Vintage hjælper med migreringen af ​​JUnit-test ved at køre JUnit 3- eller JUnit 4-tests inden for JUnit 5-sammenhængen.

Vi kan bruge det ved at importere JUnit Vintage Engine:

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

4. Konklusion

Som vi har set i denne artikel, er JUnit 5 en modulær og moderne tilgang til JUnit 4-rammen. Vi har introduceret de store forskelle mellem disse to versioner og antydet, hvordan man migrerer fra den ene til den anden.

Den fulde implementering af denne vejledning kan findes i over på GitHub.