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.

  • 🔘 Formål: Gruppér tests fra mange klasser i én kørbar enhed i stedet for at starte hver testklasse separat.
  • ☑️ Anmærkninger: @RunWith(Suite.class) delegerer udførelsen, mens @SuiteClasses viser alle klasser, som pakken skal køre.
  • ✅ Trin: Skriv testklasserne, tilføj en holderklasse, der bærer begge annotationer, og kør den derefter fra en JUnitKerneløber.
  • 🧪 Eksempel: JunitTest.java grupperer SuiteTest1 og SuiteTest2, og konsollen rapporterer tre beståede tests.
  • 🛠️ JUnit 5: Jupiter erstatter runneren med @Suite plus @SelectClasses eller @SelectPackages på platformens suite-motor.
  • 📌 Faldgruber: Tomme suiter, manglende importmetoder og en suite-klasse, der indeholder sine egne @Test-metoder, forårsager de fleste fejl.

Oprettelse af en JUnit testsuite med @RunWith- og @SuiteClasses-annotationer

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:

  1. @RunWith(Suite.klasse)
  2. @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:

MinFørsteKlasseTest-klasse i Eclipse deklarering af en @Test annoteret myFirstMethod

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:

MySecondClassTest-klasse i Eclipse deklarerer en @Test annoteret mySecondMethod

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:

TestSuiteExample kommenteret med @RunWith(Suite.class) og @SuiteClasses, der navngiver MyFirstClassTest og MySecondClassTest

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:

Testløberklasseopkald JUnitCore.runClasses på TestSuiteExample og udskrivning af fejllisten

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:

Eclipse JUnit se rapportering Kører 2/2 med nul fejl og nul fejl for TestSuiteExample

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:

Eclipse Konsol, der viser de udskrevne beskeder fra begge suite-klasser, efter JunitTest er afsluttet.

JUnit se poster fra samme kørsel som tre beståede testmetoder grupperet under suite-klassen:

Eclipse JUnit Vis rapportering Kører 3/3 grønt for JunitTest med SuiteTest1 og SuiteTest2 udvidet

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.

Ofte Stillede Spørgsmål

Suiten udfører klasserne i den rækkefølge, de er angivet, men JUnit giver ingen garanti for rækkefølgen af ​​metoder inden for hver klasse. Test, der afhænger af en tidligere testkørsel, er skrøbelige og bør omskrives til at stå alene.

Ja. En suite-klasse er en almindelig klasse, hvad angår runneren, så navngivning i en anden @SuiteClasses-liste indlejrer suiterne. Indlejring er nyttigt til en regressionssuite på øverste niveau, der er bygget af mindre modulsuiter.

AI-assistenter læser testklasserne på disken, sammenligner dem med @SuiteClasses-listen og markerer klasser, der aldrig blev tilføjet. De grupperer også gentagne fejl. traces efter grundårsag, hvilket forkorter triage efter en suite rapporterer mange røde på én gang.

CoPilot skriver annotationsparret hurtigt, men det blandes ofte JUnit 4 og JUnit 5 importer i den samme fil. Kontroller, at org.junit.runners.Suite og org.junit.platform.suite.api.Suite aldrig vises sammen, da kun én af dem matcher din runner.

Tilføj junit-platform-suite-engine til testområdet. @Suite- og @SelectClasses-annotationerne findes i junit-platform-suite-api, som den pågældende engineartefakt trækker ind transitivt, så en enkelt afhængighed er normalt nok.

Normalt ikke. Surefire og Gradle Testopgaven opdager allerede testklasser ved at navngive mønstre og kører dem alle. En suite er værd at skrive, når du ønsker en navngiven delmængde, såsom et røgsæt, der er mindre end den fulde kørsel.

Løberen rapporterer en initialiseringsfejl for det pågældende medlem, der angiver, at der ikke blev fundet nogen kørbare metoder, og hele pakken er markeret som fejlet. Fjern posten, eller tilføj en @Test-metode til klassen.

Ikke inden for én vælgerliste. Behold JUnit 4 klasser på veteranmotoren og vælg dem fra en JUnit 5 pakker pr. pakke, så begge motorer kører under samme JUnit Platformlancering uden at blande annotationsfamilier.

Opsummer dette indlæg med: