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

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