JUnit Výukový program pro anotace s příkladem: Co je @Test a @After
⚡ Chytré shrnutí
JUnit Anotace jsou formou syntaktických metadat přidaných k Java zdrojový kód, aby běžec testu věděl, které metody má spustit, kdy je má spustit a jak dlouho může každá z nich trvat.
Co je to JUnit Anotace?
JUnit anotace jsou speciální formou syntaktických metadat, která lze přidat k Java zdrojový kód pro lepší čitelnost a strukturu kódu. Proměnné, parametry, balíčky, metody a třídy lze anotovat. Anotace byly zavedeny v JUnit 4, což znamená Java kód čitelnější a jednodušší. To je velký rozdíl mezi JUnit 3 a JUnit 4: JUnit 4 je založen na anotacích.
S praktickou znalostí těchto anotací se lze snadno naučit a implementovat JUnit test. Níže jsou uvedeny důležité a často používané JUnit seznam anotací s JUnit 5 (Jupiter) ekvivalent vedle každého z nich:
| S.No. | Anotace | Description | JUnit 5 ekvivalentů |
|---|---|---|---|
| 1. | @Test | Tato anotace nahrazuje metodu junit.framework.TestCase a označuje, že metoda public void, ke které je připojena, může být spuštěna jako testovací případ. | @Test (org.junit.jupiter.api) |
| 2. | @Před | Tato anotace se používá, pokud chcete před každým testovacím případem provést nějaký příkaz, jako jsou předběžné podmínky. | @PředKaždým |
| 3. | @Před hodinou | Tato anotace se používá, pokud chcete provést některé příkazy před všemi testovacími případy, například testovací připojení, které musí být otevřeno před všemi testovacími případy. | @BeforeAll |
| 4. | @Po | Tuto anotaci lze použít, pokud chcete po každém provést nějaké příkazy Testovací případ, například resetování proměnných nebo mazání dočasných souborů. | @PoKaždém |
| 5. | @Po hodině | Tuto anotaci lze použít, pokud chcete provést některé příkazy po všech testovacích případech, například uvolnit zdroje po provedení všech testovacích případů. | @AfterAll |
| 6. | @Ignorovat | Tuto anotaci lze použít, pokud chcete během provádění testu ignorovat některé příkazy, například chcete-li během provádění testu zakázat některé testovací případy. | @Postiženo |
| 7. | @Test(časový limit=500) | Tuto anotaci lze použít, pokud chcete nastavit nějaký časový limit během provádění testu, například pokud pracujete na základě SLA (smlouvy o úrovni služeb) a testy je třeba dokončit v určitém čase. | @Timeout nebo assertTimeout |
| 8. | @Test(očekávané=IllegalArgumentException.class) | Tuto anotaci lze použít, pokud chcete během provádění testu ošetřit nějakou výjimku. Například pokud chcete zkontrolovat, zda konkrétní metoda vyvolává zadanou výjimku, či nikoli. | assertThrows |
JUnit Příklad anotace
Vytvořme třídu pokrývající důležité JUnit anotace pomocí jednoduchých tiskových příkazů a spusťte je pomocí třídy testovacího běhu:
Krok 1) Zvažte níže uvedené Java třída s různými metodami, které jsou připojeny k výše uvedeným anotacím:
JunitAnnotationsExample.java
package guru99.junit; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import java.util.ArrayList; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; public class JunitAnnotationsExample { private ArrayList<String> list; @BeforeClass public static void m1() { System.out.println("Using @BeforeClass , executed before all test cases "); } @Before public void m2() { list = new ArrayList<String>(); System.out.println("Using @Before annotations ,executed before each test cases "); } @AfterClass public static void m3() { System.out.println("Using @AfterClass ,executed after all test cases"); } @After public void m4() { list.clear(); System.out.println("Using @After ,executed after each test cases"); } @Test public void m5() { list.add("test"); assertFalse(list.isEmpty()); assertEquals(1, list.size()); } @Ignore public void m6() { System.out.println("Using @Ignore , this execution is ignored"); } @Test(timeout = 10) public void m7() { System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case"); } @Test(expected = NoSuchMethodException.class) public void m8() { System.out.println("Using @Test(expected) ,it will check for specified exception during its execution"); } }
Krok 2) Vytvořme třídu test runner pro spuštění výše uvedeného testu:
TestRunner.java
package guru99.junit; import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(JunitAnnotationsExample.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println("Result=="+result.wasSuccessful()); } }
Očekávaný výsledek
- Všechny testovací případy budou provedeny jeden po druhém a všechny příkazy print lze zobrazit v konzoli.
- Jak je uvedeno ve výše uvedené tabulce, @Before a @BeforeClass v JUnit [metody m2() a m1()] budou provedeny před každým testovacím případem a před všemi testovacími případy.
- Stejným způsobem @After a @AfterClass v JUnit (metody m4() a m3()) budou provedeny po každém testovacím případě a po všech testovacích případech. @Ignore (metoda m6()) bude považována za ignorování testu.
Pojďme analyzovat testovací případy použité výše. Java podrobně o třídě:
- Uvažujme metodu m5() uvedenou níže:
@Test
public void m5() {
list.add("test");
assertFalse(list.isEmpty());
assertEquals(1, list.size());
}
Ve výše uvedené metodě, když přidáváte řetězec do proměnné „list“:
- list.isEmpty() vrátí false.
- asseFalse(list.isEmpty()) musí vrátit true.
- V důsledku toho bude testovací případ projít.
Protože jste do seznamu přidali pouze jeden řetězec, jeho velikost je jedna.
- list.size() musí vrátit celočíselnou hodnotu „1“.
- So sustainEquals(1, list.size()) musí vrátit true.
- V důsledku toho bude testovací případ projít.
- Uvažujme metodu m7() uvedenou níže:
@Test(timeout = 10)
public void m7() {
System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");
}
Jak bylo uvedeno výše, @Test(časový limit = 10) se v testovacím případě používá k vynucení časového limitu. Hodnota je v milisekundách, takže m7() musí být dokončeno do 10 ms.
- Uvažujme metodu m8() uvedenou níže:
@Test(expected = NoSuchMethodException.class) public void m8() { System.out.println("Using @Test(expected) ,it will check for specified exception during its execution"); }
Jak bylo uvedeno výše, @Test (očekáváno) bude během svého provádění kontrolovat zadanou výjimku, takže metoda m8() vyvolá chybu „No Such Method Exception“. V důsledku toho bude test proveden s výjimkou.
Poznámka k přesnosti: m8() vytiskne pouze řádek, takže deklarovaná výjimka se ve skutečnosti nikdy nevyvolá a JUnit 4 ohlásí test jako neúspěšný. Zarovnejte očekávaný typ s tím, co metoda skutečně vyvolá. JUnit 5 tohle píše s assertThrows.
Když projdou všechny testovací případy, výsledkem je úspěšné provedení testu.
Skutečný výsledek
Protože ve výše uvedeném příkladu jsou tři testovací případy, budou všechny testovací případy provedeny jeden po druhém. Viz snímek obrazovky konzole níže:

Viz níže tisková prohlášení, která lze vidět na konzoli:
Pomocí @BeforeClass , provedené před všemi testovacími případy
Pomocí anotací @Before, které se spouštějí před každým testovacím případem
Pomocí @After se spustí po každém testovacím případě
Pomocí anotací @Before, které se spouštějí před každým testovacím případem
Pomocí @Test(timeout) jej lze použít k vynucení časového limitu JUnit4 testovací případ
Pomocí @After se spustí po každém testovacím případě
Pomocí anotací @Before, které se spouštějí před každým testovacím případem
Pomocí @Test(expected) zkontroluje během provádění zadanou výjimku
Pomocí @After se spustí po každém testovacím případě
Pomocí @AfterClass, provedené po všech testovacích případech
JUnit Assert Class
Anotace rozhodují o tom, kdy se metoda spustí; metody assert rozhodují o tom, zda projde.
Tato třída poskytuje řadu metod assertů (assert metod), které jsou užitečné při psaní testovacích případů. Pokud jsou všechny příkazy assert úspěšné, výsledky testů jsou úspěšné. Pokud kterýkoli příkaz assert selže, výsledky testů jsou neúspěšné. Vyhrazená metoda JUnit tvrdí tutoriál podrobně popisuje každou metodu.
Jak jste již viděli, níže uvedená tabulka popisuje důležité metody Assert a jejich popis:
| S.No. | Metoda | Description |
|---|---|---|
| 1. | void claimEquals (logická hodnota očekávaná, logická hodnota skutečná) | Kontroluje, zda jsou si dvě hodnoty rovny, podobně jako metoda equals třídy Object. |
| 2. | void statementFalse (booleovská podmínka) | Funkčnost spočívá v kontrole, zda je podmínka nepravdivá. |
| 3. | void statementNotNull(objekt objektu) | Funkce „assertNotNull“ slouží ke kontrole, zda objekt není null. |
| 4. | void statementNull(objekt objektu) | Funkce „assertNull“ slouží ke kontrole, zda je objekt null. |
| 5. | void statementTrue (booleovská podmínka) | Funkce „assertTrue“ slouží ke kontrole, zda je podmínka pravdivá. |
| 6. | void fail() | Pokud chcete vyvolat chybu aserce, fail() vždycky vyvolá chybu selhání. |
| 7. | voidssesSame([řetězcová zpráva] | Funkce „assertSame“ slouží ke kontrole, zda dva objekty odkazují na stejný objekt. |
| 8. | void claimNotSame([řetězcová zpráva] | Funkce „assertNotSame“ slouží ke kontrole, zda dva objekty neodkazují na stejný objekt. |
JUnit Třída testovacích případů
Pro spuštění více testů je v souboru k dispozici třída TestCase. junit.framework balíček. Anotace @Test říká JUnit že tato veřejná metoda void (zde testovací případ), ke které je připojena, může být spuštěna jako testovací případ.
Poznámka k verzi: Modelový případ, Výsledek testu a TestSuite patří k odkazu junit.framework balíček od JUnit 3. Stále se dodávají uvnitř artefaktu junit 4.x, ale testy založené na anotacích nerozšiřují TestCase.
Níže uvedená tabulka ukazuje některé důležité metody dostupné v junit.framework.TestCase třída:
| S.No. | Metoda | Description |
|---|---|---|
| 1. | int countTestCases() | Tato metoda se používá k počítání, kolik testovacích případů bylo provedeno spustit (TestResult tr) metoda. |
| 2. | TestResult createResult() | Tato metoda se používá k vytvoření a Výsledek testu objekt. |
| 3. | Řetězec getName() | Tato metoda vrací řetězec, který není nic jiného než a Modelový případ jméno. |
| 4. | TestResult run() | Tato metoda se používá k provedení testu, který vrací Výsledek testu objekt. |
| 5. | neplatný běh (výsledek testu) | Tato metoda se používá k provedení testu s a Výsledek testu objekt, který nic nevrací. |
| 6. | void setName (název řetězce) | Tato metoda se používá k nastavení názvu Modelový případ. |
| 7. | void setUp() | Tato metoda se používá k zápisu kódu pro asociaci zdrojů, například k vytvoření databázového připojení. |
| 8. | void tearDown() | Tato metoda se používá k napsání kódu pro uvolnění zdrojů, například k uvolnění připojení k databázi po provedení transakční operace. |
JUnit Třída TestResult
Když spustíte test, vrátí se výsledek (ve formě Výsledek testu Tento objekt TestResult lze použít k analýze výsledného objektu. Výsledek testu může být buď úspěšný, nebo neúspěšný.
Důležité metody použité ve třídě junit.framework.TestResult naleznete v následující tabulce:
| S.No. | Metoda | Description |
|---|---|---|
| 1. | void addError(Test test, Throwable t) | Tato metoda se používá, pokud potřebujete do testu přidat chybu. |
| 2. | void addFailure(Test test, AssertionFailedError t) | Tato metoda se používá, pokud potřebujete přidat selhání do seznamu selhání. |
| 3. | void endTest (Test test) | Tato metoda se používá k oznámení, že byl proveden (dokončen) test. |
| 4. | int errorCount() | Tato metoda se používá k odhalení chyb během provádění testu. |
| 5. | Výčet chyby() | Tato metoda jednoduše vrací kolekci (zde výčet) chyb. |
| 6. | int failureCount() | Tato metoda se používá k získání počtu chyb zjištěných během provádění testu. |
| 7. | void run (test TestCase) | Tato metoda se používá k provedení testovacího případu. |
| 8. | int runCount() | Tato metoda jednoduše počítá provedené testy. |
| 9. | void startTest (Test test) | Tato metoda se používá k upozornění na spuštění testu. |
| 10. | void stop() | Tato metoda se používá k zastavení testovacího běhu. |
JUnit Třída testovací sady
Pokud chcete spustit více testů v určitém pořadí, můžete to provést sloučením všech testů na jednom místě. Toto místo se nazývá sada testů a JUnit testovací sada Výukový program provede celým příkladem.
Důležité metody použité v tomto případě naleznete v tabulce níže. junit.framework.TestSuite třída:
| S.No. | Metoda | Description |
|---|---|---|
| 1. | void addTest (Test test) | Tato metoda se používá, pokud chcete do sady přidat test. |
| 2. | void addTestSuite(Class testClass) | Tato metoda se používá, pokud chcete specifikovat třídu při přidávání testu do sady. |
| 3. | int countTestCases() | Tato metoda se používá, pokud chcete spočítat počet testovacích případů. |
| 4. | Řetězec getName() | Tato metoda se používá k získání názvu testovací sady. |
| 5. | neplatný běh (výsledek testu) | Tato metoda se používá k provedení testu a shromáždění výsledků testu v Výsledek testu objekt. |
| 6. | void setName (název řetězce) | Tato metoda se používá k nastavení názvu TestSuite. |
| 7. | Test testAt(index int) | Tato metoda se používá, pokud chcete vrátit test na daném indexu. |
| 8. | int testCount() | Tato metoda se používá, pokud chcete vrátit počet testů v sadě. |
| 9. | varování statického testu (řetězcová zpráva) | Tato metoda vrátí test, který se nezdaří, a zaznamená varovnou zprávu. |
