Opprett JUnit Test Suite med eksempel: @RunWith @SuiteClasses

โšก Smart oppsummering

JUnit Testpakker samler testtilfeller fra flere klasser slik at de kjรธrer sammen i รฉn omgang, drevet av annotasjonene @RunWith(Suite.class) og @SuiteClasses og startet gjennom en vanlig testlรธperklasse.

  • ๐Ÿ”˜ Formรฅl: Grupper tester fra mange klasser til รฉn kjรธrbar enhet i stedet for รฅ starte hver testklasse separat.
  • โ˜‘๏ธ merknader: @RunWith(Suite.class) delegerer utfรธrelse, mens @SuiteClasses lister opp alle klassene som pakken mรฅ kjรธre.
  • โœ… Fremgangsmรฅte: Skriv testklassene, legg til en holderklasse som bรฆrer begge annotasjonene, og kjรธr den deretter fra en JUnitKjernelรธper.
  • ๐Ÿงช Eksempel: JunitTest.java grupperer SuiteTest1 og SuiteTest2, og konsollen rapporterer tre bestรฅtte tester.
  • ๐Ÿ› ๏ธ JUnit 5: Jupiter erstatter lรธperen med @Suite pluss @SelectClasses eller @SelectPackages pรฅ plattformens suite-motor.
  • ๐Ÿ“Œ Fallgruver: Tomme suiter, manglende import og en suite-klasse som har sine egne @Test-metoder forรฅrsaker de fleste feil.

Opprette en JUnit testpakke med @RunWith- og @SuiteClasses-annoteringer

In JUnit, en testsuite lar oss aggregere alle test tilfeller fra flere klasser pรฅ ett sted og kjรธre dem sammen.

For รฅ kjรธre suite-testen mรฅ du annotere en klasse ved hjelp av annotasjonene nedenfor:

  1. @RunWith(Suite.klasse)
  2. @SuiteClasses(test1.klasse, test2.klasseโ€ฆ) eller @Suite.SuiteClasses({test1.klasse, test2.klasseโ€ฆ})

Med annotasjonene ovenfor vil alle testklassene i suiten begynne รฅ kjรธre รฉn etter รฉn. Selve suiteklassen forblir tom: den er bare en holder for annotasjonene, og lรธperen leser disse annotasjonene for รฅ bestemme hva som skal kjรธres.

Trinn for รฅ lage Test Suite og Test Runner

De fire trinnene nedenfor bygger den minste suiten som faktisk kjรธrer: to vanlige testklasser, en suite-klasse som navngir dem, og en runner som starter suiten fra en main-metode.

Trinn 1) Opprett en enkel testklasse (f.eks. MyFirstClassTest) og legg til en metode kommentert med @Test.

Den fรธrste klassen har รฉn tom testmetode, som er nok til รฅ bevise at suiten plukker den opp:

MyFirstClassTest-klassen i Eclipse deklarere en @Test-annotert myFirstMethod

Trinn 2) Opprett en annen testklasse รฅ legge til (f.eks. MySecondClassTest) og opprett en metode kommentert med @Test.

Den andre klassen fรธlger nรธyaktig samme form, sรฅ suiten har to separate klasser รฅ aggregere:

MySecondClassTest-klasse i Eclipse deklarerer en @Test-annotert mySecondMethod

Trinn 3) For รฅ opprette en testSuite mรฅ du fรธrst annotere klassen med @RunWith(Suite.class) og @SuiteClasses(class1.class, class2.classโ€ฆ).

Legg merke til at suite-klassen TestSuiteExample ikke deklarerer noen egen testmetode โ€“ de to annotasjonene inneholder all informasjonen:

TestSuiteExample kommentert med @RunWith(Suite.class) og @SuiteClasses som navngir MyFirstClassTest og MySecondClassTest

Trinn 4) Opprett en Test Runner-klasse for รฅ kjรธre testsuiten vรฅr som vist nedenfor:

Lรธperen er en vanlig Java klasse med en hovedmetode som overleverer suite-klassen til JUnitKjerne:

Testlรธperklassen kaller JUnitCore.runClasses pรฅ TestSuiteExample og utskrift av feillisten

Code Forklaring:

  • Code Linje 8: Deklarerer hovedmetoden til klassen Test som vil kjรธre vรฅr JUnit test.
  • Code Linje 9: Utfรธre testtilfeller ved hjelp av JUnitCore.runClasses som tar navnet pรฅ testklassen som en parameter (i eksemplet ovenfor bruker du TestSuiteExample.class vist i trinn 3).
  • Code Linje 11: Behandler resultatet ved hjelp av en for-lรธkke og skriver ut det mislykkede resultatet.
  • Code Linje 13: Skriver ut det vellykkede resultatet.

Utgang: Her er resultatet som viser en vellykket test uten feil trace som gitt nedenfor:

Eclipse JUnit vis rapportering Kjรธrer 2/2 med null feil og null mislykkede forsรธk for TestSuiteExample

Den grรธnne linjen bekrefter hva en suite er til for: รฉn oppstart, รฉn resultatvisning, og begge klassene rapporteres under suite-noden i stedet for i to separate kjรธringer.

JUnit Eksempel pรฅ testsuite

Tenk deg et mer komplekst eksempel, der klassene i suiten faktisk hevde noe i stedet for รฅ holde en tom metode.

JunitTest.java

JunitTest.java er en enkel klasse kommentert med @RunWith og @Suite annoteringer. Du kan liste opp et hvilket som helst antall klasser i pakken som parametere, som gitt 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 som har testmetoder som skriver ut en melding, som gitt nedenfor. Du vil bruke denne klassen som et suite-medlem i klassen nevnt ovenfor. Den er avhengig av en hjelpeklasse kalt JUnitMelding, som er definert et annet sted i samme pakke og ikke gjengis 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 annen testklasse, lik SuiteTest1.java, med en testmetode for รฅ skrive ut en melding som gitt nedenfor. Du vil bruke denne klassen 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);							
    }		

}		

Produksjon

Etter henrettelse JunitTest.java, som inneholder en suite som inneholder SuiteTest1.java og SuiteTest2.java, vil du fรฅ utdataene nedenfor. Konsollen skriver ut meldingene produsert av begge klassene:

Eclipse Konsoll som viser de utskrevne meldingene fra begge suite-klassene etter at JunitTest er ferdig

Ocuco JUnit vis poster samme kjรธring som tre bestรฅtte testmetoder gruppert under suite-klassen:

Eclipse JUnit vis rapportering Kjรธrer 3/3 grรธnne for JunitTest med SuiteTest1 og SuiteTest2 utvidet

OBS: Konsolletikettene i dette eksemplet er krysset over โ€“ strengen som skrives ut av SuiteTest1 lyder ยซSuite Test 2ยป og den som skrives ut av SuiteTest2 lyder ยซSuite Test 1ยป. De opprinnelige oppfรธringene gjengis uendret, slik at etikettene forblir slik forfatteren skrev dem; les klassenavnet i JUnit visning i stedet for den utskrevne etiketten nรฅr du matcher utdata med kilde.

Slik oppretter du en testsuite i JUnit 5

JUnit 5 fjerner lรธpere helt, sรฅ @RunWith(Suite.class) finnes ikke i org.junit.jupiter-pakkene. Suiter flyttet til JUnit Plattform, som sender dem i en separat artefakt kalt junit-plattform-suite-motorLegg til den avhengigheten, og annoter deretter en klasse med @Suite og en av selektorannotasjonene.

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
}

Selektorannotasjonene erstatter den enkle @SuiteClasses-listen med en liten familie av alternativer:

merknad Hva den velger
@SelectClasses Individuelle testklasser navngitt รฉn etter รฉn, den direkte erstatningen for @SuiteClasses.
@SelectPacks Hver testklasse i den navngitte pakken og i alle dens underpakker.
@InkluderKlasseNavnMรธnstre Et filter for regulรฆrt uttrykk brukes oppรฅ valget.
@SuiteDisplayName Et lesbart navn som vises i rapporten i stedet for klassenavnet.

To ytterligere forskjeller er viktige i praksis. JUnit 5 suite-klassen kan deklarere @BeforeSuite- og @AfterSuite-metodene, som kjรธrer รฉn gang rundt hele suiten, og JUnit 4. eksempel ovenfor kjรธres fortsatt pรฅ JUnit Plattform gjennom den gamle motoren, slik at den originale koden pรฅ denne siden ikke trenger รฅ skrives om for รฅ fortsette รฅ fungere.

Fordeler og begrensninger ved JUnit Test suiter

En suite er en gruppeping mekanisme, ikke en testrammeverk av seg selv, og det former bรฅde hva den gjรธr bra og hvor den slutter รฅ vรฆre nyttig.

Fordeler

  • ร‰n oppskytning kjรธrer relaterte klasser sammen, sรฅ et rรธyksett eller en regresjon settet startes med รฉn enkelt kommando.
  • Resultatvisningen grupperer hver klasse under รฉn suite-node, noe som gjรธr det enklere รฅ oppdage en delt feil.
  • Medlemslisten ligger i kode, sรฅ den blir gjennomgรฅtt og versjonert som alle andre kildefiler.
  • Den samme suite-klassen kan startes fra et IDE, fra en lรธper som for eksempel JUnitKjerne, eller fra et byggeverktรธy.

Begrensninger

  • @SuiteClasses er en hardkodet liste, sรฅ en ny testklasse utelates stille inntil noen redigerer pakken.
  • Suiten gir ingen rekkefรธlgegaranti utover rekkefรธlgen klassene er oppfรธrt i.
  • Ingenting deles mellom medlemsklassene, sรฅ en suite er ikke en erstatning for et inventar eller en basisklasse.
  • Byggeverktรธy oppdager allerede testklasser etter navnekonvensjon, noe som gjรธr en pakke overflรธdig i mange prosjekter.

Vanlige feil nรฅr du oppretter en JUnit Test Suite

De fleste problemer i suiten produserer en kort, lite nyttig melding. Tabellen knytter meldingene du sannsynligvis vil mรธte til รฅrsaken og lรธser dem.

Melding eller symptom ร…rsak Fix
initialiseringsfeil: Ingen kjรธrbare metoder Klassen kjรธres som en vanlig testklasse, men den inneholder bare annoteringer. Legg til @RunWith(Suite.class) slik at suite-lรธperen tar over i stedet for standardlรธperen.
finner ikke symbolet: klasse Suite Suite-importen mangler. Importer org.junit.runners.Suite sammen med org.junit.runner.RunWith.
Suite kjรธrer, men en klasse hoppes over Klassen ble aldri lagt til i @SuiteClasses-listen. Legg til klassen eksplisitt, eller flytt den til @SelectPackages i JUnit 5.
Klassenavnet aksepteres ikke av kompilatoren @Runwith eller @suiteClasses ble skrevet med feil store og smรฅ bokstaver. Java Annoteringer skiller mellom store og smรฅ bokstaver: skriv @RunWith og @SuiteClasses nรธyaktig.
Tester i selve suite-klassen kjรธres aldri En @Test-metode ble lagt til suiteholderen. La holderen vรฆre tom og flytt testmetoden til en medlemsklasse.

ร… skrive suiten รฉn gang og holdeping Det er nรธyaktig som er det virkelige arbeidet. Hvis listen avviker fra klassene pรฅ disken, rapporterer suiten grรธnt mens en del av enhetstest settet kjรธres aldri i det hele tatt, en av de stilleste feilmodusene i programvaretesting.

Spรธrsmรฅl og svar

Suiten kjรธrer klassene i den rekkefรธlgen de er oppfรธrt, men JUnit gir ingen garanti for rekkefรธlgen pรฅ metodene i hver klasse. Tester som er avhengige av at en tidligere test har blitt kjรธrt, er sรฅrbare og bรธr skrives om for รฅ stรฅ alene.

Ja. En suite-klasse er en vanlig klasse nรฅr det gjelder lรธperen, sรฅ det รฅ navngi den i en annen @SuiteClasses-liste nester suitene. Nesting er nyttig for en regresjonssuite pรฅ toppnivรฅ bygget av mindre modulsuiter.

AI-assistenter leser testklassene pรฅ disken, sammenligner dem med @SuiteClasses-listen og flagger klasser som aldri ble lagt til. De grupperer ogsรฅ gjentatte feil. traces etter rotรฅrsak, noe som forkorter triage etter at en suite rapporterer mange rรธde tilfeller samtidig.

copilot skriver annotasjonsparet raskt, men det blandes ofte JUnit 4 og JUnit 5 importer i samme fil. Sjekk at org.junit.runners.Suite og org.junit.platform.suite.api.Suite aldri vises sammen, fordi bare รฉn av dem samsvarer med runneren din.

Legg junit-platform-suite-engine til testomrรฅdet. @Suite- og @SelectClasses-annotasjonene ligger i junit-platform-suite-api, som den motorartefakten henter inn transitivt, sรฅ รฉn enkelt avhengighet er vanligvis nok.

Vanligvis ikke. Surefire og Gradle Testoppgaven oppdager allerede testklasser ved รฅ navngi mรธnstre og kjรธrer dem alle. En suite er verdt รฅ skrive nรฅr du รธnsker et navngitt delsett, for eksempel et rรธyksett, som er mindre enn hele kjรธringen.

Lรธperen rapporterer en initialiseringsfeil for det medlemmet, og sier at ingen kjรธrbare metoder ble funnet, og hele pakken er merket som mislykket. Fjern oppfรธringen eller legg til en @Test-metode i klassen.

Ikke innenfor รฉn valgliste. Behold JUnit 4 klasser pรฅ veteranmotoren og velg dem fra en JUnit 5 pakker per pakke, slik at begge motorene kjรธrer under samme JUnit Plattformlansering uten รฅ blande annotasjonsfamilier.

Oppsummer dette innlegget med: