Opret JUnit Test Suite med eksempel: @RunWith @SuiteClasses
⚡ Smart opsummering
JUnit Testpakker aggregerer testcases fra flere klasser, så de kører sammen i en enkelt gennemgang, drevet af annotationerne @RunWith(Suite.class) og @SuiteClasses og startet via en almindelig testrunner-klasse.

In JUnit, en testsuite giver os mulighed for at aggregere alle test tilfælde fra flere klasser på ét sted og køre dem sammen.
For at køre suite-testen skal du annotere en klasse ved hjælp af nedenstående annoteringer:
- @RunWith(Suite.klasse)
- @SuiteClasses(test1.klasse, test2.klasse…) eller @Suite.SuiteClasses({test1.klasse, test2.klasse…})
Med ovenstående annotationer vil alle testklasserne i suiten begynde at udføres én efter én. Selve suiteklassen forbliver tom: den er kun en holder til annotationerne, og løberen læser disse annotationer for at beslutte, hvad der skal udføres.
Trin til at oprette Test Suite og Test Runner
De fire trin nedenfor bygger den mindste suite, der rent faktisk kører: to almindelige testklasser, en suite-klasse, der navngiver dem, og en runner, der starter suiten fra en main-metode.
Trin 1) Opret en simpel testklasse (f.eks. MyFirstClassTest) og tilføj en metode kommenteret med @Prøve.
Den første klasse indeholder en enkelt tom testmetode, hvilket er nok til at bevise, at pakken opfanger den:
Trin 2) Opret en anden testklasse at tilføje (f.eks. MySecondClassTest) og opret en metode kommenteret med @Test.
Den anden klasse følger præcis den samme form, så pakken har to separate klasser at aggregere:
Trin 3) For at oprette en testSuite skal du først annotere klassen med @RunWith(Suite.class) og @SuiteClasses(class1.class, class2.class…).
Bemærk at suite-klassen TestSuiteExample ikke selv deklarerer nogen testmetode — de to annotationer indeholder alle oplysningerne:
Trin 4) Opret en Test Runner-klasse til at køre vores testsuite som vist nedenfor:
Løberen er en almindelig Java klasse med en main-metode, der overleverer suite-klassen til JUnitCore:
Code Forklaring:
- Code Linje 8: Deklarering af hovedmetoden for klassen Test, som vil køre vores JUnit test.
- Code Linje 9: Udførelse af testcases ved hjælp af JUnitCore.runClasses, som tager testklassenavnet som en parameter (i eksemplet ovenfor bruger du TestSuiteExample.class vist i trin 3).
- Code Linje 11: Behandling af resultatet ved hjælp af en for-løkke og udskrivning af det mislykkede resultat.
- Code Linje 13: Udskriver det vellykkede resultat.
Output: Her er outputtet, der viser en vellykket test uden fejl trace som angivet nedenfor:
Den grønne bjælke bekræfter, hvad en suite er til for: én opstart, én resultatvisning, og begge klasser rapporteres under suite-noden i stedet for i to separate kørsler.
JUnit Eksempel på testsuite
Overvej et mere komplekst eksempel, hvor klasserne i suiten faktisk hævde noget i stedet for at holde en tom metode.
JunitTest.java
JunitTest.java er en simpel klasse kommenteret med @RunWith og @Suite annotationer. Du kan angive et hvilket som helst antal klasser i pakken som parametre, som angivet nedenfor:
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 er en testklasse med testmetoder, der udskriver en besked, som vist nedenfor. Du vil bruge denne klasse som et suite-medlem i den ovennævnte klasse. Den er afhængig af en hjælpeklasse med navnet JUnitBesked, som er defineret andetsteds i den samme pakke og ikke gengives her.
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 er en anden testklasse, der ligner SuiteTest1.java, der har en testmetode til at udskrive en besked som angivet nedenfor. Du vil bruge denne klasse som et suitemedlem i 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); } }
Produktion
Efter udførelse JunitTest.java, som indeholder en suite med SuiteTest1.java og SuiteTest2.java, får du outputtet nedenfor. Konsollen udskriver de beskeder, der er produceret af begge klasser:
JUnit se poster fra samme kørsel som tre beståede testmetoder grupperet under suite-klassen:
Bemærk: Konsolnavnene i dette eksempel er overstreget — strengen udskrevet af SuiteTest1 lyder "Suite Test 2", og den udskrevet af SuiteTest2 lyder "Suite Test 1". De originale lister gengives uændret, så navnene forbliver, som forfatteren skrev dem; læs klassenavnet i JUnit visning i stedet for den udskrevne etiket, når du matcher output med kilde.
Sådan opretter du en testsuite i JUnit 5
JUnit 5 fjerner løbere helt, så @RunWith(Suite.class) findes ikke i org.junit.jupiter-pakkerne. Suiter flyttet til JUnit Platform, som sender dem i en separat artefakt kaldet junit-platform-suite-engineTilføj den afhængighed, og annoter derefter en klasse med @Suite og en af selektorannotationerne.
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 }
Selektorannotationerne erstatter den enkelte @SuiteClasses-liste med en lille familie af muligheder:
| Annotation | Hvad den vælger |
| @SelectClasses | Individuelle testklasser navngivet én efter én, den direkte erstatning for @SuiteClasses. |
| @SelectPacks | Hver testklasse i den navngivne pakke og i alle dens underpakker. |
| @IncludeClassNamePatterns | Et filter med regulære udtryk anvendes oven på markeringen. |
| @SuiteDisplayName | Et læsbart navn vist i rapporten i stedet for klassenavnet. |
To yderligere forskelle har betydning i praksis. JUnit 5 suite-klasser kan deklarere @BeforeSuite- og @AfterSuite-metoder, som kører én gang rundt om hele suiten, og JUnit 4. eksempel ovenfor udføres stadig på JUnit Platform gennem den originale motor, så den originale kode på denne side ikke behøver at blive omskrevet for at fortsætte med at virke.
Fordele og begrænsninger ved JUnit Test suiter
En suite er en gruppeping mekanisme, ikke en testramme af sig selv, og det former både hvad den gør godt, og hvor den holder op med at være nyttig.
Fordele
- Én opsendelse kører relaterede klasser sammen, så et røgsæt eller en regression Sættet startes med en enkelt kommando.
- Resultatvisningen grupperer hver klasse under én suite-node, hvilket gør det nemmere at få øje på en delt fejl.
- Medlemslisten findes i kode, så den gennemgås og versioneres ligesom enhver anden kildefil.
- Den samme suite-klasse kan startes fra et IDE, fra en runner som f.eks. JUnitCore, eller fra et byggeværktøj.
Begrænsninger
- @SuiteClasses er en hardkodet liste, så en ny testklasse udelades lydløst, indtil nogen redigerer pakken.
- Suiten giver ingen rækkefølgegaranti ud over den rækkefølge, klasserne er angivet i.
- Intet deles mellem medlemsklasserne, så en suite er ikke en erstatning for en fast inventar eller en basisklasse.
- Byggeværktøjer registrerer allerede testklasser via navngivningskonventioner, hvilket gør en suite overflødig i mange projekter.
Almindelige fejl ved oprettelse af en JUnit Test Suite
De fleste problemer i suiten giver en kort, uhensigtsmæssig besked. Tabellen knytter de beskeder, du sandsynligvis vil støde på, til deres årsag og løsning.
| Besked eller symptom | Årsag | Fix |
| initialiseringsfejl: Ingen metoder, der kan køres | Klassen køres som en almindelig testklasse, men den indeholder kun annotationer. | Tilføj @RunWith(Suite.class), så suite-løberen overtager i stedet for standardløberen. |
| kan ikke finde symbolet: klasse Suite | Suite-importen mangler. | Importer org.junit.runners.Suite sammen med org.junit.runner.RunWith. |
| Suite kører, men en klasse springes over | Klassen blev aldrig føjet til @SuiteClasses-listen. | Tilføj klassen eksplicit, eller flyt den til @SelectPackages i JUnit 5. |
| Klassenavnet accepteres ikke af compileren | @Runwith eller @suiteClasses blev skrevet med forkert store/små bogstaver. | Java Annotationer skelner mellem store og små bogstaver: skriv @RunWith og @SuiteClasses præcist. |
| Test i selve suite-klassen kører aldrig | En @Test-metode blev tilføjet til suite-holderen. | Lad holderen være tom, og flyt testmetoden til en medlemsklasse. |
At skrive suiten én gang og holde denping Det er præcist, det er det rigtige arbejde. Hvis listen afviger fra klasserne på disken, rapporterer suiten grønt, mens en del af enhedstest sæt udføres slet ikke, en af de mest støjsvage fejltilstande i software test.







