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ä.

  • 🔘 Tarkoitus: Ryhmittele useiden luokkien testit yhdeksi suoritettavaksi yksiköksi sen sijaan, että käynnistäisit jokaisen testiluokan erikseen.
  • ☑️ merkinnät: @RunWith(Suite.class) delegoi suorituksen, kun taas @SuiteClasses listaa kaikki luokat, jotka sarjan on suoritettava.
  • Vaiheet: Kirjoita testiluokat, lisää haltijaluokka, joka sisältää molemmat annotaatiot, ja suorita se sitten JUnitYdinjuoksija.
  • 🧪 Esimerkiksi: JunitTest.java ryhmittelee SuiteTest1:n ja SuiteTest2:n, ja konsoli raportoi kolme läpäissyttä testiä.
  • 🛠️ JUnit 5: Jupiter korvaa juoksijan @Suite-osiolla sekä @SelectClasses- tai @SelectPackages-osiolla alustan pakettimoottorissa.
  • 📌 Sudenkuopat: Tyhjät suite-metodit, puuttuvat tuonnit ja suite-luokka, jolla on omat @Test-metodinsa, aiheuttavat useimmat virheet.

Luominen JUnit testipaketti @RunWith- ja @SuiteClasses-merkinnöillä

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:

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

MyFirstClassTest-luokka Eclipse @Test-annotoidun myFirstMethod-metodin määrittäminen

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:

MySecondClassTest-luokka Eclipse @Test-annotoidun mySecondMethod-metodin määrittäminen

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:

TestSuiteExample, johon on liitetty @RunWith(Suite.class) ja @SuiteClasses nimetty MyFirstClassTest ja MySecondClassTest

Vaihe 4) Luo Test Runner -luokka testipaketin suorittamiseksi alla olevan mukaisesti:

Juoksija on tavallinen Java luokka, jonka päämetodi luovuttaa suite-luokan JUnitCore:

Testijuoksijan luokan kutsuminen JUnitCore.runClasses TestSuiteExample-komennossa ja virhelistan tulostaminen

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:

Eclipse JUnit tarkastele raportteja Suoritetaan 2/2 ilman virheitä ja epäonnistumisia TestSuiteExample-sovelluksessa

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:

Eclipse Konsoli, joka näyttää tulostetut viestit molemmista pakettiluokista JunitTestin päättymisen jälkeen

JUnit näkymä tallentaa saman suorituksen kuin kolme läpäissyttä testimetodia, jotka on ryhmitelty suite-luokan alle:

Eclipse JUnit näytä raportointi JunitTestin suoritukset 3/3 vihreänä, SuiteTest1 ja SuiteTest2 laajennettuina

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.

UKK

Sarja suorittaa luokat niiden luettelojärjestyksessä, mutta JUnit ei takaa metodien järjestystä kussakin luokassa. Testit, jotka ovat riippuvaisia ​​aiemman testin suorittamisesta, ovat hauraita ja ne tulisi kirjoittaa uudelleen toimimaan itsenäisesti.

Kyllä. Sarjapakettiluokka on tavallinen luokka suorittajan kannalta, joten sen nimeäminen toisen @SuiteClasses-listan sisällä sisäkkäin sijoittaa paketit sisäkkäin. Sisäkkäisyys on hyödyllistä päätason regressiopaketille, joka on rakennettu pienemmistä moduulipaketteista.

Tekoälyavustajat lukevat testiluokat levyltä, vertaavat niitä @SuiteClasses-luetteloon ja merkitsevät luokat, joita ei koskaan lisätty. He myös ryhmittelevät toistuvat epäonnistumiset. tracperussyyn mukaan, mikä lyhentää triage-arviointia sen jälkeen, kun sarja raportoi useita punaisia ​​kerralla.

Lentoperämies kirjoittaa annotaatioparin nopeasti, mutta se sekoittuu usein JUnit 4 ja JUnit 5 tuontia samassa tiedostossa. Tarkista, että org.junit.runners.Suite ja org.junit.platform.suite.api.Suite eivät koskaan esiinny yhdessä, koska vain toinen niistä vastaa runner-tiedostoasi.

Lisää junit-platform-suite-engine testialueelle. @Suite- ja @SelectClasses-annot sijaitsevat junit-platform-suite-api -rajapinnassa, jonka kyseinen moottoriartefakti hakee transitiivisesti, joten yksi riippuvuus riittää yleensä.

Yleensä ei. Surefire ja Gradle testitehtävä löytää jo testiluokat nimeämällä kuvioita ja ajaa ne kaikki. Testiluokat kannattaa kirjoittaa, kun haluat nimetyn osajoukon, kuten savujoukon, joka on pienempi kuin koko suoritus.

Suoritin raportoi alustusvirheen kyseiselle jäsenelle, jossa todetaan, että suoritettavia metodeja ei löytynyt, ja koko paketti merkitään epäonnistuneeksi. Poista merkintä tai lisää luokkaan @Test-metodi.

Ei yhden valitsinlistan sisällä. Pidä JUnit 4 luokkaa vintage-moottorilla ja valitse ne a:sta JUnit 5 sviittiä paketin mukaan, joten molemmat moottorit toimivat samalla teholla JUnit Alustan julkaisu ilman annotaatioperheiden sekoittamista.

Tiivistä tämä viesti seuraavasti: