JUnit Merkintöjen opetusohjelma, jossa on esimerkki: Mitä ovat @Test ja @After

⚡ Älykäs yhteenveto

JUnit merkinnät ovat syntaktisen metadatan muoto, joka lisätään Java lähdekoodia, jotta testaaja tietää, mitä metodeja suorittaa, milloin ne suoritetaan ja kuinka kauan kukin voi kestää.

  • 🔘 @Testata: Merkitsee julkisen tyhjyyden metodin, joka JUnit suoritetaan yhtenä testitapauksena.
  • ☑️ Elinkaari: @Before ja @After päättävät jokaisen kokeen, kun taas @BeforeClass ja @AfterClass päättävät koko kurssin.
  • ohjaus: @Ignore ohittaa testin, @Test(timeout) rajoittaa suorituksenaikaa, @Test(expected) aiheuttaa poikkeuksen.
  • 🧪 Väitteet: org.junit.Assert toimittaa assertEquals-, assertTrue-, assertNull-, assertSame- ja fail()-funktiot.
  • 🛠️ Perintö: TestCase, TestResult ja TestSuite kuuluvat vanhempaan junit.framework-pakettiin.
  • 📊 JUnit 5: Jupiter nimeää nämä uudelleen nimiksi @BeforeEach, @AfterEach, @BeforeAll, @AfterAll ja @Disabled.

JUnit merkintäopastus, joka kattaa @Test-, @Before- ja @After-tilanteet

Mikä on JUnit Huomautuksia?

JUnit merkinnät ovat erityinen syntaktisen metadatan muoto, joka voidaan lisätä Java lähdekoodia paremman luettavuuden ja rakenteen saavuttamiseksi. Muuttujia, parametreja, paketteja, metodeja ja luokkia voidaan annotoida. Annotaatiot otettiin käyttöön vuonna JUnit 4, mikä tekee Java koodia luettavampaa ja yksinkertaisempaa. Tämä on suuri ero JUnit 3 ja JUnit 4: JUnit 4 perustuu annotaatioihin.

Näiden merkintöjen käytännön tuntemuksen avulla voi helposti oppia ja toteuttaa JUnit testata. Alla on tärkeä ja usein käytetty JUnit merkintäluettelo, jossa on JUnit 5 (Jupiter) vastine jokaisen vieressä:

S.No. Merkinnät Tuotetiedot JUnit 5 vastaavaa
1. @Testata Tämä annotaatio korvaa junit.framework.TestCase-metodin ja osoittaa, että public void -metodi, johon se on liitetty, voidaan suorittaa testitapauksena. @Test (org.junit.jupiter.api)
2. @Ennen Tätä huomautusta käytetään, jos haluat suorittaa jonkin käskyn, kuten ennakkoehdot, ennen jokaista testitapausta. @BeforeEach
3. @Ennen tuntia Tätä annotaatiota käytetään, jos haluat suorittaa joitakin lauseita ennen kaikkia testitapauksia, esimerkiksi testiyhteyden, joka on avattava ennen kaikkia testitapauksia. @EnnenKaikkia
4. @Jälkeen Tätä merkintää voidaan käyttää, jos haluat suorittaa joitain lauseita jokaisen jälkeen Testitapaus, esimerkiksi muuttujien nollaaminen tai väliaikaisten tiedostojen poistaminen. @AfterEach
5. @Oppitunnin jälkeen Tätä annotaatiota voidaan käyttää, jos haluat suorittaa joitakin lauseita kaikkien testitapausten jälkeen, esimerkiksi vapauttaa resursseja kaikkien testitapausten suorittamisen jälkeen. @AfterAll
6. @Jättää huomiotta Tätä annotaatiota voidaan käyttää, jos haluat jättää joitakin lauseita huomiotta testin suorituksen aikana, esimerkiksi poistaa joitakin testitapauksia käytöstä testin suorituksen aikana. @Vammaiset
7. @Testi(aikakatkaisu=500) Tätä merkintää voidaan käyttää, jos haluat asettaa aikakatkaisun testin suorituksen aikana, esimerkiksi jos työskentelet SLA:n (palvelutasosopimuksen) alaisuudessa ja testit on suoritettava tietyn ajan kuluessa. @Timeout tai assertTimeout
8. @Test(expected=IllegalArgumentException.class) Tätä annotaatiota voidaan käyttää, jos haluat käsitellä jonkin poikkeuksen testin suorituksen aikana. Esimerkiksi, jos haluat tarkistaa, heittääkö tietty metodi tietyn poikkeuksen vai ei. assertThrows

JUnit Esimerkki huomautuksista

Luodaan luokka, joka kattaa tärkeitä JUnit huomautukset yksinkertaisilla tulostuslauseilla ja suorita se testirunner-luokassa:

Vaihe 1) Harkitse alla olevaa Java luokka, jolla on erilaisia ​​metodeja, jotka on liitetty yllä lueteltuihin merkintöihin:

JunitAnnotationsExample.java

package guru99.junit;		

import static org.junit.Assert.assertEquals;				
import static org.junit.Assert.assertFalse;				

import java.util.ArrayList;		

import org.junit.After;		
import org.junit.AfterClass;		
import org.junit.Before;		
import org.junit.BeforeClass;		
import org.junit.Ignore;		
import org.junit.Test;		

public class JunitAnnotationsExample {				

    private ArrayList<String> list;					

    @BeforeClass		
    public static void m1() {							
        System.out.println("Using @BeforeClass , executed before all test cases ");					
    }		

    @Before		
    public void m2() {					
        list = new ArrayList<String>();					
        System.out.println("Using @Before annotations ,executed before each test cases ");					
    }		

    @AfterClass		
    public static void m3() {							
        System.out.println("Using @AfterClass ,executed after all test cases");					
    }		

    @After		
    public void m4() {					
        list.clear();			
        System.out.println("Using @After ,executed after each test cases");					
    }		

    @Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

    @Ignore		
    public void m6() {					
        System.out.println("Using @Ignore , this execution is ignored");					
    }		

    @Test(timeout = 10)			
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

    @Test(expected = NoSuchMethodException.class)					
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					

    }		

}		

Vaihe 2) Luodaan testisuoritinluokka yllä olevan testin suorittamiseksi:

TestRunner.java

package guru99.junit;		

import org.junit.runner.JUnitCore;		
import org.junit.runner.Result;		
import org.junit.runner.notification.Failure;		

public class TestRunner {				
			public static void main(String[] args) {									
      Result result = JUnitCore.runClasses(JunitAnnotationsExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

odotettu tulos

  • Kaikki testitapaukset suoritetaan yksi kerrallaan, ja kaikki tulostuslausekkeet näkyvät konsolissa.
  • Kuten yllä olevassa taulukossa on käsitelty, @Before ja @BeforeClass kohdassa JUnit [metodit m2() ja m1()] suoritetaan ennen jokaista testitapausta ja vastaavasti ennen kaikkia testitapauksia.
  • Samalla tavalla @After ja @AfterClass JUnit (metodit m4() ja m3()) suoritetaan kunkin testitapauksen ja kaikkien testitapausten jälkeen. @Ignore (metodi m6()) tulkitaan testin hylkäämiseksi.

Analysoidaan yllä käytetyt testitapaukset Java luokka tarkemmin:

  1. Tarkastellaan alla olevaa metodia m5():
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

Yllä olevassa menetelmässä, kun lisäät merkkijonon muuttujaan "list":

  • list.isEmpty() palauttaa false.
  • assertFalse(list.isEmpty()) täytyy palata tosi.
  • Tämän seurauksena testitapaus tulee kulkea.

Koska olet lisännyt listaan ​​vain yhden merkkijonon, koko on yksi.

  • lista.koko() täytyy palauttaa kokonaislukuarvo ”1”.
  • So assertEquals(1, list.size()) täytyy palata tosi.
  • Tämän seurauksena testitapaus tulee kulkea.
  1. Tarkastellaan alla olevaa metodia m7():
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Kuten edellä on mainittu, @Test(aikakatkaisu = 10) käytetään aikakatkaisun asettamiseen testitapauksessa. Arvo on millisekunteina, joten m7():n on päätyttävä 10 ms:n kuluessa.

  1. Tarkastellaan alla olevaa metodia m8():
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Kuten edellä on mainittu, @Testi(odotettu) tarkistaa määritettyä poikkeusta suorituksensa aikana, joten metodi m8() heittää ilmoituksen ”No Such Method Exception”. Tämän seurauksena testi suoritetaan poikkeuksella.

Tarkkuushuomautus: m8() tulostaa vain rivin, joten ilmoitettua poikkeusta ei koskaan itse asiassa heitetä ja JUnit 4 raportoi testin epäonnistuneeksi. Sovita odotettu tyyppi metodin todelliseen heittämään tulokseen. JUnit 5 kirjoittaa tämän assertThrows.

Koska kaikki testitapaukset on hyväksytty, tämä johtaa onnistuneeseen testin suorittamiseen.

Todellinen tulos

Koska yllä olevassa esimerkissä on kolme testitapausta, ne suoritetaan yksi kerrallaan. Katso alla oleva konsolin kuvakaappaus:

Eclipse konsolin tuloste, joka näyttää @BeforeClass-, @Before-, @After- ja @AfterClass-tulostuslausekkeet
JunitAnnotationsExamplen tuottama konsolin tuloste

Katso alla tulostetut lausunnot, jotka näkyvät konsolissa:

@BeforeClass käyttö, suoritetaan ennen kaikkia testitapauksia

@Before-merkintöjen käyttäminen, joka suoritetaan ennen jokaista testitapausta

@After-toiminto, joka suoritetaan jokaisen testitapauksen jälkeen

@Before-merkintöjen käyttäminen, joka suoritetaan ennen jokaista testitapausta

Käyttämällä @Test(timeout) sitä voidaan käyttää aikakatkaisun pakottamiseen JUnit4 testitapausta

@After-toiminto, joka suoritetaan jokaisen testitapauksen jälkeen

@Before-merkintöjen käyttäminen, joka suoritetaan ennen jokaista testitapausta

Käyttämällä @Test(expected) -toimintoa se tarkistaa tietyn poikkeuksen varalta suorituksensa aikana

@After-toiminto, joka suoritetaan jokaisen testitapauksen jälkeen

@AfterClassilla, suoritetaan kaikkien testitapausten jälkeen

JUnit Assert Class

Annotaatiot päättävät, milloin metodi suoritetaan; assert-metodit päättävät, onnistuuko se.

Tämä luokka tarjoaa joukon assertion-metodeja, jotka ovat hyödyllisiä testitapausten kirjoittamisessa. Jos kaikki assert-lausekkeet onnistuvat, testitulokset ovat onnistuneita. Jos jokin assert-lauseke epäonnistuu, testitulokset ovat hylättyjä. Omistettu JUnit puolustaa opetusohjelma käsittelee kutakin menetelmää perusteellisesti.

Kuten aiemmin näit, alla oleva taulukko kuvaa tärkeitä Assert-metodeja ja niiden kuvauksia:

S.No. Menetelmä Tuotetiedot
1. void assertEquals (oletettu looginen arvo, todellinen looginen arvo) Se tarkistaa, ovatko kaksi arvoa yhtä suuret, samalla tavalla kuin Object-luokan equals-metodi.
2. void assertFalse (boolen ehto) Toiminnallisuus on tarkistaa, että ehto on epätosi.
3. void assertNotNull(Object object) "assertNotNull"-toiminto on tarkistaa, että objekti ei ole tyhjä.
4. void assertNull(Objektiobjekti) "assertNull"-toiminto on tarkistaa, että objekti on tyhjä.
5. void assertTrue (boolen ehto) "assertTrue"-toiminto on tarkistaa, että ehto on tosi.
6. void fail () Jos haluat heittää väitevirheen, fail() johtaa aina hylkäystuloksiin.
7. void assertSame([merkkijonoviesti] "assertSame" -toiminto on tarkistaa, että nämä kaksi objektia viittaavat samaan objektiin.
8. void assertNotSame([merkkijonoviesti] "assertNotSame" -toiminto on varmistaa, että nämä kaksi objektia eivät viittaa samaan objektiin.

JUnit Testitapausten luokka

Useiden testien suorittamiseen TestCase-luokka on käytettävissä kohdassa junit.framework paketti. @Test-annotaatio kertoo JUnit että tätä public void -metodia (tässä testitapaus), johon se on liitetty, voidaan ajaa testitapauksena.

Versiohuomautus: Testitapaus, Testitulos ja TestSuite kuuluvat perintöön junit.framework paketti JUnit 3. Ne toimitetaan edelleen junit 4.x -artefaktin sisällä, mutta annotaatiopohjaiset testit eivät laajenna TestCasea.

Alla oleva taulukko näyttää joitakin tärkeitä menetelmiä, jotka ovat käytettävissä junit.framework.TestCase luokka:

S.No. Menetelmä Tuotetiedot
1. int countTestCases() Tätä menetelmää käytetään laskemaan, kuinka monta testitapausta suoritetaan suorita (TestResult tr) menetelmällä.
2. TestResult createResult() Tätä menetelmää käytetään luomaan a Testitulos esine.
3. Merkkijono getName () Tämä menetelmä palauttaa merkkijonon, joka on vain a Testitapaus nimi.
4. TestResult run() Tätä metodia käytetään testin suorittamiseen, joka palauttaa Testitulos esine.
5. tyhjä ajo (testitulos) Tätä menetelmää käytetään testin suorittamiseen, jolla on a Testitulos objekti, joka ei palauta mitään.
6. void setName (merkkijono) Tätä menetelmää käytetään nimen asettamiseen Testitapaus.
7. void setUp() Tätä metodia käytetään resurssien yhdistämiskoodin kirjoittamiseen, esimerkiksi tietokantayhteyden luomiseen.
8. void tearDown() Tätä metodia käytetään resurssien vapautuskoodin kirjoittamiseen, esimerkiksi tietokantayhteyden vapauttamiseen transaktio-operaation suorittamisen jälkeen.

JUnit Testitulosluokka

Kun suoritat testin, se palauttaa tuloksen (muodossa Testitulos objekti). Tätä TestResult-objektia voidaan käyttää tuloksena olevan objektin analysointiin. Tämä testitulos voi olla joko epäonnistunut tai onnistunut.

Katso alla olevasta taulukosta junit.framework.TestResult-luokassa käytetyt tärkeät metodit:

S.No. Menetelmä Tuotetiedot
1. void addError (testi, heitettävissä t) Tätä menetelmää käytetään, jos testiin on lisättävä virhe.
2. void addFailure (testi, AssertionFailedError t) Tätä menetelmää käytetään, jos haluat lisätä vian vikojen luetteloon.
3. void endTest (testi) Tätä menetelmää käytetään ilmoittamaan, että testi on suoritettu (valmis).
4. int errorCount() Tätä menetelmää käytetään virheiden havaitsemiseen testin suorituksen aikana.
5. Luettelo virheet () Tämä metodi palauttaa yksinkertaisesti kokoelman (tässä luettelon) virheitä.
6. int errorCount() Tätä menetelmää käytetään testin suorituksen aikana havaittujen virheiden määrän selvittämiseen.
7. tyhjä ajo (TestCase-testi) Tätä menetelmää käytetään testitapauksen suorittamiseen.
8. int runCount() Tämä metodi yksinkertaisesti laskee suoritetut testit.
9. mitätön aloitustesti (testi) Tätä menetelmää käytetään ilmoittamaan testin alkamisesta.
10. void stop() Tätä menetelmää käytetään testiajon pysäyttämiseen.

JUnit Test Suite Class

Jos haluat suorittaa useita testejä tietyssä järjestyksessä, se voidaan tehdä yhdistämällä kaikki testit yhteen paikkaan. Tätä paikkaa kutsutaan testipaketiksi, ja JUnit testisarja opetusohjelma käy läpi täydellisen esimerkin.

Katso alla olevasta taulukosta tärkeimmät käytetyt menetelmät junit.framework.TestSuite luokka:

S.No. Menetelmä Tuotetiedot
1. void addTest (testi) Tätä menetelmää käytetään, jos haluat lisätä sarjaan testin.
2. void addTestSuite(Class testiluokka) Tätä menetelmää käytetään, jos haluat määrittää luokan, kun lisäät testin sarjaan.
3. int countTestCases() Tätä menetelmää käytetään, jos haluat laskea testitapausten lukumäärän.
4. Merkkijono getName () Tätä menetelmää käytetään testipaketin nimen saamiseksi.
5. tyhjä ajo (testitulos) Tätä menetelmää käytetään testin suorittamiseen ja testitulosten keräämiseen Testitulos esine.
6. void setName (merkkijono) Tätä menetelmää käytetään nimen asettamiseen TestSuite.
7. Testaa testiAt(int index) Tätä metodia käytetään, jos haluat palauttaa testin tietyllä indeksillä.
8. int testCount() Tätä metodia käytetään, jos haluat palauttaa testipaketin testimäärän.
9. staattinen testivaroitus (merkkijonoviesti) Tämä menetelmä palauttaa testin, joka epäonnistuu, ja kirjaa varoitusviestin.

UKK

Kyllä. Metodi sisältää yleensä @Test-metodin yhdessä @Ignore-metodin kanssa tai @Test-metodin sekä aikakatkaisun että odotetun poikkeuksen kanssa. Kahta elinkaarimerkintää, kuten @Before ja @After, ei voi pinota päällekkäin yhdelle metodille.

@Ignore vain estää metodin käytön JUnit tunnistaa jo testiksi. Ilman vieressä olevaa @Test-metodia suoritusohjelma ei koskaan kerää metodia, joten sitä ei suoriteta eikä listata ohitetuksi.

JUnit suorittaa metodin erillisessä säikeessä ja epäonnistuu TestTimedOutException-poikkeuksella budjetin umpeuduttua. Säie keskeytetään, ei lopeteta, joten estävä kutsu saattaa jatkua.

Vain vintage-moottorin kautta. Lisäämällä junit-vintage-engine:n... JUnit Alusta suorittaa olemassa olevat org.junit-testit muuttumattomina, mutta Jupiter-testien on tuotava org.junit.jupiter.api. Molempien tuontijoukkojen yhdistäminen samaan luokkaan epäonnistuu.

Vain ylläpitoon. Vanhemmissa koodikannoissa on edelleen yleisiä perinteisiä ohjelmistopaketteja, jotka laajentavat TestCasea ja rakentavat TestSuite-objekteja, joten API:n tunnistaminen auttaa. Uusien testien tulisi olla annotaatiopohjaisia.

JUnit luo uuden instanssin testiluokasta jokaista testimetodia varten, joten sellaista ei ole olemassa, kun luokkatason asennus on suoritettava. Staattinen metodi ei tarvitse instanssia, ja JUnit hylkää ei-staattisen deklaraation.

Tekoälyavustajat lukevat testattavan metodin ja ehdottavat, kuuluuko asennus @Before- vai @BeforeClass-luokkaan ja tarvitseeko vikapolku @Test(expected)- vai assertThrows-metodin. Käsittele jokaista ehdotusta luonnoksena.

GitHub Copilot yleensä asettaa asennuksen ja purkamisen oikein, mutta se usein sekoittuu JUnit 4 ja Jupiter tuodaan yhteen tiedostoon. Tarkista tuontilohko ennen sarjan suorittamista.

Tiivistä tämä viesti seuraavasti: