Looma JUnit Testkomplekti näitega: @RunWith @SuiteClasses
⚡ Nutikas kokkuvõte
JUnit Testikomplektid koondavad mitme klassi testijuhtumeid, nii et need töötavad koos ühe käiguga, mida juhivad @RunWith(Suite.class) ja @SuiteClasses annotatsioonid ning mis käivitatakse tavalise testijooksja klassi kaudu.
In JUnit, testikomplekt võimaldab meil koondada kõik testjuhtumid mitmest klassist ühes kohas ja neid koos käitada.
Komplekti testi käivitamiseks peate klassi annoteerima allpool nimetatud annotatsioonide abil:
- @RunWith(Suite.class)
- @SuiteClasses(test1.klass, test2.klass…) või @Suite.SuiteClasses({test1.klass, test2.klass…})
Ülaltoodud annotatsioonide korral hakkavad kõik komplekti kuuluvad testiklassid ükshaaval käivituma. Komplekti klass ise jääb tühjaks: see on ainult annotatsioonide hoidja ja käivitaja loeb neid annotatsioone, et otsustada, mida käivitada.
Test Suite'i ja Test Runneri loomise sammud
Allolevad neli sammu loovad väikseima tegelikult töötava testimisklassi: kaks tavalist testiklassi, testiklass, mis need nimetab, ja käivitaja, mis käivitab testimisklassi põhimeetodist.
Step 1) Loo lihtne testiklass (nt MyFirstClassTest) ja lisa meetod, mis on märgistatud järgmisega: @Test.
Esimeses klassis on üks tühi testimismeetod, mis on piisav tõestamaks, et komplekt selle üles leiab:
Step 2) Loo lisamiseks veel üks testiklass (nt MySecondClassTest) ja loo @Test-iga annoteeritud meetod.
Teine klass järgib täpselt sama kuju, seega on sviidil kaks eraldi klassi, mida koondada:
Step 3) TestSuite'i loomiseks tuleb klass kõigepealt annoteerida @RunWith(Suite.class) ja @SuiteClasses(class1.class, class2.class…) abil.
Pane tähele, et sviidiklass TestSuiteExample ei deklareeri oma testimismeetodit – kogu teave on kahes annotatsioonis:
Step 4) Looge testimiskomplekti käivitamiseks Test Runner klass, nagu allpool näidatud:
Jooksja on tavaline Java klass peameetodiga, mis annab komplektiklassi üle JUnitCore:
Code Selgitus:
- Code Rida 8: Klassi Test peameetodi deklareerimine, mis käivitab meie JUnit test.
- Code Rida 9: Testijuhtumite käivitamine, kasutades JUnitCore.runClasses, mis võtab parameetrina testklassi nime (ülaltoodud näites kasutate 3. etapis näidatud TestSuiteExample.class).
- Code Rida 11: Tulemuse töötlemine for-tsükli abil ja ebaõnnestunud tulemuse väljatrükkimine.
- Code Rida 13: Eduka tulemuse väljatrükkimine.
Väljund: Siin on väljund, mis näitab edukat testi ilma tõrgeteta trace, nagu allpool näidatud:
Roheline riba kinnitab, milleks komplekt on mõeldud: üks käivitamine, üks tulemuste vaade ja mõlemad klassid esitatakse komplekti sõlme all, mitte kahe eraldi käivitamisena.
JUnit Test Suite näide
Vaatleme keerulisemat näidet, kus sviidi sees olevad klassid tegelikult väita midagi tühja meetodi hoidmise asemel.
JunitTest.java
JunitTest.java on lihtne klass, mis on annoteeritud järgmisega: @RunWith ja @Suite märkused. Parameetritena saate loetleda suvalise arvu klasse komplektis, nagu allpool näidatud:
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 on testklass, millel on testimismeetodid, mis prindivad välja allpool toodud teate. Seda klassi kasutatakse ülalmainitud klassi komplekti liikmena. See tugineb abiklassile nimega JUnitSõnum, mis on samas paketis mujal defineeritud ja mida siin ei taasesitatud.
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 on veel üks testklass, sarnane SuiteTest1.java, millel on testimismeetod allpool toodud teate väljatrükkimiseks. Seda klassi kasutate komplekti liikmena 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äljund
Pärast täitmist JunitTest.java, mis sisaldab komplekti, millel on SuiteTest1.java ja SuiteTest2.java, saate alloleva väljundi. Konsool kuvab mõlema klassi loodud sõnumid:
. JUnit Vaade salvestab sama tulemuse kui kolm testimismeetodit, mis on rühmitatud komplektiklassi alla:
Märge: Selles näites on konsooli sildid üle kriipsutatud – SuiteTest1 prinditud string on „Suite Test 2“ ja SuiteTest2 prinditud string on „Suite Test 1“. Algsed loendid reprodutseeritakse muutmata kujul, seega sildid jäävad selliseks, nagu autor need kirjutas; lugege klassi nime JUnit väljundi ja allika vastavusse viimisel prinditud sildi asemel vaadet.
Kuidas luua testimiskomplekti JUnit 5
JUnit 5 eemaldab käivitajad täielikult, seega @RunWith(Suite.class) ei eksisteeri org.junit.jupiter pakettides. Pakettide paketikogumid teisaldati kohta JUnit Platvorm, mis saadab need eraldi artefaktis nimega junit-platform-suite-engineLisa see sõltuvus ja seejärel märgi klass @Suite'i ja ühe selektori annotatsiooniga.
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 }
Valija märkused asendavad ühe @SuiteClasses loendi väikese valikute perekonnaga:
| Märkus | Mida see valib |
| @SelectClasses | Ükshaaval nimetatud individuaalsed testklassid, mis asendavad @SuiteClasses'i otse. |
| @SelectPackages | Iga nimetatud paketis ja kõigis selle alampakettides olev testiklass. |
| @IncludeClassNamePatterns | Valiku peale rakendatud regulaaravaldise filter. |
| @SuiteDisplayName | Aruandes klassi nime asemel kuvatav loetav nimi. |
Praktikas on olulised veel kaks erinevust. JUnit 5. sviidiklass võib deklareerida meetodeid @BeforeSuite ja @AfterSuite, mis käivad kogu sviidi ulatuses ühe korra, ja JUnit Ülaltoodud näide 4 käivitub endiselt JUnit Platvorm läbi vana mootori, seega ei pea selle lehe algset koodi töötamise jätkamiseks ümber kirjutama.
Eelised ja piirangud JUnit Testsviidid
Sviit on korrusping mehhanism, mitte testimisraamistik omaette ja see kujundab nii seda, mida see hästi teeb, kui ka seda, kus see enam kasulik ei ole.
Eelised
- Üks start viib läbi seotud klasse, seega suitsukomplekt või regressioon komplekt käivitatakse ühe käsuga.
- Tulemuste vaade koondab iga klassi ühe komplektisõlme alla, mis teeb jagatud tõrke märkamise lihtsamaks.
- Liikmete nimekiri asub koodis, seega vaadatakse see üle ja versioonitakse nagu iga teine lähtefail.
- Sama komplektiklassi saab käivitada IDE-st, käivitajast, näiteks JUnitCore'ist või ehitustööriistast.
Piirangud
- @SuiteClasses on püsikodeeritud loend, seega jäetakse uus testiklass vaikselt välja, kuni keegi loendit redigeerib.
- Komplekt ei anna tellimisgarantiid peale klasside loetlemise järjekorra.
- Liikmesklasside vahel pole midagi jagatud, seega ei asenda komplekt kinnitusrakist ega baasklassi.
- Ehitustööriistad avastavad testiklasse juba nimetamiskonventsiooni abil, mis muudab komplekti paljudes projektides üleliigseks.
Levinumad vead loomisel JUnit Test Suite
Enamik komplekti probleeme annab lühikese ja mittevajaliku teate. Tabelis on toodud seosed tõenäoliselt esinevate teadetega, nende põhjuse ja lahendusega.
| Sõnum või sümptom | Põhjus | Määrama |
| initsialiseerimisviga: Käivitatavaid meetodeid pole | Klass käivitatakse tavalise testklassina, kuid see sisaldab ainult annotatsioone. | Lisa @RunWith(Suite.class), et vaikimisi käivitaja asemel võtaks üle komplekti käivitaja. |
| sümbolit ei leita: klassikomplekt | Suite'i import puudub. | Impordi org.junit.runners.Suite koos org.junit.runner.RunWith-iga. |
| Sviit töötab, aga üks tund jääb vahele | Kursust ei lisatud kunagi @SuiteClasses nimekirja. | Lisa klass otseselt või liiguta see @SelectPackages'i sisse JUnit 5. |
| Kompilaator ei aktsepteeri klassi nime | @Runwith või @suiteClasses trükiti vale suur- ja väiketähtedega. | Java Annotatsioonid on tõstutundlikud: kirjuta täpselt @RunWith ja @SuiteClasses. |
| Komplektiklassi enda testid ei käivitu kunagi | Komplekti omanikule lisati meetod @Test. | Jäta hoidik tühjaks ja liiguta testimismeetod liikmesklassi. |
Kirjutan sviidi ühe korra ja hoianping selle täpsus ongi tegelik töö. Kui loend erineb kettal olevatest klassidest, annab komplekt rohelise tulemuse, samal ajal kui osa ühiku test komplekt ei käivitu kunagi, mis on üks vaiksemaid tõrkerežiime tarkvara testimine.







