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.