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.