Prechod z JUnit 4 na JUnit 5
1. Prehľad
V tomto článku uvidíme, ako môžeme migrovať z JUnit 4 na najnovšie vydanie JUnit 5 - s prehľadom rozdielov medzi týmito dvoma verziami knižnice.
Všeobecné pokyny na používanie JUnit 5 nájdete v našom článku tu.
2. JUnit 5 Výhody
Začnime s predchádzajúcou verziou - JUnit 4 má niekoľko jasných obmedzení:
- Celý rámec bol obsiahnutý v knižnici s jednou nádobou. Je potrebné importovať celú knižnicu, aj keď je vyžadovaná iba určitá vlastnosť. V JUnit 5 získame viac podrobností a môžeme importovať iba to, čo je nevyhnutné
- Jeden testovací bežec môže súčasne vykonávať iba testy v JUnit 4 (napr. SpringJUnit4ClassRunner alebo Parametrizované ). JUnit 5 umožňuje súčasne pracovať viacerým bežcom
- JUnit 4 nikdy nepokročil nad rámec Java 7 a prichádzal o veľa funkcií z Java 8. JUnit 5 dobre využíva funkcie Java 8
Cieľom JUnit 5 bolo úplne prepísať JUnit 4, aby sa vyriešila väčšina z týchto nevýhod.
3. Rozdiely
JUnit 4 bol rozdelený do modulov, ktoré obsahujú JUnit 5:
- Platforma JUnit - tento modul obsahuje všetky rozširujúce rámce, ktoré by nás mohli zaujímať pri vykonávaní, objavovaní a vykazovaní testov
- JUnit Vintage - tento modul umožňuje spätnú kompatibilitu s JUnit 4 alebo dokonca JUnit 3
3.1. Anotácie
JUnit 5 prichádza s dôležitými zmenami v rámci svojich anotácií. Najdôležitejšie je, že už nemôžeme používať @Test anotácia pre upresnenie očakávaní.
The očakávané parameter v JUnit 4:
@ Test (očakáva sa = Exception.class) public void shouldRaiseAnException () vyvolá výnimku {// ...}
Teraz môžeme použiť metódu tvrdiťHodí:
public void shouldRaiseAnException () hodí Exception {Assertions.assertThrows (Exception.class, () -> {// ...}); }
The čas vypršal atribút v JUnit 4:
@Test (timeout = 1) public void shouldFailBecauseTimeout () vyvolá InterruptedException {Thread.sleep (10); }
Teraz assertTimeout metóda v JUnit 5:
@Test public void shouldFailBecauseTimeout () hodí InterruptedException {Assertions.assertTimeout (Duration.ofMillis (1), () -> Thread.sleep (10)); }
Ďalšie anotácie, ktoré boli zmenené v rámci JUnit 5:
- @ Predtým anotácia bola premenovaná na @BeforeEach
- @ Potom anotácia bola premenovaná na @AfterEach
- @BeforeClass anotácia bola premenovaná na @BeforeAll
- @Po hodine anotácia bola premenovaná na @Po všetkom
- @Ignorovať anotácia bola premenovaná na @Zakázané
3.2. Tvrdenia
Teraz môžeme písať kontrolné správy lambda v JUnit 5, čo umožňuje lenivému vyhodnoteniu preskočiť konštrukciu zložitej správy, kým to nebude potrebné:
@Test public void shouldFailBecauseTheNumbersAreNotEqual_lazyEvaluation () {Assertions.assertTrue (2 == 3, () -> "Čísla" + 2 + "a" + 3 + "nie sú rovnaké!"); }
Môžeme tiež zoskupiť tvrdenia v JUnit 5:
@Test public void shouldAssertAllTheGroup () {List list = Arrays.asList (1, 2, 4); Assertions.assertAll ("Zoznam nie je prírastkový", () -> Assertions.assertEquals (list.get (0) .intValue (), 1), () -> Assertions.assertEquals (list.get (1) .intValue ( ), 2), () -> Assertions.assertEquals (list.get (2) .intValue (), 3)); }
3.3. Domnienky
Nové Domnienky trieda je teraz v org.junit.jupiter.api. Predpoklady. JUnit 5 plne podporuje existujúce metódy predpokladov v JUnit 4 a tiež pridáva množinu nových metód, ktoré umožňujú vykonávanie niektorých tvrdení iba v konkrétnych scenároch:
@Test public void whenEnvironmentIsWeb_thenUrlsShouldStartWithHttp () {acquingThat ("WEB" .equals (System.getenv ("ENV")), () -> {assertTrue ("http" .startsWith (adresa));}); }
3.4. Označovanie a filtrovanie
V JUnit 4 sme mohli zoskupiť testy pomocou @Category anotácia. S JUnit 5 sa @Category anotácia sa nahradí @Tag anotácia:
@Tag ("anotácie") @Tag ("junit5") @RunWith (JUnitPlatform.class) verejná trieda AnnotationTestExampleTest {/*...*/}
Konkrétne značky môžeme zahrnúť / vylúčiť pomocou znaku maven-surefire-plugin:
maven-surefire-plugin junit5
3.5. Nové poznámky k testom
The @RunWith sa použil na integráciu testovacieho kontextu s inými rámcami alebo na zmenu celkového toku vykonávania v testovacích prípadoch v JUnit 4.
S JUnit 5 teraz môžeme používať @ExtendWith anotácia, ktorá poskytuje podobnú funkčnosť.
Ako príklad môžeme použiť funkcie pružiny v JUnit 4:
@RunWith (SpringJUnit4ClassRunner.class) @ContextConfiguration ({"/app-config.xml", "/test-data-access-config.xml"}) verejná trieda SpringExtensionTest {/*...*/}
Teraz je to v JUnit 5 jednoduché rozšírenie:
@ExtendWith (SpringExtension.class) @ContextConfiguration ({"/app-config.xml", "/test-data-access-config.xml"}) verejná trieda SpringExtensionTest {/*...*/}
3.6. Nové poznámky k testovacím pravidlám
V JUnit 4 sa @ Pravidlo a @ClassRule poznámky boli použité na pridanie špeciálnej funkčnosti testov.
V JUnit 5. môžeme reprodukovať rovnakú logiku pomocou @ExtendWith anotácia.
Povedzme napríklad, že v JUnit 4 máme vlastné pravidlo na písanie záznamov pred a po teste:
public class TraceUnitTestRule implementuje TestRule {@Override public Statement apply (Statement base, Description description) {return new Statement () {@Override public void Evaluate () throws Throwable {// Pred a po sledovaní hodnotenia tu ...}}; }}
A implementujeme to do testovacej sady:
@Rule public TraceUnitTestRule traceRuleTests = nové TraceUnitTestRule ();
V JUnit 5 môžeme to isté písať oveľa intuitívnejším spôsobom:
verejná trieda TraceUnitExtension implementuje AfterEachCallback, BeforeEachCallback {@Override public void beforeEach (TestExtensionContext context) vyvolá Exception {// ...} @Override public void afterEach (TestExtensionContext context) vyvolá Exception {// ...}}
Používajú sa JUnit 5 AfterEachCallback a BeforeEachCallback rozhrania dostupné v balení org.junit.jupiter.api.extension, toto pravidlo ľahko implementujeme do testovacej sady:
@RunWith (JUnitPlatform.class) @ExtendWith (TraceUnitExtension.class) verejná trieda RuleExampleTest {@Test verejná neplatnosť whenTracingTests () {/*...*/}}
3.7. JUnit 5 Vintage
JUnit Vintage pomáha pri migrácii testov JUnit spustením testov JUnit 3 alebo JUnit 4 v kontexte JUnit 5.
Môžeme ho použiť importom JUnit Vintage Engine:
org.junit.vintage test junit-vintage-engine $ {junit5.vintage.version}
4. Záver
Ako sme videli v tomto článku, JUnit 5 je modulárny a moderný rámec JUnit 4. Zaviedli sme hlavné rozdiely medzi týmito dvoma verziami a naznačili sme, ako migrovať z jednej do druhej.
Celú implementáciu tohto tutoriálu nájdete na viac ako na GitHub.