luoda JUnit Testaa Suite esimerkillä: @RunWith @SuiteClasses
⚡ Älykäs yhteenveto
JUnit Testipaketit kokoavat yhteen testitapauksia useista luokista, jotta ne suoritetaan yhdessä ajossa @RunWith(Suite.class)- ja @SuiteClasses-annotaatioiden ohjaamina ja tavallisen testisuoritinluokan käynnistäminä.
In JUnit, testipaketti mahdollistaa kaikkien tietojen yhdistämisen testitapaukset useista luokista yhdessä paikassa ja suorittaa ne yhdessä.
Suorittaaksesi pakettitestin sinun on annotoitava luokka alla mainittujen annotaatioiden avulla:
- @RunWith(Suite.class)
- @SuiteClasses(testi1.luokka, testi2.luokka…) tai @Suite.SuiteClasses({testi1.luokka, testi2.luokka…})
Yllä olevien annotaatioiden avulla kaikki testipaketin luokat alkavat suorittaa suorituksen yksi kerrallaan. Itse testipaketin luokka pysyy tyhjänä: se on vain merkintöjen säilytyspaikka, ja suorittaja lukee nämä merkinnät päättääkseen, mitä suoritetaan.
Test Suiten ja Test Runnerin luomisen vaiheet
Alla olevat neljä vaihetta rakentavat pienimmän oikeasti suoritettavan sarjan: kaksi tavallista testiluokkaa, sarjan luokka, joka nimeää ne, ja suoritin, joka käynnistää sarjan päämetodista.
Vaihe 1) Luo yksinkertainen testiluokka (esim. MyFirstClassTest) ja lisää siihen metodi, johon on merkitty annotaatio @Testata.
Ensimmäisessä luokassa on yksi tyhjä testimetodi, joka riittää todistamaan, että sarja tunnistaa sen:
Vaihe 2) Luo lisättäväksi toinen testiluokka (esim. MySecondClassTest) ja luo @Test-annotoitu metodi.
Toinen luokka noudattaa täsmälleen samaa muotoa, joten sviitissä on kaksi erillistä luokkaa yhdistettäväksi:
Vaihe 3) Luodaksesi testSuite-luokan sinun on ensin annotoitava luokka @RunWith(Suite.class) ja @SuiteClasses(class1.class, class2.class…) -metodeilla.
Huomaa, että TestSuiteExample-sviittiluokka ei määritä omaa testimetodia – kaksi annotaatiota sisältävät kaikki tiedot:
Vaihe 4) Luo Test Runner -luokka testipaketin suorittamiseksi alla olevan mukaisesti:
Juoksija on tavallinen Java luokka, jonka päämetodi luovuttaa suite-luokan JUnitCore:
Code Selitys:
- Code Rivi 8: Luokan Test päämetodin määrittäminen, joka suorittaa funktiomme JUnit testiä.
- Code Rivi 9: Testitapausten suorittaminen käyttämällä JUnitCore.runClasses, joka ottaa testiluokan nimen parametrina (Yllä olevassa esimerkissä käytät vaiheessa 3 esitettyä TestSuiteExample.class-luokkaa).
- Code Rivi 11: Tuloksen käsittely for-silmukan avulla ja epäonnistuneen tuloksen tulostaminen.
- Code Rivi 13: Tulostetaan onnistunut tulos.
lähtö: Tässä on tuloste, joka näyttää onnistuneen testin ilman virheitä trace alla olevan mukaisesti:
Vihreä palkki vahvistaa, mihin ohjelmistopakettia käytetään: yksi käynnistys, yksi tulosnäkymä ja molemmat luokat raportoidaan ohjelmistopaketin solmun alla kahden erillisen suorituksen sijaan.
JUnit Test Suite Esimerkki
Tarkastellaan monimutkaisempaa esimerkkiä, jossa sarjan sisällä olevat luokat itse asiassa puolustaa jotain tyhjän metodin pitämisen sijaan.
JunitTest.java
JunitTest.java on yksinkertainen luokka, johon on merkitty @RunWith ja @Suite merkinnät. Voit listata minkä tahansa määrän luokkia sviitissä parametreina alla olevan mukaisesti:
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 testiluokka, jolla on testimetodeja, jotka tulostavat alla olevan viestin. Käytät tätä luokkaa yllä mainitun luokan sviittijäsenenä. Se on riippuvainen apuluokkasta nimeltä JUnitViesti, joka on määritelty muualla samassa paketissa eikä sitä toisteta tässä.
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 toinen testiluokka, samanlainen kuin SuiteTest1.java, jolla on testimetodi alla olevan viestin tulostamiseksi. Käytät tätä luokkaa sviitin jäsenenä 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); } }
ulostulo
Suorituksen jälkeen JunitTest.java, joka sisältää sarjan, jossa on SuiteTest1.java ja SuiteTest2.java, saat alla olevan tulosteen. Konsoli tulostaa molempien luokkien tuottamat viestit:
JUnit näkymä tallentaa saman suorituksen kuin kolme läpäissyttä testimetodia, jotka on ryhmitelty suite-luokan alle:
Huomautus: Tässä esimerkissä konsolin otsikot on ylitetty – SuiteTest1:n tulostama merkkijono on ”Suite Test 2” ja SuiteTest2:n tulostama merkkijono on ”Suite Test 1”. Alkuperäiset listaukset toistetaan muuttumattomina, joten otsikot pysyvät sellaisina kuin tekijä ne kirjoitti; lue luokan nimi JUnit näkymää tulostetun etiketin sijaan, kun yhdistät tulosteen lähteeseen.
Testipaketin luominen JUnit 5
JUnit 5 poistaa juoksijat kokonaan, joten @RunWith(Suite.class) ei ole olemassa org.junit.jupiter-paketeissa. Pakettipaketit siirrettiin JUnit Alusta, joka toimittaa ne erillisessä artefaktissa nimeltä junit-platform-suite-engineLisää kyseinen riippuvuus ja annotoi sitten luokka @Suite-attribuutilla ja yhdellä valitsinannotaatioista.
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 }
Valitsinmerkinnät korvaavat yksittäisen @SuiteClasses-luettelon pienellä joukolla vaihtoehtoja:
| huomautus | Mitä se valitsee |
| @SelectClasses | Yksittäiset testiluokat nimetty yksi kerrallaan, suora korvaaja @SuiteClassesille. |
| @SelectPackages | Jokainen nimetyn paketin ja kaikkien sen alipakettien testiluokka. |
| @IncludeClassNamePatterns | Valinnan päälle lisätty säännöllisen lausekkeen suodatin. |
| @SuiteDisplayName | Raportissa luokan nimen sijaan näkyvä luettava nimi. |
Kaksi muutakin eroa on käytännössä merkityksellisiä. JUnit 5-suite-luokka voi määrittää @BeforeSuite- ja @AfterSuite-metodit, jotka suoritetaan kerran koko sviitin läpi, ja JUnit Yllä oleva esimerkki 4 toimii edelleen JUnit Alusta vintage-moottorin kautta, joten tämän sivun alkuperäistä koodia ei tarvitse kirjoittaa uudelleen toimiakseen.
Edut ja rajoitukset JUnit Testaa Suites
Sviitti on ryhmäping mekanismi, ei testikehys omaa luokkaansa, ja se muokkaa sekä sitä, mitä se tekee hyvin, että sitä, missä kohtaa se lakkaa olemasta hyödyllinen.
edut
- Yksi laukaisu suorittaa toisiinsa liittyviä luokkia yhdessä, joten savusarja tai regressio setti käynnistetään yhdellä komennolla.
- Tulosnäkymässä jokainen luokka on ryhmitelty yhden suite-solmun alle, mikä helpottaa jaetun virheen havaitsemista.
- Jäsenluettelo sijaitsee koodissa, joten sitä tarkistetaan ja versioidaan kuten mitä tahansa muuta lähdetiedostoa.
- Sama pakettiluokka voidaan käynnistää IDE:stä, juoksijasta, kuten JUnitYtimestä tai rakennustyökalusta.
Rajoitukset
- @SuiteClasses on kiinteästi koodattu lista, joten uusi testiluokka jätetään hiljaa pois, kunnes joku muokkaa listaa.
- Sarja ei anna tilaustakuuta luokkien listausjärjestyksen lisäksi.
- Jäsenluokkien välillä ei ole jaettu mitään, joten sarja ei korvaa kiinnityselementtiä tai perusluokkaa.
- Käännöstyökalut löytävät jo testiluokat nimeämiskäytännön avulla, mikä tekee paketista tarpeettoman monissa projekteissa.
Yleisiä virheitä luotaessa JUnit Test Suite
Useimmat ohjelmistopaketin ongelmat tuottavat lyhyen ja hyödyttömän viestin. Taulukossa on yhteys todennäköisimmin kohtaamiisi viesteihin niiden syyn ja ratkaisun suhteen.
| Viesti tai oire | Aiheuttaa | Korjata |
| alustusvirhe: Ei suoritettavia metodeja | Luokka suoritetaan tavallisena testiluokkana, mutta se sisältää vain merkintöjä. | Lisää @RunWith(Suite.class), jotta sarjan suoritin ottaa ohjat käyttöön oletusarvoisen suorittimen sijaan. |
| symbolia ei löydy: luokka Suite | Suite-tuonti puuttuu. | Tuo org.junit.runners.Suite org.junit.runner.RunWithin rinnalle. |
| Lukukausit jatkuvat, mutta yksi oppitunti jää väliin | Kurssia ei koskaan lisätty @SuiteClasses-luetteloon. | Lisää luokka eksplisiittisesti tai siirrä @SelectPackages-kansioon JUnit 5. |
| Kääntäjä ei hyväksy luokan nimeä | @Runwith tai @suiteClasses kirjoitettiin väärällä kirjainkoolla. | Java Annotaatioissa on kirjainkokoriippuvainen: kirjoita täsmälleen @RunWith ja @SuiteClasses. |
| Itse sviittiluokan testit eivät koskaan suoriteta | @Test-metodi lisättiin paketinpitäjään. | Pidä pidike tyhjänä ja siirrä testimetodi jäsenluokkaan. |
Kirjoitan sarjan kerran ja pidänping sen tarkkuus on todellinen työ. Jos lista poikkeaa levyllä olevista luokista, ohjelmisto näyttää vihreän, kun taas osa yksikkötesti setti ei koskaan suorita ollenkaan, mikä on yksi hiljaisimmista vikatiloista ohjelmistojen testaus.







