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.
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:
- @RunWith(Suite.klasse)
- @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:
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:
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:
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:
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:
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:
Ocuco JUnit vis poster samme kjรธring som tre bestรฅtte testmetoder gruppert under suite-klassen:
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.







