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.

  • 🔘 @Test: Označuje veřejnou metodu void, která JUnit provede se jako jeden testovací případ.
  • ☑️ Životní cyklus: @Before a @After zabalí každý test, zatímco @BeforeClass a @AfterClass zabalí celou třídu.
  • (Tj. Řízení: @Ignore přeskočí test, @Test(timeout) omezí běhovou dobu a @Test(expected) vyvolá výjimku.
  • 🧪 Tvrzení: org.junit.Assert poskytuje assertEquals, assertTrue, assertNull, assertSame a fail().
  • 🛠️ Dědictví: TestCase, TestResult a TestSuite patří do staršího balíčku junit.framework.
  • 📊 JUnit 5: Jupiter je přejmenuje na @BeforeEach, @AfterEach, @BeforeAll, @AfterAll a @Disabled.

JUnit tutoriál k anotacím zahrnující @Test, @Before a @After

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ě:

  1. 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.
  1. 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.

  1. 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:

Eclipse výstup konzole zobrazující příkazy tisku @BeforeClass, @Before, @After a @AfterClass
Výstup konzole vytvořený programem JunitAnnotationsExample

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.

Nejčastější dotazy

Ano. Metoda běžně obsahuje @Test společně s @Ignore nebo @Test s časovým limitem i očekávanou výjimkou. Na jednu metodu nelze vrstvit dvě anotace životního cyklu, například @Before a @After.

@Ignore pouze potlačí metodu JUnit již rozpoznává jako test. Bez @Test vedle něj běžec nikdy neshromáždí metodu, takže se ani nespustí, ani neuvede jako přeskočená.

JUnit Spustí metodu v samostatném vlákně a po uplynutí rozpočtu ji ohlásí jako selhání s výjimkou TestTimedOutException. Vlákno je přerušeno, nikoli ukončeno, takže blokující volání může pokračovat v běhu.

Pouze prostřednictvím vintage enginu. Přidáním junit-vintage-engine to umožní JUnit Platforma spustí stávající testy org.junit beze změny, ale testy Jupiter musí importovat org.junit.jupiter.api. Smíchání obou importovaných sad v jedné třídě selže.

Pouze pro údržbu. Starší sady, které rozšiřují TestCase a vytvářejí objekty TestSuite, zůstávají ve starších kódových základech běžné, takže rozpoznání API pomáhá. Nové testy by měly být založeny na anotacích.

JUnit vytvoří novou instanci testovací třídy pro každou testovací metodu, takže žádná neexistuje, když se musí spustit nastavení na úrovni třídy. Statická metoda nepotřebuje žádnou instanci a JUnit odmítá nestatickou deklaraci.

Asistenti umělé inteligence čtou testovanou metodu a navrhují, zda setup patří do @Before nebo @BeforeClass a zda cesta k selhání vyžaduje @Test(expected) nebo assertThrows. Každý návrh považují za koncept.

GitHub Copilot obvykle správně provádí instalaci a demontáž, ale často se to míchá JUnit 4 a Jupiter importují do jednoho souboru. Před spuštěním sady zkontrolujte blok importu.

Shrňte tento příspěvek takto: