JUnit Annoteringsveiledning med eksempel: Hva er @Test og @Etter

โšก Smart oppsummering

JUnit Annoteringer er en form for syntaktiske metadata som legges til Java kildekoden slik at en testkjรธrer vet hvilke metoder som skal kjรธres, nรฅr de skal kjรธres, og hvor lang tid hver metode kan ta.

  • ๐Ÿ”˜ @Test: Markerer en offentlig void-metode som JUnit kjรธres som et enkelt testtilfelle.
  • โ˜‘๏ธ Livssyklus: @Before og @After pakker inn hver test, mens @BeforeClass og @AfterClass pakker inn klassen.
  • โœ… Kontroll: @Ignore hopper over en test, @Test(timeout) begrenser kjรธretiden, @Test(expected) bekrefter et utlรธst unntak.
  • ๐Ÿงช Pรฅstander: org.junit.Assert leverer assertEquals, assertTrue, assertNull, assertSame og fail().
  • ๐Ÿ› ๏ธ Arv: TestCase, TestResult og TestSuite tilhรธrer den eldre junit.framework-pakken.
  • ๐Ÿ“Š JUnit 5: Jupiter endrer navn pรฅ disse til @BeforeEach, @AfterEach, @BeforeAll, @AfterAll og @Disabled.

JUnit annotasjonsveiledning som dekker @Test, @Fรธr og @Etter

Hva er JUnit Merknader?

JUnit merknader er en spesiell form for syntaktiske metadata som kan legges til Java kildekode for bedre lesbarhet og struktur av koden. Variabler, parametere, pakker, metoder og klasser kan annoteres. Annoteringer ble introdusert i JUnit 4, som gjรธr Java kode mer lesbar og enkel. Dette er den store forskjellen mellom JUnit 3 og JUnit 4: JUnit 4 er basert pรฅ annotasjoner.

Med praktisk kunnskap om disse annotasjonene kan man enkelt lรฆre og implementere en JUnit test. Nedenfor er det viktige og ofte brukte JUnit annoteringsliste, med JUnit 5 (Jupiter) ekvivalenter ved siden av hver enkelt:

S.No. Merknader Tekniske beskrivelser JUnit 5 tilsvarende
1. @Test Denne annotasjonen erstatter junit.framework.TestCase, og indikerer at public void-metoden som den er knyttet til kan kjรธres som et testtilfelle. @Test (org.junit.jupiter.api)
2. @Fรธr Denne merknaden brukes hvis du รธnsker รฅ utfรธre en setning som forutsetninger fรธr hvert testtilfelle. @FรธrHver
3. @BeforeClass Denne annotasjonen brukes hvis du vil utfรธre noen setninger fรธr alle testtilfellene, for eksempel en testforbindelse som mรฅ รฅpnes fรธr alle testtilfellene. @FรธrAlle
4. @Etter Denne merknaden kan brukes hvis du รธnsker รฅ utfรธre noen setninger etter hver Testsak, for eksempel tilbakestille variabler eller slette midlertidige filer. @EtterEach
5. @Etter timen Denne annotasjonen kan brukes hvis du vil utfรธre noen setninger etter alle testtilfeller, for eksempel frigjรธre ressurser etter at alle testtilfeller er utfรธrt. @AfterAll
6. @Overse Denne annotasjonen kan brukes hvis du vil ignorere noen setninger under testkjรธring, for eksempel deaktivere noen testtilfeller under testkjรธring. @Funksjonshemmet
7. @Test(timeout=500) Denne merknaden kan brukes hvis du vil angi en tidsavbruddsgrense under testkjรธring, for eksempel hvis du jobber under en SLA (servicenivรฅavtale) og testene mรฅ fullfรธres innen en angitt tid. @Timeout eller assertTimeout
8. @Test(expected=IllegalArgumentException.class) Denne annoteringen kan brukes hvis du vil hรฅndtere et unntak under testkjรธring. For eksempel hvis du vil sjekke om en bestemt metode kaster et spesifisert unntak eller ikke. hevdeKast

JUnit Eksempel pรฅ merknader

La oss lage en klasse som dekker viktig JUnit merknader med enkle utskriftssetninger og utfรธr den med en testlรธperklasse:

Trinn 1) Vurder det fรธlgende Java klasse som har forskjellige metoder som er knyttet til annotasjonene ovenfor:

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");					

    }		

}		

Trinn 2) La oss opprette en testlรธperklasse for รฅ utfรธre testen ovenfor:

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());							
   }		
}      	

forventet resultat

  • Alle testtilfellene vil bli utfรธrt รฉn etter รฉn, og alle utskriftssetninger kan sees pรฅ en konsoll.
  • Som omtalt i tabellen ovenfor, @Before og @BeforeClass i JUnit [metodene m2() og m1()] vil bli utfรธrt fรธr hver testtilfelle og fรธr alle testtilfeller henholdsvis.
  • Pรฅ samme mรฅte @After og @AfterClass i JUnit (metodene m4() og m3()) vil bli utfรธrt etter hver testtilfelle og etter alle testtilfeller. @Ignore (metode m6()) vil bli behandlet som รฅ ignorere testen.

La oss analysere testtilfellene som ble brukt ovenfor Java klasse i detalj:

  1. Tenk pรฅ metoden m5() som gitt nedenfor:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

I metoden ovenfor, mens du legger til en streng i variabelen ยซlisteยป:

  • list.isEmpty() vil returnere usann.
  • assertFalse(list.isEmpty()) mรฅ returnere sant.
  • Som et resultat vil testsaken passere.

Siden du bare har lagt til รฉn streng i listen, er stรธrrelsen รฉn.

  • list.size() mรฅ returnere int-verdien ยซ1ยป.
  • So assertEquals(1, list.size()) mรฅ returnere sant.
  • Som et resultat vil testsaken passere.
  1. Tenk pรฅ metoden m7() som gitt nedenfor:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Som diskutert ovenfor, @Test(tidsavbrudd = 10) brukes til รฅ hรฅndheve en timeout i testtilfellet. Verdien er i millisekunder, sรฅ m7() mรฅ fullfรธres innen 10 ms.

  1. Tenk pรฅ metoden m8() som gitt nedenfor:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Som diskutert ovenfor, @Test(forventet) vil sjekke for det angitte unntaket under kjรธringen, sรฅ metoden m8() vil kaste ยซNo Such Method Exceptionยป. Som et resultat vil testen bli utfรธrt med et unntak.

Nรธyaktighetsmerknad: m8() skriver bare ut en linje, sรฅ det deklarerte unntaket blir aldri kastet, og JUnit 4 rapporterer testen som mislykket. Juster den forventede typen med det metoden faktisk kaster. JUnit 5 skriver dette med hevdeKast.

Ettersom alle testtilfeller er bestรฅtt, resulterer dette i en vellykket testgjennomfรธring.

Egentlige resultatet

Siden det er tre testtilfeller i eksemplet ovenfor, vil alle testtilfellene bli utfรธrt รฉn etter รฉn. Se skjermbildet av konsollen nedenfor:

Eclipse konsollutdata som viser utskriftssetningene @BeforeClass, @Before, @After og @AfterClass
Konsollutdata produsert av JunitAnnotationsExample

Se utskriftserklรฆringene nedenfor som kan sees pรฅ konsollen:

Ved รฅ bruke @BeforeClass , utfรธrt fรธr alle testtilfeller

Bruke @Before-kommentarer, utfรธrt fรธr hver testcase

Ved hjelp av @After, utfรธrt etter hvert testtilfelle

Bruke @Before-kommentarer, utfรธrt fรธr hver testcase

Ved รฅ bruke @Test(timeout), kan den brukes til รฅ fremtvinge timeout i JUnit4 testcase

Ved hjelp av @After, utfรธrt etter hvert testtilfelle

Bruke @Before-kommentarer, utfรธrt fรธr hver testcase

Ved รฅ bruke @Test(expected), vil den se etter spesifisert unntak under kjรธringen

Ved hjelp av @After, utfรธrt etter hvert testtilfelle

Ved รฅ bruke @AfterClass, utfรธrt etter alle testtilfeller

JUnit Pรฅstรฅ klasse

Annotasjonene bestemmer nรฅr en metode kjรธrer; assert-metodene bestemmer om den bestรฅr.

Denne klassen tilbyr en rekke pรฅstandsmetoder som er nyttige for รฅ skrive et testtilfelle. Hvis alle pรฅstandssetninger er bestรฅtt, er testresultatene vellykkede. Hvis noen pรฅstandssetning mislykkes, er testresultatene mislykkede. Den dedikerte JUnit hevde Veiledningen dekker hver metode i dybden.

Som du har sett tidligere, beskriver tabellen nedenfor viktige Assert-metoder og beskrivelsen av dem:

S.No. Metode Tekniske beskrivelser
1. void assertEquals(boolsk forventet, boolsk faktisk) Den sjekker om to verdier er like, pรฅ samme mรฅte som equals-metoden til Object-klassen.
2. void assertFalse (boolsk tilstand) Funksjonalitet er รฅ sjekke om en betingelse er usann.
3. void assertNotNull(Objektobjekt) "assertNotNull" funksjonalitet er รฅ sjekke at et objekt ikke er null.
4. void assertNull(Objektobjekt) "assertNull" funksjonalitet er รฅ sjekke at et objekt er null.
5. void assertTrue (boolsk tilstand) "assertTrue" funksjonalitet er รฅ sjekke at en betingelse er sann.
6. void fail() Hvis du vil utlรธse en pรฅstandsfeil, resulterer fail() alltid i en feilverdikk.
7. void assertSame([Strengmelding] "assertSame" funksjonalitet er รฅ sjekke at de to objektene refererer til det samme objektet.
8. void assertNotSame([String message] "assertNotSame" funksjonalitet er รฅ sjekke at de to objektene ikke refererer til det samme objektet.

JUnit Testtilfeller klasse

For รฅ kjรธre flere tester er TestCase-klassen tilgjengelig i junit.framework pakke. @Test-annotasjonen forteller JUnit at denne public void-metoden (et testtilfelle her) som den er knyttet til, kan kjรธres som et testtilfelle.

Versjonsmerknad: TestCase, Prรธve resultater og TestSuite tilhรธrer arven junit.framework pakke fra JUnit 3. De leveres fortsatt i junit 4.x-artefakten, men annotasjonsbaserte tester utvider ikke TestCase.

Tabellen nedenfor viser noen viktige metoder som er tilgjengelige i junit.framework.TestCase klasse:

S.No. Metode Tekniske beskrivelser
1. int countTestCases() Denne metoden brukes til รฅ telle hvor mange testtilfeller som utfรธres av kjรธr(Testresultat tr) metoden.
2. TestResult createResult() Denne metoden brukes til รฅ lage en Prรธve resultater gjenstand.
3. String getName() Denne metoden returnerer en streng som ikke er annet enn en TestCase navn.
4. TestResult run() Denne metoden brukes til รฅ utfรธre en test, som returnerer en Prรธve resultater gjenstand.
5. ugyldig kjรธring (testresultatresultat) Denne metoden brukes til รฅ utfรธre en test som har en Prรธve resultater objekt, som ikke returnerer noe.
6. void setName (strengnavn) Denne metoden brukes til รฅ angi navnet pรฅ en TestCase.
7. void oppsett() Denne metoden brukes til รฅ skrive ressursassosiasjonskode, for eksempel รฅ opprette en databasetilkobling.
8. void tearDown() Denne metoden brukes til รฅ skrive ressursfrigivelseskode, for eksempel frigivelse av en databasetilkobling etter รฅ ha utfรธrt en transaksjonsoperasjon.

JUnit Testresultatklasse

Nรฅr du utfรธrer en test, returnerer den et resultat (i form av en Prรธve resultater Dette TestResult-objektet kan brukes til รฅ analysere det resulterende objektet. Testresultatet kan enten vรฆre mislykket eller vellykket.

Se tabellen nedenfor for viktige metoder som brukes i junit.framework.TestResult-klassen:

S.No. Metode Tekniske beskrivelser
1. void addError(Test test, Kastbar t) Denne metoden brukes hvis du trenger รฅ legge til en feil i testen.
2. void addFailure(Testtest, AssertionFailedError t) Denne metoden brukes hvis du trenger รฅ legge til en feil i listen over feil.
3. void endTest (Test test) Denne metoden brukes til รฅ varsle at en test er utfรธrt (fullfรธrt).
4. int errorCount() Denne metoden brukes til รฅ finne feil som oppdages under testkjรธring.
5. Oppregning feil() Denne metoden returnerer ganske enkelt en samling (en opplisting her) av feil.
6. int failureCount() Denne metoden brukes til รฅ fรฅ antallet feil som oppdages under testkjรธring.
7. ugyldig kjรธring (TestCase-test) Denne metoden brukes til รฅ utfรธre en testsak.
8. int runCount() Denne metoden teller ganske enkelt de utfรธrte testene.
9. void startTest (Test test) Denne metoden brukes til รฅ varsle om at en test er startet.
10. void stop() Denne metoden brukes for รฅ stoppe testkjรธringen.

JUnit Testsuite klasse

Hvis du vil utfรธre flere tester i en bestemt rekkefรธlge, kan det gjรธres ved รฅ kombinere alle testene pรฅ ett sted. Dette stedet kalles en testsuite, og JUnit testsuite veiledningen gรฅr gjennom et fullstendig eksempel.

Se tabellen nedenfor for viktige metoder som brukes i junit.framework.TestSuite klasse:

S.No. Metode Tekniske beskrivelser
1. void addTest (Test test) Denne metoden brukes hvis du vil legge til en test i suiten.
2. void addTestSuite(Klasse testklasse) Denne metoden brukes hvis du vil spesifisere klassen mens du legger til en test til suiten.
3. int countTestCases() Denne metoden brukes hvis du รธnsker รฅ telle antall testtilfeller.
4. String getName() Denne metoden brukes for รฅ fรฅ navnet pรฅ testpakken.
5. ugyldig kjรธring (testresultatresultat) Denne metoden brukes til รฅ utfรธre en test og samle testresultatet i en Prรธve resultater gjenstand.
6. void setName (strengnavn) Denne metoden brukes til รฅ angi navnet pรฅ TestSuite.
7. Test testAt(int index) Denne metoden brukes hvis du vil returnere testen ved en gitt indeks.
8. int testCount() Denne metoden brukes hvis du vil returnere antall tester i serien.
9. statisk testadvarsel (strengmelding) Denne metoden returnerer en test som vil mislykkes og logger en advarselsmelding.

Spรธrsmรฅl og svar

Ja. En metode bรฆrer vanligvis @Test sammen med @Ignore, eller @Test med bรฅde en timeout og et forventet unntak. Du kan ikke stable to livssyklusannoteringer, for eksempel @Before og @After, pรฅ รฉn metode.

@Ignore undertrykker bare en metode JUnit gjenkjenner allerede som en test. Uten @Test ved siden av samler lรธperen aldri metoden, sรฅ den blir verken kjรธrt eller oppfรธrt som hoppet over.

JUnit kjรธrer metoden pรฅ en separat trรฅd og feiler den med en TestTimedOutException nรฅr budsjettet er utlรธpt. Trรฅden avbrytes, ikke drepes, sรฅ et blokkerende kall kan fortsette รฅ kjรธre.

Bare gjennom vintage-motoren. ร… legge til junit-vintage-engine lar JUnit Plattformen kjรธrer eksisterende org.junit-tester uendret, men Jupiter-tester mรฅ importere org.junit.jupiter.api. Blanding av begge importsettene i รฉn klasse mislykkes.

Kun for vedlikehold. Eldre tester som utvider TestCase og bygger TestSuite-objekter er fortsatt vanlige i eldre kodebaser, sรฅ det hjelper รฅ gjenkjenne API-et. Nye tester bรธr vรฆre annotasjonsbaserte.

JUnit bygger en ny instans av testklassen for hver testmetode, slik at ingen finnes nรฅr oppsett pรฅ klassenivรฅ mรฅ kjรธres. En statisk metode trenger ingen instans, og JUnit avviser en ikke-statisk deklarasjon.

AI-assistenter leser metoden som testes og foreslรฅr om oppsettet hรธrer hjemme i @Before eller @BeforeClass, og om en feilsti trenger @Test(expected) eller assertThrows. Behandle alle forslag som et utkast.

GitHub Copilot vanligvis plasserer oppsett og demontering riktig, men det blandes ofte JUnit 4 og Jupiter importerer i รฉn fil. Sjekk importblokken fรธr du kjรธrer programvarepakken.

Oppsummer dette innlegget med: