JUnit Annotationsvejledning med eksempel: Hvad er @Test og @After
⚡ Smart opsummering
JUnit Annotationer er en form for syntaktiske metadata, der tilføjes til Java kildekode, så en testkører ved, hvilke metoder der skal udføres, hvornår de skal køres, og hvor lang tid hver metode kan tage.

Hvad er JUnit Anmærkninger?
JUnit anmærkninger er en særlig form for syntaktiske metadata, der kan tilføjes til Java kildekode for bedre kodelæsbarhed og struktur. Variabler, parametre, pakker, metoder og klasser kan annoteres. Annotationer blev introduceret i JUnit 4, hvilket gør Java kode mere læsbar og enkel. Dette er den store forskel mellem JUnit 3 og JUnit 4: JUnit 4 er baseret på annotationer.
Med et praktisk kendskab til disse annotationer kan man nemt lære og implementere en JUnit prøve. Nedenfor er det vigtige og ofte brugte JUnit annotationsliste, med JUnit 5 (Jupiter) tilsvarende ved siden af hver enkelt:
| S.No. | Annotationer | Beskrivelse | JUnit svarende til 5 |
|---|---|---|---|
| 1. | @Prøve | Denne annotation erstatter junit.framework.TestCase og angiver, at den public void-metode, som den er knyttet til, kan udføres som en testcase. | @Test (org.junit.jupiter.api) |
| 2. | @Før | Denne annotation bruges, hvis du ønsker at udføre en sætning, såsom forudsætninger, før hver testcase. | @FørHver |
| 3. | @BeforeClass | Denne annotation bruges, hvis du vil udføre nogle sætninger før alle testtilfældene, for eksempel en testforbindelse, der skal åbnes før alle testtilfældene. | @FørAlle |
| 4. | @Efter | Denne annotation kan bruges, hvis du ønsker at udføre nogle udsagn efter hver Test sag, for eksempel nulstilling af variabler eller sletning af midlertidige filer. | @EfterHver |
| 5. | @Efter skole | Denne annotation kan bruges, hvis du vil udføre nogle statements efter alle testcases, for eksempel frigive ressourcer efter at alle testcases er udført. | @EfterAlle |
| 6. | @Ignorere | Denne annotation kan bruges, hvis du vil ignorere visse udsagn under testkørsel, for eksempel ved at deaktivere visse testtilfælde under testkørsel. | @Handicappet |
| 7. | @Test(timeout=500) | Denne annotation kan bruges, hvis du vil indstille en timeout under testudførelsen, for eksempel hvis du arbejder under en SLA (serviceniveauaftale), og testene skal afsluttes inden for en bestemt tid. | @Timeout eller assertTimeout |
| 8. | @Test(expected=IllegalArgumentException.class) | Denne annotation kan bruges, hvis du vil håndtere en undtagelse under testudførelse. For eksempel hvis du vil kontrollere, om en bestemt metode kaster en specifik undtagelse eller ej. | hævderKast |
JUnit Eksempel på anmærkninger
Lad os skabe en klasse, der dækker vigtigt JUnit annoteringer med simple print-udsagn og udfør det med en testløberklasse:
Trin 1) Overvej nedenstående Java klasse med forskellige metoder, der er knyttet til ovenstående annotationer:
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"); } }
Trin 2) Lad os oprette en testrunner-klasse til at udføre ovenstående test:
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 testcases vil blive udført én efter én, og alle print-sætninger kan ses på en konsol.
- Som beskrevet i ovenstående tabel, @Before og @BeforeClass i JUnit [metoderne m2() og m1()] vil blive udført før hver testcase og før alle testcases henholdsvis.
- På samme måde @After og @AfterClass i JUnit (metoderne m4() og m3()) vil blive udført efter hver testcase og efter alle testcases. @Ignore (metode m6()) vil blive behandlet som om testen er blevet ignoreret.
Lad os analysere de testcases, der er brugt i ovenstående Java klasse i detaljer:
- Overvej metode m5() som angivet nedenfor:
@Test
public void m5() {
list.add("test");
assertFalse(list.isEmpty());
assertEquals(1, list.size());
}
I ovenstående metode, når du tilføjer en streng til variablen "liste":
- list.isEmpty() vil returnere falsk.
- assertFalse(list.isEmpty()) skal returnere sandt.
- Som følge heraf vil testcasen passerer.
Da du kun har tilføjet én streng til listen, er størrelsen én.
- list.size() skal returnere int-værdien “1”.
- So assertEquals(1, list.size()) skal returnere sandt.
- Som følge heraf vil testcasen passerer.
- Overvej metode m7() som angivet 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 diskuteret ovenfor, @Test(timeout = 10) bruges til at håndhæve en timeout i testcasen. Værdien er i millisekunder, så m7() skal afsluttes inden for 10 ms.
- Overvej metode m8() som angivet nedenfor:
@Test(expected = NoSuchMethodException.class) public void m8() { System.out.println("Using @Test(expected) ,it will check for specified exception during its execution"); }
Som diskuteret ovenfor, @Test(forventet) vil kontrollere for den angivne undtagelse under udførelsen, så metoden m8() vil kaste "No Such Method Exception." Som et resultat vil testen blive udført med en undtagelse.
Nøjagtighedsbemærkning: m8() udskriver kun en linje, så den deklarerede undtagelse bliver aldrig kastet, og JUnit 4 rapporterer testen som mislykket. Juster den forventede type med det, metoden rent faktisk kaster. JUnit 5 skriver dette med hævderKast.
Da alle testcases er bestået, resulterer dette i en vellykket testeksekvering.
Faktisk resultat
Da der er tre testcases i ovenstående eksempel, vil alle testcases blive udført én efter én. Se konsolskærmbilledet nedenfor:

Se nedenstående trykte erklæringer, som kan ses på konsollen:
Brug af @BeforeClass , udført før alle testcases
Brug af @Before-annoteringer, udført før hver testcase
Brug af @After, udført efter hver testcase
Brug af @Before-annoteringer, udført før hver testcase
Ved at bruge @Test(timeout) kan den bruges til at gennemtvinge timeout JUnit4 testcase
Brug af @After, udført efter hver testcase
Brug af @Before-annoteringer, udført før hver testcase
Ved at bruge @Test(expected), vil den kontrollere for specificerede undtagelser under udførelsen
Brug af @After, udført efter hver testcase
Ved hjælp af @AfterClass, udført efter alle testsager
JUnit hævde klasse
Annotationerne bestemmer, hvornår en metode kører; assert-metoderne bestemmer, om den består.
Denne klasse tilbyder en række assertion-metoder, der er nyttige til at skrive en testcase. Hvis alle assert-sætninger bestås, er testresultaterne succesfulde. Hvis en assert-sætning fejler, er testresultaterne fejlet. JUnit hævde Tutorial dækker hver metode i dybden.
Som du har set tidligere, beskriver nedenstående tabel vigtige Assert-metoder og deres beskrivelse:
| S.No. | Metode | Beskrivelse |
|---|---|---|
| 1. | void assertEquals(boolesk forventet, boolesk faktisk) | Den kontrollerer, om to værdier er ens, svarende til equals-metoden i Object-klassen. |
| 2. | void assertFalse (boolesk tilstand) | Funktionalitet er at kontrollere, om en betingelse er falsk. |
| 3. | void assertNotNull(Objektobjekt) | "assertNotNull" funktionalitet er at kontrollere, at et objekt ikke er null. |
| 4. | void assertNull(Objektobjekt) | "assertNull" funktionalitet er at kontrollere, at et objekt er null. |
| 5. | void assertTrue (boolesk tilstand) | "assertTrue" funktionalitet er at kontrollere, at en betingelse er sand. |
| 6. | void fail() | Hvis du vil give en assertion-fejl, resulterer fail() altid i en fail-verdic. |
| 7. | void assertSame([String message] | "assertSame" funktionalitet er at kontrollere, at de to objekter refererer til det samme objekt. |
| 8. | void assertNotSame([String message] | "assertNotSame" funktionalitet er at kontrollere, at de to objekter ikke refererer til det samme objekt. |
JUnit Test Cases Klasse
For at køre flere tests er TestCase-klassen tilgængelig i junit.framework pakke. @Test-annotationen fortæller JUnit at denne public void-metode (en testcase her), som den er tilknyttet, kan køres som en testcase.
Versionsnotat: Test sag, Testresultat og TestSuite tilhører arven junit.framework pakke fra JUnit 3. De leveres stadig inde i junit 4.x-artefakten, men annotationsbaserede tests udvider ikke TestCase.
Tabellen nedenfor viser nogle vigtige metoder, der er tilgængelige i junit.framework.TestCase klasse:
| S.No. | Metode | Beskrivelse |
|---|---|---|
| 1. | int countTestCases() | Denne metode bruges til at tælle, hvor mange testcases der udføres af kør (TestResultat tr) fremgangsmåde. |
| 2. | TestResult createResult() | Denne metode bruges til at skabe en Testresultat objekt. |
| 3. | String getName () | Denne metode returnerer en streng, som ikke er andet end en Test sag navngive. |
| 4. | TestResult run() | Denne metode bruges til at udføre en test, som returnerer en Testresultat objekt. |
| 5. | ugyldig kørsel (testresultatresultat) | Denne metode bruges til at udføre en test med en Testresultat objekt, som ikke returnerer noget. |
| 6. | ugyldigt sætnavn (strengnavn) | Denne metode bruges til at indstille navnet på en Test sag. |
| 7. | ugyldig opsætning() | Denne metode bruges til at skrive ressourcetilknytningskode, for eksempel til at oprette en databaseforbindelse. |
| 8. | void tearDown() | Denne metode bruges til at skrive kode til frigivelse af ressourcer, for eksempel til frigivelse af en databaseforbindelse efter udførelse af en transaktionshandling. |
JUnit Testresultatklasse
Når du udfører en test, returnerer den et resultat (i form af en Testresultat Dette TestResult-objekt kan bruges til at analysere det resulterende objekt. Testresultatet kan enten være fejlet eller vellykket.
Se tabellen nedenfor for vigtige metoder, der bruges i junit.framework.TestResult-klassen:
| S.No. | Metode | Beskrivelse |
|---|---|---|
| 1. | void addError(Test test, Throwable t) | Denne metode bruges, hvis du har brug for at tilføje en fejl til testen. |
| 2. | void addFailure(Test test, AssertionFailedError t) | Denne metode bruges, hvis du har brug for at tilføje en fejl til listen over fejl. |
| 3. | void endTest (Test test) | Denne metode bruges til at meddele, at en test er udført (afsluttet). |
| 4. | int errorCount() | Denne metode bruges til at finde fejl, der opdages under testens udførelse. |
| 5. | Optælling fejl() | Denne metode returnerer blot en samling (her en optælling) af fejl. |
| 6. | int failureCount() | Denne metode bruges til at få antallet af fejl, der er opdaget under testens udførelse. |
| 7. | ugyldig kørsel (TestCase-test) | Denne metode bruges til at udføre en testcase. |
| 8. | int runCount() | Denne metode tæller blot de udførte tests. |
| 9. | void startTest (Test test) | Denne metode bruges til at meddele, at en test er startet. |
| 10. | void stop() | Denne metode bruges til at stoppe testkørslen. |
JUnit Test Suite klasse
Hvis du vil udføre flere tests i en bestemt rækkefølge, kan det gøres ved at kombinere alle testene ét sted. Dette sted kaldes en testsuite, og JUnit testsuite Tutorial gennemgår et fuldt eksempel.
Se nedenstående tabel for vigtige metoder, der anvendes i junit.framework.TestSuite klasse:
| S.No. | Metode | Beskrivelse |
|---|---|---|
| 1. | void addTest (Test test) | Denne metode bruges, hvis du vil tilføje en test til suiten. |
| 2. | void addTestSuite(Class testklasse) | Denne metode bruges, hvis du ønsker at angive klassen, mens du tilføjer en test til suiten. |
| 3. | int countTestCases() | Denne metode bruges, hvis du vil tælle antallet af testcases. |
| 4. | String getName () | Denne metode bruges til at få navnet på testpakken. |
| 5. | ugyldig kørsel (testresultatresultat) | Denne metode bruges til at udføre en test og indsamle testresultatet i en Testresultat objekt. |
| 6. | ugyldigt sætnavn (strengnavn) | Denne metode bruges til at indstille navnet på TestSuite. |
| 7. | Test testAt(int index) | Denne metode bruges, hvis du vil returnere testen ved et givet indeks. |
| 8. | int testCount() | Denne metode bruges, hvis du vil returnere antallet af tests i serien. |
| 9. | statisk testadvarsel (strengmeddelelse) | Denne metode returnerer en test, som mislykkes og logger en advarselsmeddelelse. |
