Sprievodca pravidlami JUnit 4

1. Prehľad

V tomto výučbe sa pozrieme na funkciu Pravidlá, ktorú poskytuje knižnica JUnit 4.

Začneme zavedením modelu pravidiel JUnit predtým, ako si prejdeme najdôležitejšie základné pravidlá poskytované distribúciou. Ďalej tiež uvidíme, ako napísať a používať naše vlastné vlastné pravidlo JUnit.

Ak sa chcete dozvedieť viac informácií o testovaní pomocou JUnit, pozrite si našu komplexnú sériu JUnit.

Upozorňujeme, že ak používate JUnit 5, pravidlá boli nahradené modelom Extension.

2. Úvod do pravidiel JUnit 4

Pravidlá JUnit 4 poskytujú flexibilný mechanizmus na vylepšenie testov spustením určitého kódu okolo vykonania testovacieho prípadu. V istom zmysle je to podobné ako mať @ Predtým a @ Potom anotácie v našej testovacej triede.

Predstavme si, že sme sa chceli počas nastavenia testu pripojiť k externému prostriedku, napríklad k databáze, a potom po ukončení testu pripojenie ukončiť. Ak by sme chceli túto databázu použiť vo viacerých testoch, skončili by sme duplikovaním tohto kódu pri každom teste.

Pomocou pravidla môžeme mať všetko izolované na jednom mieste a ľahko znova použiť kód z viacerých testovacích tried.

3. Používanie pravidiel JUnit 4

Ako teda môžeme používať pravidlá? Pravidlá JUnit 4 môžeme použiť podľa týchto jednoduchých krokov:

  • Pridaj verejné do našej testovacej triedy a uistite sa, že typ tohto poľa je podtypom org.junit.rules.TestRule rozhranie
  • Pole označte poznámkou @ Pravidlo anotácia

V nasledujúcej časti uvidíme, aké závislosti na projekte potrebujeme, aby sme mohli začať.

4. Maven závislosti

Najskôr pridajme závislosti projektu, ktoré budeme potrebovať pre svoje príklady. Budeme potrebovať iba hlavnú knižnicu JUnit 4:

 junit junit 4.12 

Ako vždy môžeme získať najnovšiu verziu z Maven Central.

5. Pravidlá uvedené v distribúcii

Samozrejme, JUnit poskytuje ako súčasť knižnice množstvo užitočných, preddefinovaných pravidiel. Všetky tieto pravidlá nájdeme v org.junit.rules balíček.

V tejto časti uvidíme niekoľko príkladov, ako ich používať.

5.1. The TemporaryFolder Pravidlo

Pri testovaní často potrebujeme prístup k dočasnému súboru alebo priečinku. Správa vytvárania a mazania týchto súborov však môže byť ťažkopádna. Pomocou TemporaryFolder pravidlo, môžeme riadiť vytváranie súborov a priečinkov, ktoré by sa mali po ukončení testovacej metódy vymazať:

@ Pravidlo verejné TemporaryFolder tmpFolder = nový TemporaryFolder (); @Test public void givenTempFolderRule_whenNewFile_thenFileIsCreated () vyvolá IOException {File testFile = tmpFolder.newFile ("test-file.txt"); assertTrue ("Súbor mal byť vytvorený:", testFile.isFile ()); assertEquals ("Dočasný priečinok a testovací súbor by sa mali zhodovať:", tmpFolder.getRoot (), testFile.getParentFile ()); }

Ako vidíme, najskôr si zadefinujeme TemporaryFolder pravidlo tmpFolder. Ďalej naša testovacia metóda vytvorí súbor s názvom test-file.txt v dočasnom priečinku. Potom skontrolujeme, či bol súbor vytvorený a existuje tam, kde má. Naozaj pekné a jednoduché!

Po dokončení testu by mal byť dočasný priečinok a súbor odstránený. Toto pravidlo však nekontroluje, či je odstránenie úspešné.

V tejto triede stojí za zmienku aj niekoľko ďalších zaujímavých metód:

  • newFile ()

    Ak neposkytneme žiadny názov súboru, potom táto metóda vytvorí náhodne pomenovaný nový súbor.

  • newFolder (String ... folderNames)

    Túto metódu môžeme použiť na vytvorenie rekurzívne hlbokých dočasných priečinkov.

  • nový priečinok()

    Rovnako tak nový priečinok() metóda vytvorí náhodne pomenovaný nový priečinok.

Príjemným doplnkom, ktorý stojí za zmienku, je, že od verzie 4.13 TemporaryFolder pravidlo umožňuje overenie odstránených zdrojov:

@ Pravidlo verejné priečinok TemporaryFolder = TemporaryFolder.builder (). AssureDeletion (). Build ();

Ak zdroj nie je možné vymazať, vykonajte test s neúspechom pomocou AssertionError.

Nakoniec v JUnit 5 môžeme dosiahnuť rovnakú funkcionalitu pomocou rozšírenia Temporary Directory.

5.2. The Očakávaná výnimka Pravidlo

Ako už názov napovedá, môžeme použiť Očakávaná výnimka pravidlo na overenie, či niektorý kód vyvolá očakávanú výnimku:

@ Pravidlo verejné konečné ExpectedException hodené = ExpectedException.none (); @Test public void givenIllegalArgument_whenExceptionThrown_MessageAndCauseMatches () {thrown.expect (IllegalArgumentException.class); thrown.expectCause (isA (NullPointerException.class)); thrown.expectMessage ("Toto je nezákonné"); hodiť novú IllegalArgumentException ("Toto je nelegálne", nová NullPointerException ()); }

Ako vidíme na príklade vyššie, najskôr deklarujeme Očakávaná výnimka pravidlo. Potom v našom teste tvrdíme, že IllegalArgumentException je hodená.

Pomocou tohto pravidla môžeme overiť aj niektoré ďalšie vlastnosti výnimky, napríklad správu a príčinu.

Podrobného sprievodcu testovaním výnimiek pomocou JUnit nájdete v našom vynikajúcom sprievodcovi, ako uplatniť výnimku.

5.3. The TestName Pravidlo

Zjednodušene povedané TestName pravidlo poskytuje aktuálny názov testu v rámci danej testovacej metódy:

@ Pravidlo public TestName name = new TestName (); @ Test public void givenAddition_whenPrintingTestName_thenTestNameIsDisplayed () {LOG.info ("Vykonávam: {}", name.getMethodName ()); assertEquals ("givenAddition_whenPrintingTestName_thenTestNameIsDisplayed", name.getMethodName ()); }

V tomto triviálnom príklade by sa pri spustení testu jednotky mal na výstupe zobraziť názov testu:

INFO c.baeldung.rules.JUnitRulesUnitTest - vykonávanie: givenAddition_whenPrintingTestName_thenTestNameIsDisplayed

5.4. The Čas vypršal Pravidlo

V tomto ďalšom príklade sa pozrieme na Čas vypršal pravidlo. Toto pravidlo ponúka užitočnú alternatívu k použitiu parametra časového limitu v individuálnej testovacej anotácii.

Teraz sa pozrime, ako použiť toto pravidlo na nastavenie globálneho časového limitu pre všetky testovacie metódy v našej testovacej triede:

@Rule public Timeout globalTimeout = Timeout.seconds (10); @Test public void givenLongRunningTest_whenTimout_thenTestFails () vyvolá InterruptedException {TimeUnit.SECONDS.sleep (20); }

Vo vyššie uvedenom triviálnom príklade najskôr definujeme globálny časový limit pre všetky testovacie metódy na 10 sekúnd. Potom zámerne definujeme test, ktorý bude trvať dlhšie ako 10 sekúnd.

Keď spustíme tento test, mali by sme vidieť zlyhanie testu:

org.junit.runners.model.TestTimedOutException: test vypršal po 10 sekundách ...

5.5. The ErrorCollector Pravidlo

Ďalej sa pozrieme na ErrorCollector pravidlo. Toto pravidlo umožňuje vykonávanie testu pokračovať po zistení prvého problému.

Pozrime sa, ako môžeme pomocou tohto pravidla zhromaždiť všetky chyby a nahlásiť ich všetky naraz po ukončení testu:

@ Pravidlo verejné konečné ErrorCollector errorCollector = nový ErrorCollector (); @Test public void givenMultipleErrors_whenTestRuns_thenCollectorReportsErrors () {errorCollector.addError (new Throwable ("Prvá vec sa pokazila!")); errorCollector.addError (new Throwable ("Ďalšia vec sa pokazila!")); errorCollector.checkThat ("Hello World", nie (containsString ("CHYBA!"))); }

Vo vyššie uvedenom príklade pridáme do zberača dve chyby. Keď spustíme test, vykonávanie bude pokračovať, ale nakoniec test zlyhá.

Na výstupe uvidíme hlásené obe chyby:

java.lang.Throwable: Prvá vec sa pokazila! ... java.lang.Throwable: Ďalšia vec sa pokazila!

5.6. The Overovateľ Pravidlo

The Overovateľ pravidlo je abstraktná základná trieda, ktorú môžeme použiť, keď si chceme overiť nejaké ďalšie správanie z našich testov. V skutočnosti ErrorCollector pravidlo, ktoré sme videli v poslednej časti, rozširuje túto triedu.

Poďme sa teraz pozrieť na triviálny príklad definovania nášho vlastného overovateľa:

private List messageLog = new ArrayList (); @Rule public Verifier verifikátor = nový Verifikátor () {@Override public void verify () {assertFalse ("Protokol správ nie je prázdny!", MessageLog.isEmpty ()); }}; 

Tu definujeme nový Overovateľ a prepísať overiť () metóda na pridanie nejakej extra overovacej logiky. V tomto priamom príklade jednoducho skontrolujeme, či protokol správ v našom príklade nie je prázdny.

Teraz, keď spustíme test jednotky a pridáme správu, mali by sme vidieť, že bol použitý náš overovač:

@Test public void givenNewMessage_whenVerified_thenMessageLogNotEmpty () {// ... messageLog.add ("Existuje nová správa!"); }

5.7. The DisableOnDebug Pravidlo

Niekedy môžeme chcieť počas ladenia pravidlo zakázať. Napríklad je často žiaduce deaktivovať a Čas vypršal pri ladení používajte pravidlo, aby ste sa vyhli časovaniu a zlyhaniu testu skôr, ako ho stihnete správne naladiť.

The DisableOnDebug Pravidlo robí presne toto a umožňuje nám označiť určité pravidlá, ktoré majú byť pri ladení deaktivované:

@ Pravidlo verejné DisableOnDebug disableTimeout = nový DisableOnDebug (Timeout.seconds (30));

Na vyššie uvedenom príklade vidíme, že na použitie tohto pravidla jednoducho odovzdáme konštruktorovi pravidlo, ktoré chceme zakázať.

Hlavnou výhodou tohto pravidla je, že môžeme pravidlá deaktivovať bez vykonania akýchkoľvek úprav v našich testovacích triedach počas ladenia.

5.8. The ExternalResource Pravidlo

Typicky pri písaní integračných testov môžeme chcieť pred testom nastaviť externý zdroj a potom ho zbúrať. Našťastie JUnit poskytuje ďalšiu šikovnú základnú triedu.

Môžeme rozšíriť abstraktnú triedu ExternalResource pred testom nastaviť externý zdroj, napríklad súbor alebo databázové pripojenie. V skutočnosti TemporaryFolder pravidlo, ktoré sme videli skôr, sa rozširuje ExternalResource.

Poďme sa rýchlo pozrieť na to, ako by sme mohli rozšíriť túto triedu:

@Rule public final ExternalResource externalResource = new ExternalResource () {@Override protected void before () hodí Throwable {// kód na nastavenie konkrétneho externého zdroja. }; @Override protected void after () {// kód na zničenie externého zdroja}; };

V tomto príklade, keď definujeme externý zdroj, jednoducho musíme prepísať pred () metóda a po () metódou nastavenia a zbúrania našich externých zdrojov.

6. Uplatňovanie pravidiel triedy

Doteraz boli všetky príklady, na ktoré sme sa pozreli, aplikované na metódy jednotlivých testovacích prípadov. Niekedy však možno budeme chcieť použiť pravidlo na úrovni testovacej triedy. Môžeme to dosiahnuť použitím @ClassRule anotácia.

Táto anotácia funguje veľmi podobne ako @ Pravidlo ale obklopuje pravidlo celým testom - hlavný rozdiel je v tom, že pole, ktoré používame pre naše pravidlo triedy, musí byť statické:

@ClassRule public static TemporaryFolder globalFolder = nový TemporaryFolder ();

7. Definovanie vlastného pravidla JUnit

Ako sme videli, JUnit 4 poskytuje množstvo užitočných pravidiel po vybalení z krabice. Samozrejme si môžeme definovať vlastné pravidlá. Aby sme mohli napísať vlastné pravidlo, musíme implementovať TestRule rozhranie.

Pozrime sa na príklad definovania vlastného pravidla protokolovacieho nástroja názvu testovacej metódy:

verejná trieda TestMethodNameLogger implementuje TestRule {private static final Logger LOG = LoggerFactory.getLogger (TestMethodNameLogger.class); @ Použiť verejné vyhlásenie Verejné vyhlásenie (základ vyhlásenia, popis popisu) {logInfo ("Pred testom", popis); try {return new Statement () {@Override public void evaluate () throws Throwable {base.evaluate (); }}; } nakoniec {logInfo ("Po teste", popis); }} private void logInfo (Správa reťazca, popis popisu) {LOG.info (správa + popis.getMethodName ()); }}

Ako vidíme, TestRule rozhranie obsahuje jednu metódu nazvanú platiť (vyhlásenie, popis) že musíme prepísať, aby sme vrátili inštanciu Vyhlásenie. Príkaz predstavuje naše testy v rámci modulu JUnit runtime. Keď hovoríme ohodnotiť() Táto metóda vykoná náš test.

V tomto príklade zaevidujeme správu pred a po a zahrnieme z Popis vzniesť námietku proti názvu metódy individuálneho testu.

8. Používanie reťazcov pravidiel

V tejto poslednej časti sa pozrieme na to, ako si môžeme objednať niekoľko testovacích pravidiel pomocou RuleChain pravidlo:

@Rule public RuleChain chain = RuleChain.outerRule (nový MessageLogger ("Prvé pravidlo")). Okolo (nový MessageLogger ("Druhé pravidlo")). Okolo (nový MessageLogger ("Tretie pravidlo"));

Vo vyššie uvedenom príklade vytvoríme reťazec troch pravidiel, ktoré jednoducho vytlačia správu odovzdanú každému z nich MessageLogger konštruktér.

Keď spustíme náš test, uvidíme, ako sa reťaz použije:

Štart: Prvé pravidlo Štart: Druhé pravidlo Štart: Tretie pravidlo Ukončené: Tretie pravidlo Ukončené: Druhé pravidlo Ukončené: Prvé pravidlo

9. Záver

Ak to zhrnieme, v tomto tutoriáli sme podrobne preskúmali pravidlá JUnit 4.

Najprv sme začali vysvetlením, čo sú pravidlá a ako ich môžeme použiť. Ďalej sme sa podrobne pozreli na pravidlá, ktoré sú súčasťou distribúcie JUnit.

Nakoniec sme sa pozreli na to, ako môžeme definovať svoje vlastné vlastné pravidlo a ako spojiť pravidlá dohromady.

Celý zdrojový kód článku je ako vždy k dispozícii na GitHub.


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