Útmutató a JUnit 4 szabályaihoz

1. Áttekintés

Ebben az oktatóanyagban megnézzük a JUnit 4 könyvtár által biztosított Szabályok funkciót.

Először a JUnit szabályok modelljének bevezetésével kezdjük, mielőtt áttekintenénk a disztribúció által biztosított legfontosabb alapszabályokat. Ezenkívül meglátjuk, hogyan írhatunk és használhatunk saját egyéni JUnit-szabályt.

Ha többet szeretne megtudni a JUnit teszteléséről, tekintse át átfogó JUnit sorozatunkat.

Ne feledje, hogy az 5. JUnit használata esetén a szabályokat felváltotta az Extension modell.

2. Bevezetés a JUnit 4 szabályaiba

A JUnit 4 szabályai rugalmas mechanizmust biztosítanak a tesztek javításához egy kód futtatásával egy teszteset végrehajtása körül. Bizonyos értelemben hasonló a birtokláshoz @Előtt és @Utána kommentárok teszt osztályunkban.

Képzeljük el, hogy a tesztbeállítás során csatlakozni akartunk egy külső erőforráshoz, például egy adatbázishoz, majd a teszt befejezése után lezárjuk a kapcsolatot. Ha ezt az adatbázist több tesztben szeretnénk használni, akkor minden tesztben megkettőznénk ezt a kódot.

Egy szabály használatával mindent egy helyen elkülöníthetünk, és több tesztosztályból könnyen felhasználhatjuk a kódot.

3. A JUnit 4 szabályok használata

Tehát hogyan használhatjuk a szabályokat? A JUnit 4 szabályait az alábbi egyszerű lépésekkel használhatjuk:

  • Adja hozzá a nyilvános mezőt a tesztosztályunkba, és győződjön meg arról, hogy ennek a mezőnek a típusa a org.junit.rules.TestRule felület
  • Jegyezze fel a mezőt a @Szabály annotáció

A következő részben meglátjuk, hogy milyen projektfüggőségekre van szükségünk az induláshoz.

4. Maven-függőségek

Először tegyük hozzá a példákhoz szükséges projektfüggőségeket. Csak a fő JUnit 4 könyvtárra lesz szükségünk:

 junit junit 4.12 

Mint mindig, a legújabb verziót is megkapjuk a Maven Central-tól.

5. A terjesztésben megadott szabályok

Természetesen, A JUnit számos hasznos, előre definiált szabályt kínál a könyvtár részeként. Ezeket a szabályokat megtalálhatjuk a org.junit.rules csomag.

Ebben a részben néhány példát fogunk látni azok használatára.

5.1. A TemporaryFolder Szabály

Teszteléskor gyakran szükségünk van egy ideiglenes fájl vagy mappa elérésére. A fájlok létrehozásának és törlésének kezelése azonban nehézkes lehet. Használni a TemporaryFolder szabály szerint kezelhetjük a fájlok és mappák létrehozását, amelyeket törölni kell, amikor a tesztelési módszer leáll:

@Rule public TemporaryFolder tmpFolder = new TemporaryFolder (); @Test public void givenTempFolderRule_whenNewFile_thenFileIsCreated () dobja az IOException {File testFile = tmpFolder.newFile ("test-file.txt"); assertTrue ("A fájlt létre kellett volna hozni:", testFile.isFile ()); assertEquals ("A temp mappának és a tesztfájlnak meg kell egyeznie:", tmpFolder.getRoot (), testFile.getParentFile ()); }

Mint láthatjuk, először meghatározzuk a TemporaryFolder szabály tmpFolder. Ezután tesztelési módszerünk létrehozza a nevű fájlt test-file.txt az ideiglenes mappában. Ezután ellenőrizzük, hogy a fájl létrejött-e és létezik-e ott, ahol kellene. Nagyon szép és egyszerű!

A teszt befejezése után az ideiglenes mappát és fájlt törölni kell. Ez a szabály azonban nem ellenőrzi, hogy a törlés sikeres-e.

Van még néhány érdekes módszer, amelyet érdemes megemlíteni ebben az osztályban:

  • új fájl()

    Ha nem adunk meg fájlnevet, akkor ez a módszer véletlenszerűen elnevezett új fájlt hoz létre.

  • newFolder (String ... mappaNév)

    Rekurzívan mély ideiglenes mappák létrehozásához használhatjuk ezt a módszert.

  • új mappa()

    Hasonlóképpen a új mappa() A módszer egy véletlenszerűen elnevezett új mappát hoz létre.

Érdemes megemlíteni, hogy a 4.13-as verziótól kezdve a TemporaryFolder szabály lehetővé teszi a törölt erőforrások ellenőrzését:

@Rule public TemporaryFolder mappa = TemporaryFolder.builder (). AssureDeletion (). Build ();

Ha egy erőforrást nem lehet törölni, akkor a sikertelen teszt egy AssertionError.

Végül az 5. JUnit-ben ugyanazt a funkciót érhetjük el az Temporary Directory kiterjesztés használatával.

5.2. A ExpectedException Szabály

Ahogy a neve is sugallja, használhatjuk a ExpectedException szabály annak ellenőrzésére, hogy egyes kódok várható kivételt hoznak-e:

@Rule public final ExpectedException dobott = ExpectedException.none (); @Test public void givenIllegalArgument_whenExceptionThrown_MessageAndCauseMatches () {thrown.expect (IllegalArgumentException.class); thrown.expectCause (isA (NullPointerException.class)); thrown.expectMessage ("Ez illegális"); dobja az új IllegalArgumentException ("Ez illegális", új NullPointerException ()); }

Amint a fenti példában láthatjuk, először deklaráljuk a ExpectedException szabály. Aztán tesztünk során azt állítjuk, hogy an IllegalArgumentException dobják.

E szabály használatával ellenőrizhetjük a kivétel néhány egyéb tulajdonságát is, például az üzenetet és az okot.

A JUnit kivételek tesztelésének részletes útmutatójaért tekintse meg kiváló útmutatónkat a kivétel érvényesítéséről.

5.3. A TestName Szabály

Leegyszerűsítve: TestName szabály megadja az aktuális tesztnevet egy adott vizsgálati módszeren belül:

@Rule public TestName name = új TestName (); @Test public void givenAddition_whenPrintingTestName_thenTestNameIsDisplayed () {LOG.info ("Végrehajtás: {}", név.getMethodName ()); assertEquals ("adottAddition_whenPrintingTestName_thenTestNameIsDisplayed", name.getMethodName ()); }

Ebben a triviális példában az egység teszt futtatásakor látni kell a teszt nevét a kimenetben:

INFO c.baeldung.rules.JUnitRulesUnitTest - Végrehajtás: megadottAddition_whenPrintingTestName_thenTestNameIsDisplayed

5.4. A Időtúllépés Szabály

Ebben a következő példában megnézzük a Időtúllépés szabály. Ez a szabály hasznos alternatívát kínál az időtúllépés paraméter használatához az egyes tesztjegyzeteknél.

Most nézzük meg, hogyan használhatjuk ezt a szabályt a globális időtúllépés beállításához a tesztosztályunk összes vizsgálati módszerén:

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

A fenti triviális példában először 10 másodperces globális időtúllépést határozunk meg az összes vizsgálati módszerhez. Ezután szándékosan meghatározunk egy tesztet, amely 10 másodpercnél tovább tart.

Amikor lefuttatjuk ezt a tesztet, látnunk kell egy teszthibát:

org.junit.runners.model.TestTimedOutException: a teszt 10 másodperc múlva túllépte ...

5.5. A ErrorCollector Szabály

Legközelebb megnézzük a ErrorCollector szabály. Ez a szabály lehetővé teszi a teszt végrehajtásának folytatását az első probléma megtalálása után.

Nézzük meg, hogyan használhatjuk ezt a szabályt az összes hiba összegyűjtésére és egyszerre jelentésre, amikor a teszt befejeződik:

@Rule public final ErrorCollector errorCollector = új ErrorCollector (); @Test public void givenMultipleErrors_whenTestRuns_thenCollectorReportsErrors () {errorCollector.addError (new Throwable ("Az első dolog rosszul ment!")); errorCollector.addError (new Throwable ("Egy másik dolog rosszul ment!")); errorCollector.checkThat ("Hello World", nem (tartalmazzaString ("ERROR!"))); }

A fenti példában két hibát adunk a gyűjtőhöz. Amikor lefuttatjuk a tesztet, a végrehajtás folytatódik, de a teszt a végén kudarcot vall.

A kimenetben mindkét hibát jelenteni fogjuk:

java.lang.Hajítható: Először rosszul ment! ... java.lang. Dobható: Egy másik dolog rosszul esett!

5.6. A Igazoló Szabály

A Igazoló A szabály egy absztrakt alaposztály, amelyet akkor használhatunk, ha a tesztjeinkből további viselkedést akarunk ellenőrizni. Valójában a ErrorCollector Az utolsó szakaszban látott szabály kiterjeszti ezt az osztályt.

Most nézzünk meg egy triviális példát saját hitelesítőnk meghatározására:

private List messageLog = new ArrayList (); @Rule public Verifier verifier = new Verifier () {@Orride public void verify () {assertFalse ("Az Üzenetnapló nem üres!", MessageLog.isEmpty ()); }}; 

Itt definiálunk egy újat Igazoló és felülírja a igazolni () módszer hozzáadni néhány extra ellenőrzési logikát. Ebben az egyszerű példában egyszerűen ellenőrizzük, hogy a példánkban szereplő üzenetnapló nem üres-e.

Most, amikor lefuttatjuk az egységtesztet, és hozzáadunk egy üzenetet, látnunk kell, hogy az ellenőrzőnket alkalmazták:

@Test public void givenNewMessage_whenVerified_thenMessageLogNotEmpty () {// ... messageLog.add ("Új üzenet van!"); }

5.7. A DisableOnDebug Szabály

Előfordulhat, hogy hibakeresés közben ki akarjuk tiltani a szabályt. Például gyakran kívánatos letiltani a Időtúllépés szabály a hibakereséskor, hogy elkerüljük a teszt időzítését és a kudarcot, mielőtt még volna időnk hibát hibakeresni.

A DisableOnDebug A szabály pontosan ezt teszi, és lehetővé teszi számunkra, hogy egyes szabályokat letiltani lehessen a hibakeresés során:

@Rule public DisableOnDebug disableTimeout = new DisableOnDebug (Timeout.seconds (30));

A fenti példában láthatjuk, hogy ennek a szabálynak a használatához egyszerűen átadjuk a kivetítőnek a letiltani kívánt szabályt.

Ennek a szabálynak az a fő előnye, hogy kikapcsolhatjuk a szabályokat anélkül, hogy a hibakeresés során módosítanánk a tesztosztályainkat.

5.8. A ExternalResource Szabály

Általában integrációs tesztek írásakor érdemes egy külső erőforrást felállítanunk egy teszt előtt, és utána lebontanunk. Szerencsére a JUnit egy másik praktikus alaposztályt nyújt ehhez.

Bővíthetjük az absztrakt osztályt ExternalResource külső erőforrás, például fájl vagy adatbázis-kapcsolat létrehozása a teszt előtt. Valójában a TemporaryFolder a korábban látott szabály kiterjed ExternalResource.

Vessünk egy gyors pillantást arra, hogyan bővíthetnénk ezt az osztályt:

@Rule public final ExternalResource externalResource = new ExternalResource () {@ A védett void felülbírálása, mielőtt () Throwable {// kódot dobna egy adott külső erőforrás beállításához. }; @ A védett void felülbírálása a () után {// kód a külső erőforrás lebontásához}; };

Ebben a példában, amikor definiálunk egy külső erőforrást, egyszerűen felül kell írnunk a előtt() módszer és utána() módszer a külső erőforrásunk felállítása és lebontása érdekében.

6. Osztályszabályok alkalmazása

Mindeddig az általunk megvizsgált példák egyetlen teszteset-módszerekre vonatkoztak. Előfordulhat azonban, hogy a tesztosztály szintjén érdemes alkalmazni egy szabályt. Ezt a @ClassRule annotáció.

Ez a feljegyzés nagyon hasonlóan működik @Szabály de egy egész teszt köré szab egy szabályt - a fő különbség az, hogy az osztályszabályunkhoz használt mezőnek statikusnak kell lennie:

@ClassRule public static TemporaryFolder globalFolder = new TemporaryFolder ();

7. Egyéni JUnit-szabály meghatározása

Mint láttuk, a JUnit 4 számos hasznos szabályt tartalmaz a dobozból. Természetesen meghatározhatjuk saját szokásainkat. Egyéni szabály megírásához végre kell hajtanunk a TestRule felület.

Vessen egy pillantást az egyéni tesztmódszer névnaplózó szabályának meghatározására:

public class TestMethodNameLogger végrehajtja a TestRule {private static final Logger LOG = LoggerFactory.getLogger (TestMethodNameLogger.class); @ Nyilvános nyilatkozat felülbírálása érvényes (Nyilatkozati alap, Leírás leírása) {logInfo ("Teszt előtt", leírás); próbáld meg {return new Statement () {@Orride public void assessment () throws Throwable {base.evaluate (); }}; } végül {logInfo ("Teszt után", leírás); }} private void logInfo (Karakterlánc msg, Leírás leírása) {LOG.info (msg + description.getMethodName ()); }}

Mint láthatjuk, a TestRule felület tartalmaz egy nevezett metódust alkalmazni (nyilatkozat, leírás) hogy felül kell írnunk egy példányt Nyilatkozat. A nyilatkozat a JUnit futás közbeni tesztjeinket reprezentálja. Amikor felhívjuk a értékel () módszerrel, ez végrehajtja a tesztünket.

Ebben a példában naplózunk egy előtte és utána üzenetet, és belefoglaljuk a Leírás kifogásolja az egyedi teszt metódusnevét.

8. Szabályláncok használata

Ebben az utolsó szakaszban megvizsgáljuk, hogyan rendelhetünk meg több tesztszabályt a RuleChain szabály:

@Rule public RuleChain chain = RuleChain.outerRule (új MessageLogger ("Első szabály")) .around (új MessageLogger ("Második szabály")) .around (új MessageLogger ("Harmadik szabály"));

A fenti példában három szabályból álló láncot hozunk létre, amely egyszerűen kinyomtatja a mindegyiknek továbbított üzenetet MessageLogger konstruktőr.

Amikor lefuttatjuk a tesztünket, meglátjuk, hogyan alkalmazzák a láncot sorrendben:

Indítás: Első szabály Indítás: Második szabály Indítás: Harmadik szabály kész: Harmadik szabály kész: Második szabály kész: Első szabály

9. Következtetés

Összefoglalva, ebben az oktatóanyagban részletesen feltártuk a JUnit 4 szabályait.

Először azzal kezdtük, hogy elmagyaráztuk, melyek a szabályok, és hogyan tudjuk felhasználni őket. Ezután alaposan megvizsgáltuk azokat a szabályokat, amelyek a JUnit disztribúció részeként jönnek létre.

Végül megvizsgáltuk, hogyan definiálhatjuk saját egyéni szabályunkat és hogyan kapcsolhatjuk össze a szabályokat.

Mint mindig, a cikk teljes forráskódja elérhető a GitHubon.