Prelazak s JUnit 4 na JUnit 5
1. Pregled
U ovom ćemo članku vidjeti kako možemo preći s JUnit 4 na najnovije izdanje JUnit 5 - s pregledom razlika između dvije verzije knjižnice.
Opće smjernice o korištenju JUnit 5 potražite ovdje.
2. JUNIT 5 Prednosti
Počnimo s prethodnom verzijom - JUnit 4 ima neka jasna ograničenja:
- Čitav okvir bio je sadržan u jednoj knjižnici jar. Cijelu knjižnicu treba uvesti čak i kad je potrebna samo određena značajka. U JUnit 5 dobivamo više detalja i možemo uvesti samo ono što je potrebno
- Jedan trkač može istodobno provoditi testove samo u JUnit 4 (npr. SpringJUnit4ClassRunner ili Parametarizirano ). JUnit 5 omogućava istodobnom radu više trkača
- JUnit 4 nikad nije napredovao dalje od Jave 7, propustivši mnoge značajke Jave 8. JUnit 5 dobro koristi značajke Java 8
Ideja koja stoji iza JUnit 5 bila je u potpunosti prepisati JUnit 4 kako bi se riješio većina ovih nedostataka.
3. Razlike
JUnit 4 podijeljen je u module koji čine JUnit 5:
- JUnit platforma - ovaj modul obuhvaća sve okvire proširenja koji bi nas mogli zanimati za izvršavanje testa, otkrivanje i izvještavanje
- JUnit Vintage - ovaj modul omogućuje povratnu kompatibilnost s JUnit 4 ili čak JUnit 3
3.1. Bilješke
JUnit 5 dolazi s važnim promjenama unutar svojih bilješki. Najvažnija je ona koju više ne možemo koristiti @Test napomena za specificiranje očekivanja.
The očekivano parametar u JUnit 4:
@Test (očekuje se = Exception.class) javna praznina shouldRaiseAnException () baca iznimku {// ...}
Sada se možemo poslužiti metodom assertThrows:
javna praznina shouldRaiseAnException () baca Exception {Assertions.assertThrows (Exception.class, () -> {// ...}); }
The pauza atribut u JUnit 4:
@Test (timeout = 1) javna praznina shouldFailBecauseTimeout () baca InterruptedException {Thread.sleep (10); }
Sada, assertTimeout metoda u JUnit 5:
@Test public void shouldFailBecauseTimeout () baca InterruptedException {Assertions.assertTimeout (Duration.ofMillis (1), () -> Thread.sleep (10)); }
Ostale bilješke koje su promijenjene unutar JUnit-a 5:
- @Prije napomena se preimenuje u @BeforeEach
- @Nakon napomena se preimenuje u @AfterEach
- @BeforeClass napomena se preimenuje u @BeforeAll
- @Nakon nastave napomena se preimenuje u @Nakon svega
- @Zanemariti napomena se preimenuje u @Onemogućeno
3.2. Tvrdnje
Sada možemo pisati poruke tvrđenja lambda-om u JUnit-u 5, omogućujući lijenoj procjeni da preskoči složenu konstrukciju poruke dok ne zatreba:
@Test public void shouldFailBecauseTheNumbersAreNotEqual_lazyEvaluation () {Assertions.assertTrue (2 == 3, () -> "Brojevi" + 2 + "i" + 3 + "nisu jednaki!"); }
Tvrdnje također možemo grupirati u JUnit 5:
@Test javna praznina shouldAssertAllTheGroup () {Popis popisa = Arrays.asList (1, 2, 4); Assertions.assertAll ("Popis nije inkrementalni", () -> Assertions.assertEquals (list.get (0) .intValue (), 1), () -> Assertions.assertEquals (list.get (1) .intValue ( ), 2), () -> Assertions.assertEquals (list.get (2) .intValue (), 3)); }
3.3. Pretpostavke
Novi Pretpostavke razred je sada u org.junit.jupiter.api.Pretpostavke. JUnit 5 u potpunosti podržava postojeće metode pretpostavki u JUnit 4, a također dodaje skup novih metoda koje omogućavaju pokretanje nekih tvrdnji samo u određenim scenarijima:
@Test public void whenEnvironmentIsWeb_thenUrlsShouldStartWithHttp () {pretpostavljajućiThat ("WEB" .equals (System.getenv ("ENV")), () -> {assertTrue ("http" .startsWith (adresa));}); }
3.4. Označavanje i filtriranje
U JUnit-u 4 mogli smo grupirati testove pomoću @Kategorija bilješka. Uz JUnit 5, @Kategorija napomena se zamjenjuje s @Označiti napomena:
@Tag ("annotations") @Tag ("junit5") @RunWith (JUnitPlatform.class) javna klasa AnnotationTestExampleTest {/*...*/}
Možemo uključiti / isključiti određene oznake pomoću maven-surefire-plugin:
maven-surefire-plugin junit5
3.5. Nove bilješke za izvođenje testova
The @RunWith je korišten za integraciju konteksta testa s drugim okvirima ili za promjenu ukupnog tijeka izvršavanja u test slučajevima u JUnit 4.
S JUnit 5 sada možemo koristiti @ExtendWith napomena za pružanje slične funkcionalnosti.
Kao primjer, za korištenje značajki Spring u JUnit 4:
@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration ({"/app-config.xml", "/test-data-access-config.xml"}) javna klasa SpringExtensionTest {/*...*/}
Sada je u JUnit 5 jednostavno proširenje:
@ExtendWith (SpringExtension.class) @ContextConfiguration ({"/app-config.xml", "/test-data-access-config.xml"}) javna klasa SpringExtensionTest {/*...*/}
3.6. Bilješke o novim pravilima ispitivanja
U JUNITU 4, @Pravilo i @ClassRule napomene su korištene za dodavanje posebne funkcionalnosti testovima.
U JUnit 5. možemo reproducirati istu logiku koristeći @ExtendWith bilješka.
Na primjer, recimo da u JUnit 4 imamo prilagođeno pravilo za pisanje tragova dnevnika prije i nakon testa:
javna klasa TraceUnitTestRule implementira TestRule {@Override primjenjuje se javna izjava (baza iskaza, opis opisa) {return new Statement () {@Override public void evaluacija () baca bacanje {// Prije i nakon praćenja evaluacije ovdje ...}}; }}
I implementiramo ga u testni paket:
@Rule public TraceUnitTestRule traceRuleTests = new TraceUnitTestRule ();
U JUnit 5 isto možemo napisati na puno intuitivniji način:
javna klasa TraceUnitExtension implementira AfterEachCallback, BeforeEachCallback {@Override public void beforeEach (TestExtensionContext context) baca izuzetak {// ...} @Override public void afterEach (TestExtensionContext context) baca izuzetak {// ...}}
Korištenje JUnit-a 5 AfterEachCallback i BeforeEachCallback sučelja dostupna u paketu org.junit.jupiter.api.extension, ovo pravilo lako implementiramo u testni paket:
@RunWith (JUnitPlatform.class) @ExtendWith (TraceUnitExtension.class) javna klasa RuleExampleTest {@Test public void whenTracingTests () {/*...*/}}
3.7. JUNIT 5 Vintage
JUnit Vintage pomaže u migraciji JUnit testova pokretanjem testova JUnit 3 ili JUnit 4 unutar konteksta JUnit 5.
Možemo ga koristiti uvozom JUnit Vintage Engine:
test org.junit.vintage junit-vintage-engine $ {junit5.vintage.version}
4. Zaključak
Kao što smo vidjeli u ovom članku, JUnit 5 je modularan i moderan pristup JUnit 4 okviru. Uveli smo glavne razlike između ove dvije verzije i nagovijestili kako prelaziti s jedne na drugu.
Potpuna implementacija ovog vodiča može se naći u preko na GitHub-u.