Vytvořit JUnit Testovací sada s příkladem: @RunWith @SuiteClasses

⚡ Chytré shrnutí

JUnit Testovací sady agregují testovací případy z několika tříd, takže běží společně v jednom průchodu, řízené anotacemi @RunWith(Suite.class) a @SuiteClasses a spouštěné prostřednictvím běžné třídy spouštěče testů.

  • 🔘 Účel: Seskupujte testy z mnoha tříd do jedné spustitelné jednotky namísto spouštění každé testovací třídy samostatně.
  • ☑️ Anotace: @RunWith(Suite.class) deleguje provádění, zatímco @SuiteClasses vypíše všechny třídy, které musí sada spustit.
  • (Tj. Kroky: Napište testovací třídy, přidejte třídu holder s oběma anotacemi a poté ji spusťte z JUnitJádrový běžec.
  • 🧪 Příklad: Soubor JunitTest.java seskupí testy SuiteTest1 a SuiteTest2 a konzole hlásí tři úspěšné testy.
  • 🛠️ JUnit 5: Jupiter nahrazuje běžec @Suite plus @SelectClasses nebo @SelectPackages v enginu platform suite.
  • 📌 Úskalí: Prázdné sady, chybějící importy a třída sady s vlastními metodami @Test způsobují většinu selhání.

Vytvoření JUnit testovací sada s anotacemi @RunWith a @SuiteClasses

In JUnit, testovací sada nám umožňuje agregovat všechny testovací případy z více kurzů na jednom místě a spouštět je společně.

Chcete-li spustit test sady, musíte anotovat třídu pomocí níže uvedených anotací:

  1. @RunWith(Suite.class)
  2. @SuiteClasses(test1.třída, test2.třída…) nebo @Suite.SuiteClasses({test1.třída, test2.třída…})

S výše uvedenými anotacemi se všechny testovací třídy v sadě začnou provádět jedna po druhé. Samotná třída sady zůstane prázdná: slouží pouze jako nosič anotací a běžec si tyto anotace přečte, aby se rozhodl, co spustit.

Kroky k vytvoření testovací sady a testovacího programu

Čtyři níže uvedené kroky vytvoří nejmenší sadu, která skutečně běží: dvě běžné testovací třídy, třída sady, která je pojmenovává, a běžec, který spouští sadu z metody main.

Krok 1) Vytvořte jednoduchou testovací třídu (např. MyFirstClassTest) a přidejte metodu anotovanou pomocí @Test.

První třída obsahuje jednu prázdnou testovací metodu, což stačí k prokázání, že ji sada zvládne:

Třída MyFirstClassTest v Eclipse deklarování anotované metody myFirstMethod metody @Test

Krok 2) Vytvořte další testovací třídu, kterou chcete přidat (např. MySecondClassTest), a vytvořte metodu anotovanou pomocí @Test.

Druhá třída má přesně stejný tvar, takže sada má dvě samostatné třídy k agregaci:

MySecondClassTest třídy v Eclipse deklarování anotované metody mySecondMethod s @Test

Krok 3) Pro vytvoření testSuite je třeba nejprve anotovat třídu pomocí @RunWith(Suite.class) a @SuiteClasses(class1.class, class2.class…).

Všimněte si, že třída sady TestSuiteExample nedeklaruje žádnou vlastní testovací metodu – všechny informace obsahují dvě anotace:

TestSuiteExample s anotací @RunWith(Suite.class) a @SuiteClasses s názvy MyFirstClassTest a MySecondClassTest

Krok 4) Vytvořte třídu Test Runner pro spuštění naší testovací sady, jak je uvedeno níže:

Běžec je obyčejný Java třída s metodou main, která předává třídu suite do JUnitCore:

Volání třídy testovacího běhače JUnitCore.runClasses na TestSuiteExample a výpis seznamu chyb

Code Vysvětlení:

  • Code Řádek 8: Deklarace hlavní metody třídy Test, která spustí náš JUnit test.
  • Code Řádek 9: Spuštění testovacích případů pomocí JUnitCore.runClasses, který bere název testovací třídy jako parametr (ve výše uvedeném příkladu používáte TestSuiteExample.class, jak je znázorněno v kroku 3).
  • Code Řádek 11: Zpracování výsledku pomocí smyčky for a výpis neúspěšného výsledku.
  • Code Řádek 13: Vytiskněte úspěšný výsledek.

Výstup: Zde je výstup, který ukazuje úspěšný test bez selhání trace, jak je uvedeno níže:

Eclipse JUnit zobrazení reportingu Běží 2/2 s nulovými chybami a nulovými selháními pro TestSuiteExample

Zelený pruh potvrzuje, k čemu sada slouží: jedno spuštění, jedno zobrazení výsledků a obě třídy hlášené pod uzlem sady, nikoli ve dvou samostatných spuštěních.

JUnit Příklad testovací sady

Uvažujme složitější příklad, ve kterém třídy uvnitř sady ve skutečnosti tvrdí něco místo držení prázdné metody.

JunitTest.java

JunitTest.java je jednoduchá třída anotovaná pomocí @RunWith a @Suite anotace. Jako parametry můžete uvést libovolný počet tříd v sadě, jak je uvedeno níže:

package guru99.junit;		
import org.junit.runner.RunWith;		
import org.junit.runners.Suite;		

@RunWith(Suite.class)				
@Suite.SuiteClasses({				
  SuiteTest1.class,
  SuiteTest2.class,  			
})		

public class JunitTest {				
			// This class remains empty, it is used only as a holder for the above annotations		
}

SuiteTest1.java

SuiteTest1.java je testovací třída s testovacími metodami, které vypíší zprávu, jak je uvedeno níže. Tuto třídu budete používat jako člena sady ve výše zmíněné třídě. Spoléhá na pomocnou třídu s názvem JUnitZpráva, která je definována jinde ve stejném balíčku a zde není reprodukována.

package guru99.junit;		

import static org.junit.Assert.assertEquals;				

import org.junit.Test;		

public class SuiteTest1 {				

    public String message = "Saurabh";							

    JUnitMessage junitMessage = new JUnitMessage(message);							

    @Test(expected = ArithmeticException.class)					
    public void testJUnitMessage() {					

        System.out.println("Junit Message is printing ");					
        junitMessage.printMessage();			

    }		

    @Test		
    public void testJUnitHiMessage() {					
        message = "Hi!" + message;							
        System.out.println("Junit Hi Message is printing ");					
        assertEquals(message, junitMessage.printHiMessage());					
        System.out.println("Suite Test 2 is successful " + message);							
    }		
}		

SuiteTest2.java

SuiteTest2.java je další testovací třída, podobná SuiteTest1.java, s testovací metodou pro výpis zprávy, jak je uvedeno níže. Tuto třídu použijete jako člena sady v JunitTest.java.

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Test;		

public class SuiteTest2 {				
   	

    @Test		
    public void createAndSetName() {					
        		

        String expected = "Y";					
        String actual = "Y";					

        Assert.assertEquals(expected, actual);					
        System.out.println("Suite Test 1 is successful " + actual);							
    }		

}		

Výstup

Po provedení JunitTest.java, který obsahuje sadu SuiteTest1.java a SuiteTest2.java, dostanete níže uvedený výstup. Konzole vypíše zprávy vygenerované oběma třídami:

Eclipse Konzole zobrazující vytištěné zprávy z obou tříd suite po dokončení JunitTestu

Jedno JUnit zobrazení zaznamenává stejný běh jako tři úspěšně procházející testovací metody seskupené pod třídou suite:

Eclipse JUnit zobrazit reporting Spuštění 3/3 green pro JunitTest s rozbalenými SuiteTest1 a SuiteTest2

Poznámka: Popisky konzole v tomto příkladu jsou přeškrtnuté – řetězec vytištěný SuiteTest1 zní „Suite Test 2“ a řetězec vytištěný SuiteTest2 zní „Suite Test 1“. Původní výpisy jsou reprodukovány beze změny, takže popisky zůstávají tak, jak je autor napsal; přečtěte si název třídy v JUnit zobrazení, nikoli vytištěného popisku, když porovnáváte výstup se zdrojem.

Jak vytvořit testovací sadu v JUnit 5

JUnit Verze 5 zcela odstraňuje běžce, takže @RunWith(Suite.class) neexistuje v balíčcích org.junit.jupiter. Sady byly přesunuty do JUnit Platforma, která je dodává v samostatném artefaktu s názvem engine-platform-suite-junitPřidejte tuto závislost a poté anotujte třídu pomocí @Suite a jedné z anotací selektoru.

import org.junit.platform.suite.api.SelectClasses;
import org.junit.platform.suite.api.Suite;
import org.junit.platform.suite.api.SuiteDisplayName;

@Suite
@SuiteDisplayName("Guru99 suite")
@SelectClasses({ SuiteTest1.class, SuiteTest2.class })
public class JunitTest {
    // Empty holder, exactly as in JUnit 4
}

Anotace selektorů nahrazují jediný seznam @SuiteClasses malou skupinou možností:

Anotace Co vybírá
@SelectClasses Jednotlivé testovací třídy pojmenované jednu po druhé, přímá náhrada za @SuiteClasses.
@SelectPackages Každá testovací třída v pojmenovaném balíčku a ve všech jeho podbalíčcích.
@IncludeClassNamePatterns Filtr regulárních výrazů aplikovaný na výběr.
@SuiteDisplayName Čitelný název zobrazený v sestavě místo názvu třídy.

V praxi jsou důležité další dva rozdíly. A JUnit Třída sady 5 může deklarovat metody @BeforeSuite a @AfterSuite, které se spustí jednou pro celou sadu, a JUnit 4 výše uvedený příklad se stále spouští na JUnit Platforma přes vintage engine, takže původní kód na této stránce nemusí být přepisován, aby nadále fungoval.

Výhody a omezení JUnit Testovací sady

Apartmá je skupinaping mechanismus, nikoli testovací rámec vlastní, a to formuje jak to, v čem dělá dobře, tak i to, kde přestává být užitečné.

Výhody

  • Jeden start spustí související třídy společně, takže kouřová sada nebo regrese set se spouští jediným příkazem.
  • Výsledné zobrazení seskupuje každou třídu pod jeden uzel sady, což usnadňuje odhalení sdílené chyby.
  • Seznam členů je uložen v kódu, takže je kontrolován a verzován stejně jako jakýkoli jiný zdrojový soubor.
  • Stejnou třídu suite lze spustit z IDE, z běžce, jako je například JUnitJádro nebo z nástroje pro sestavení.

Omezení

  • @SuiteClasses je pevně zakódovaný seznam, takže nová testovací třída je tiše vynechána, dokud někdo sadu neupraví.
  • Sada neposkytuje žádnou záruku objednání nad rámec pořadí, ve kterém jsou třídy uvedeny.
  • Mezi členskými třídami není nic sdíleno, takže sada nenahrazuje příslušenství ani základní třídu.
  • Nástroje pro sestavování již vyhledávají testovací třídy pomocí konvence pojmenování, což v mnoha projektech činí sadu nadbytečnou.

Časté chyby při vytváření JUnit Testovací sada

Většina problémů se sadou zobrazuje jako krátká a neužitečná zpráva. Tabulka mapuje zprávy, se kterými se pravděpodobně setkáte, s jejich příčinou a řešením.

Zpráva nebo příznak Způsobit Opravit
inicializationError: Žádné spustitelné metody Třída se spouští jako běžná testovací třída, ale obsahuje pouze anotace. Přidejte @RunWith(Suite.class), aby běžec sady převzal kontrolu místo výchozího běžce.
Nelze najít symbol: třída Suite Chybí import ze Suite. Importujte org.junit.runners.Suite společně s org.junit.runner.RunWith.
Suita běží, ale jedna hodina je vynechána Kurz nebyl nikdy přidán do seznamu @SuiteClasses. Explicitně přidejte třídu nebo ji přesuňte do @SelectPackages v JUnit 5.
Název třídy není kompilátorem akceptován. @Runwith nebo @suiteClasses bylo napsáno s nesprávnými velkými a malými písmeny. Java V anotacích se rozlišují velká a malá písmena: pište přesně @RunWith a @SuiteClasses.
Testy v samotné třídě suite se nikdy neběží. Do držitele sady byla přidána metoda @Test. Ponechte držitele prázdné a přesuňte testovací metodu do členské třídy.

Napsat suitu jednou a pakping Skutečná práce spočívá v přesnosti. Pokud se seznam odchyluje od tříd na disku, sada hlásí zelenou barvu, zatímco část jednotkový test set se vůbec neprovede, jeden z nejtišších režimů selhání v testování softwaru.

Nejčastější dotazy

Sada spouští třídy v pořadí, v jakém jsou uvedeny, ale JUnit Nezaručuje pořadí metod v každé třídě. Testy, které závisí na předchozím spuštění testu, jsou křehké a měly by být přepsány tak, aby fungovaly samostatně.

Ano. Třída suite je z hlediska běhového algoritmu běžná třída, takže její pojmenování v jiném seznamu @SuiteClasses vnoří suity. Vnořování je užitečné pro regresní sadu nejvyšší úrovně sestavenou z menších sad modulů.

Asistenti umělé inteligence čtou testovací třídy na disku, porovnávají je se seznamem @SuiteClasses a označují třídy, které nikdy nebyly přidány. Také seskupují opakovaná selhání. tracpodle hlavní příčiny, což zkracuje třídění poté, co sada nahlásí mnoho červených najednou.

Druhý pilot zapíše dvojici anotací rychle, ale často se mísí JUnit 4 a JUnit 5 importů ve stejném souboru. Zkontrolujte, zda se org.junit.runners.Suite a org.junit.platform.suite.api.Suite nikdy neobjevují společně, protože pouze jeden z nich odpovídá vašemu běžci.

Přidejte junit-platform-suite-engine do testovacího oboru. Anotace @Suite a @SelectClasses se nacházejí v junit-platform-suite-api, které tento artefakt enginu tranzitivně načítá, takže obvykle stačí jedna závislost.

Obvykle ne. Surefire a Gradle Testovací úloha již objevuje testovací třídy pojmenováním vzoru a všechny je spusťuje. Sada se vyplatí napsat, když chcete pojmenovanou podmnožinu, například kouřovou sadu, která je menší než celý běh.

Běžec hlásí chybu inicializace pro daného člena s tím, že nebyly nalezeny žádné spustitelné metody a celá sada je označena jako selhaná. Odeberte položku nebo přidejte do třídy metodu @Test.

Ne uvnitř jednoho seznamu selektorů. Ponechte JUnit 4 třídy na historickém motoru a vyberte si je z JUnit 5 sad v balíčku, takže oba motory běží pod stejným JUnit Spuštění platformy bez míchání rodin anotací.

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