Sprievodca JUnitom 5

1. Prehľad

JUnit je jedným z najpopulárnejších rámcov na testovanie jednotiek v ekosystéme Java. Verzia JUnit 5 obsahuje množstvo vzrušujúcich noviniek, s cieľom je podpora nových funkcií v prostredí Java 8 a novších, ako aj umožnenie mnohých rôznych štýlov testovania.

2. Maven závislosti

Nastavenie JUnit 5.x.0 je celkom jednoduché, k našej musíme pridať nasledujúcu závislosť pom.xml:

 org.junit.jupiter test junit-jupiter-engine 5.1.0 

Je dôležité si uvedomiť, že táto verzia vyžaduje Java 8, aby fungoval.

A čo viac, teraz existuje priama podpora pre spustenie testov jednotiek na platforme JUnit v Eclipse, ako aj IntelliJ. Testy môžete samozrejme spustiť aj pomocou cieľa Maven Test.

Na druhej strane IntelliJ štandardne podporuje JUnit 5. Preto je spustenie JUnit 5 na IntelliJ celkom jednoduché, stačí kliknúť pravým tlačidlom myši -> Spustiť alebo Ctrl-Shift-F10.

3. Architektúra

JUnit 5 sa skladá z niekoľkých rôznych modulov z troch rôznych podprojektov:

3.1. Platforma JUnit

Platforma je zodpovedná za spustenie testovacích rámcov na JVM. Definuje stabilné a výkonné rozhranie medzi JUnit a jeho klientom, ako sú napríklad nástroje na vytváranie.

Konečným cieľom je, ako sa jeho klienti ľahko integrujú do JUnit pri objavovaní a vykonávaní testov.

Definuje tiež API TestEngine na vývoj testovacieho rámca, ktorý beží na platforme JUnit. Vďaka tomu môžete implementovať vlastný TestEngine plug-in testovacie knižnice tretích strán priamo do JUnit.

3.2. JUnit Jupiter

Tento modul obsahuje nové programovacie a rozširujúce modely pre písanie testov v JUnit 5. Nové anotácie v porovnaní s JUnit 4 sú:

  • @TestFactory - označuje metódu, ktorá je skúšobňou pre dynamické skúšky
  • @Zobraziť meno - definuje vlastný zobrazovaný názov pre testovaciu triedu alebo testovaciu metódu
  • @ Vnorené - označuje, že anotovaná trieda je vnorená nestatická testovacia trieda
  • @Tag - deklaruje značky pre testy filtrovania
  • @ExtendWith - slúži na registráciu vlastných rozšírení
  • @BeforeEach - označuje, že komentovaná metóda bude vykonaná pred každou testovacou metódou (predtým @ Predtým)
  • @AfterEach - označuje, že komentovaná metóda sa vykoná po každej testovacej metóde (predtým @ Potom)
  • @BeforeAll - označuje, že komentovaná metóda bude vykonaná pred všetkými testovacími metódami v aktuálnej triede (predtým @BeforeClass)
  • @Po všetkom - označuje, že komentovaná metóda bude vykonaná po všetkých testovacích metódach v aktuálnej triede (predtým @Po hodine)
  • @ Zakázať - slúži na vypnutie testovacej triedy alebo metódy (predtým @Ignorovať)

3.3. JUnit Vintage

Podporuje spustenie testov založených na JUnit 3 a JUnit 4 na platforme JUnit 5.

4. Základné anotácie

Aby sme prediskutovali nové anotácie, rozdelili sme časť do nasledujúcich skupín zodpovedných za vykonanie: pred testami, počas testov (voliteľné) a po testoch:

4.1. @BeforeAll a @BeforeEach

Nižšie je uvedený príklad jednoduchého kódu, ktorý sa má vykonať pred hlavnými testovacími prípadmi:

@BeforeAll static void setup () {log.info ("@ BeforeAll - vykoná sa raz pred všetkými testovacími metódami v tejto triede"); } @BeforeEach void init () {log.info ("@ BeforeEach - vykoná sa pred každou testovacou metódou v tejto triede"); }

Je dôležité si uvedomiť, že metóda s @BeforeAll anotácia musí byť statická, inak sa kód nebude kompilovať.

4.2. @Zobraziť meno a @Zakázané

Prejdime k novým metódam voliteľným pre test:

@DisplayName ("Jeden test úspešný") @Test void testSingleSuccessTest () {log.info ("Úspech"); } @Test @Disabled („Ešte nie je implementované“) void testShowSomething () {}

Ako vidíme, môžeme zmeniť zobrazovaný názov alebo deaktivovať metódu pomocou komentára pomocou nových anotácií.

4.3. @AfterEach a @Po všetkom

Na záver si povieme niečo o metódach spojených s operáciami po vykonaní testov:

@AfterEach void tearDown () {log.info ("@ AfterEach - spustený po každej testovacej metóde."); } @AfterAll static void done () {log.info ("@ AfterAll - vykonané po všetkých testovacích metódach."); }

Vezmite prosím na vedomie, že metóda s @Po všetkom musí to byť tiež statická metóda.

5. Tvrdenia a domnienky

JUnit 5 sa snaží využiť všetky výhody nových funkcií jazyka Java 8, najmä výrazov lambda.

5.1. Tvrdenia

Úlohy boli presunuté do org.junit.jupiter.api. Tvrdenia a boli výrazne vylepšené. Ako už bolo spomenuté, lambdas teraz môžete používať v tvrdeniach:

@Test void lambdaExpressions () {assertTrue (Stream.of (1, 2, 3) .stream () .mapToInt (i -> i) .sum ()> 5, () -> "Súčet by mal byť väčší ako 5" ); }

Aj keď je vyššie uvedený príklad triviálny, jednou z výhod použitia výrazu lambda pre správu s tvrdením je, že je lenivo vyhodnotená, čo môže ušetriť čas a zdroje, ak je konštrukcia správy drahá.

Teraz je tiež možné zoskupiť tvrdenia s assertAll () ktorá nahlási všetky neúspešné tvrdenia v rámci skupiny s a MultipleFailuresError:

 @Test void groupAssertions () {int [] numbers = {0, 1, 2, 3, 4}; assertAll ("numbers", () -> assertEquals (čísla [0], 1), () -> assertEquals (čísla [3], 3), () -> assertEquals (čísla [4], 1)); }

To znamená, že je teraz bezpečnejšie uvádzať zložitejšie tvrdenia, pretože budete môcť presne určiť presné miesto akejkoľvek chyby.

5.2. Domnienky

Predpoklady sa používajú na vykonávanie testov, iba ak sú splnené určité podmienky. Spravidla sa používa pre vonkajšie podmienky, ktoré sú potrebné na správne fungovanie testu, ale ktoré priamo nesúvisia s tým, čo sa testuje.

Predpoklad môžete deklarovať pomocou predpokládaťTrue (), převzaťFalse ()a za predpokladu, že().

@Test void trueAssumption () {převzaťTrue (5> 1); assertEquals (5 + 2, 7); } @Test void falseAssumption () {převzaťFalse (5 assertEquals (2 + 2, 4)); }

Ak predpoklad zlyhá, a TestAbortedException je vyhodený a test je jednoducho vynechaný.

Predpokladom sa rozumejú aj výrazy lambda.

6. Testovanie výnimiek

V JUnit 5 existujú dva spôsoby testovania výnimiek. Oba je možné implementovať pomocou assertThrows () metóda:

@Test void shouldThrowException () {Throwable exception = assertThrows (UnsupportedOperationException.class, () -> {hodiť novú UnsupportedOperationException ("nepodporované");}); assertEquals (exception.getMessage (), "Nepodporované"); } @Test void assertThrowsException () {String str = null; assertThrows (IllegalArgumentException.class, () -> {Integer.valueOf (str);}); }

Prvý príklad sa používa na overenie podrobnejších informácií o vyvolanej výnimke a druhý iba overuje typ výnimky.

7. Testovacie sady

Aby sme pokračovali v nových funkciách JUnit 5, pokúsime sa spoznať koncept agregácie viacerých testovacích tried v testovacom balíku, aby sme ich mohli prevádzkovať spoločne. JUnit 5 obsahuje dve anotácie: @SelectPackages a @SelectClasses na vytvorenie testovacích balíkov.

Majte na pamäti, že v tejto počiatočnej fáze väčšina IDE tieto funkcie nepodporuje.

Pozrime sa na prvý:

@RunWith (JUnitPlatform.class) @SelectPackages ("com.baeldung") verejná trieda AllUnitTest {}

@SelectPackage sa používa na určenie mien balíkov, ktoré sa majú zvoliť pri spustení testovacej sady. V našom príklade sa spustí celý test. Druhá anotácia, @SelectClasses, sa používa na určenie tried, ktoré sa majú zvoliť pri spustení testovacej sady:

@RunWith (JUnitPlatform.class) @SelectClasses ({AssertionTest.class, AssumptionTest.class, ExceptionTest.class}) verejná trieda AllUnitTest {}

Napríklad vyššie uvedená trieda vytvorí sadu obsahujúcu tri testovacie triedy. Upozorňujeme, že triedy nemusia byť v jednom balíku.

8. Dynamické testy

Poslednou témou, ktorú chceme predstaviť, je funkcia JUnit 5 Dynamic Tests, ktorá umožňuje deklarovať a spúšťať testovacie prípady generované za behu. Na rozdiel od statických testov, ktoré definujú pevný počet testovacích prípadov v čase kompilácie, dynamické testy nám umožňujú definovať testovací prípad dynamicky za behu.

Dynamické testy je možné generovať továrenskou metódou s poznámkami @TestFactory. Pozrime sa na príklad kódu:

@TestFactory public Stream translateDynamicTestsFromStream () {return in.stream () .map (word -> DynamicTest.dynamicTest ("Test translate" + word, () -> {int id = in.indexOf (word); assertEquals (out.) get (id), preložiť (slovo));})); }

Tento príklad je veľmi priamy a ľahko pochopiteľný. Chceme preložiť slová pomocou dvoch ArrayList, menovaný v a von, resp. Továrenská metóda musí vrátiť a Prúd, Zbierka, Iterablealebo Iterátor. V našom prípade zvolíme Java 8 Prúd.

Vezmite prosím na vedomie, že @TestFactory metódy nesmú byť súkromné ​​alebo statické. Počet testov je dynamický a závisí od ArrayList veľkosť.

9. Záver

Tento dokument obsahoval rýchly prehľad zmien, ktoré prichádzajú s JUnit 5.

Vidíme, že JUnit 5 má veľkú zmenu vo svojej architektúre, ktorá sa týka spúšťača platforiem, integrácie s nástrojom na zostavenie, IDE, iných testovacích rámcov jednotiek atď. Okrem toho je JUnit 5 integrovanejší s Java 8, najmä s konceptmi Lambdas a Stream .

Príklady použité v tomto článku nájdete v projekte GitHub.


$config[zx-auto] not found$config[zx-overlay] not found