JUnit Annotationshandledning med exempel: Vad är @Test och @After
⚡ Smart sammanfattning
JUnit annoteringar är en form av syntaktisk metadata som läggs till Java källkod så att en testkörare vet vilka metoder som ska köras, när de ska köras och hur lång tid varje metod kan ta.

Vad är JUnit Anteckningar?
JUnit annoteringar är en speciell form av syntaktisk metadata som kan läggas till Java källkod för bättre kodläsbarhet och struktur. Variabler, parametrar, paket, metoder och klasser kan annoteras. Annoteringar introducerades i JUnit 4, vilket gör Java kod mer läsbar och enklare. Detta är den stora skillnaden mellan JUnit 3 och JUnit 4: JUnit 4 är annoteringsbaserad.
Med praktisk kunskap om dessa annoteringar kan man enkelt lära sig och implementera en JUnit testa. Nedan är det viktiga och ofta använda JUnit anteckningslista, med JUnit 5 (Jupiter) ekvivalenter bredvid var och en:
| S.No. | Anteckningar | BESKRIVNING | JUnit 5 motsvarande |
|---|---|---|---|
| 1. | @Testa | Denna annotering ersätter junit.framework.TestCase och indikerar att public void-metoden som den är kopplad till kan köras som ett testfall. | @Test (org.junit.jupiter.api) |
| 2. | @Innan | Den här anteckningen används om du vill exekvera någon sats som t.ex. förutsättningar före varje testfall. | @FöreVarje |
| 3. | @Innan lektionen | Denna annotering används om du vill köra vissa programsatser före alla testfall, till exempel en testanslutning som måste öppnas före alla testfall. | @FöreAllt |
| 4. | @Efter | Denna anteckning kan användas om du vill köra några satser efter varje Testfall, till exempel att återställa variabler eller ta bort tillfälliga filer. | @EfterVarje |
| 5. | @Efter lektionen | Denna annotering kan användas om du vill köra vissa programsatser efter alla testfall, till exempel frigöra resurser efter att alla testfall har körts. | @EfterAllt |
| 6. | @Strunta i | Denna annotering kan användas om du vill ignorera vissa programsatser under testkörning, till exempel genom att inaktivera vissa testfall under testkörning. | @Inaktiverad |
| 7. | @Test(timeout=500) | Den här annoteringen kan användas om du vill ställa in en tidsgräns under testkörningen, till exempel om du arbetar under ett SLA (servicenivåavtal) och tester måste slutföras inom en viss tid. | @Timeout eller assertTimeout |
| 8. | @Test(expected=IllegalArgumentException.class) | Denna annotering kan användas om du vill hantera ett undantag under testkörning. Till exempel om du vill kontrollera om en viss metod utlöser ett angivet undantag eller inte. | hävdaKast |
JUnit Anteckningar Exempel
Låt oss skapa en klass som omfattar viktiga JUnit anteckningar med enkla utskriftssatser och exekvera det med en testkörningsklass:
Steg 1) Tänk på nedanstående Java klass med olika metoder som är kopplade till ovanstående annoteringar:
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"); } }
Steg 2) Låt oss skapa en testrunner-klass för att köra ovanstå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()); } }
Förväntat resultat
- Alla testfall kommer att köras ett efter ett, och alla print-satser kan ses i en konsol.
- Som diskuterats i tabellen ovan, @Before och @BeforeClass i JUnit [metoderna m2() och m1()] kommer att köras före varje testfall respektive före alla testfall.
- På samma sätt @After och @AfterClass i JUnit (metoderna m4() och m3()) kommer att exekveras efter varje testfall respektive efter alla testfall. @Ignore (metod m6()) kommer att behandlas som att testet ignoreras.
Låt oss analysera testfallen som används ovan Java klass i detalj:
- Betrakta metoden m5() enligt nedan:
@Test
public void m5() {
list.add("test");
assertFalse(list.isEmpty());
assertEquals(1, list.size());
}
I metoden ovan, när du lägger till en sträng till variabeln "lista":
- list.isEmpty() kommer att returnera falskt.
- assertFalse(list.isEmpty()) måste returnera sant.
- Som ett resultat kommer testfallet passera.
Eftersom du bara har lagt till en sträng i listan är storleken ett.
- list.size() måste returnera int-värdet "1".
- So assertEquals(1, list.size()) måste returnera sant.
- Som ett resultat kommer testfallet passera.
- Betrakta metoden m7() enligt nedan:
@Test(timeout = 10)
public void m7() {
System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");
}
Såsom diskuterats ovan, @Test(timeout = 10) används för att framtvinga en timeout i testfallet. Värdet är i millisekunder, så m7() måste slutföras inom 10 ms.
- Betrakta metoden m8() enligt nedan:
@Test(expected = NoSuchMethodException.class) public void m8() { System.out.println("Using @Test(expected) ,it will check for specified exception during its execution"); }
Såsom diskuterats ovan, @Test(förväntat) kommer att kontrollera om det angivna undantaget finns under körningen, så metoden m8() kommer att utlösa "No Such Method Exception". Som ett resultat kommer testet att köras med ett undantag.
Noggrannhetsanmärkning: m8() skriver bara ut en rad, så det deklarerade undantaget utlöses aldrig och JUnit 4 rapporterar testet som misslyckat. Anpassa den förväntade typen till vad metoden faktiskt genererar. JUnit 5 skriver detta med hävdaKast.
Eftersom alla testfall är godkända resulterar detta i en framgångsrik testkörning.
Faktiskt resultat
Eftersom det finns tre testfall i exemplet ovan kommer alla testfall att köras ett efter ett. Se skärmdumpen från konsolen nedan:

Se nedan tryckta uttalanden som kan ses på konsolen:
Använder @BeforeClass , exekveras före alla testfall
Använda @Before-anteckningar, exekveras före varje testfall
Använder @After, exekveras efter varje testfall
Använda @Before-anteckningar, exekveras före varje testfall
Genom att använda @Test(timeout) kan den användas för att framtvinga timeout JUnit4 testfall
Använder @After, exekveras efter varje testfall
Använda @Before-anteckningar, exekveras före varje testfall
Genom att använda @Test(expected), kommer den att leta efter specificerat undantag under körningen
Använder @After, exekveras efter varje testfall
Använder @AfterClass, exekveras efter alla testfall
JUnit Påstå klass
Annoteringarna avgör när en metod körs; assert-metoderna avgör om den godkänns.
Den här klassen tillhandahåller en mängd assertionmetoder som är användbara för att skriva ett testfall. Om alla assert-satser godkänns är testresultaten lyckade. Om någon assert-sats misslyckas är testresultaten misslyckade. Den dedikerade JUnit hävda handledningen täcker varje metod på djupet.
Som du har sett tidigare beskriver tabellen nedan viktiga Assert-metoder och deras beskrivning:
| S.No. | Metod | BESKRIVNING |
|---|---|---|
| 1. | void assertEquals(boolesk förväntad, boolesk faktiskt) | Den kontrollerar om två värden är lika, ungefär som equals-metoden i Object-klassen. |
| 2. | void assertFalse (booleskt tillstånd) | Funktionalitet är att kontrollera att ett villkor är falskt. |
| 3. | void assertNotNull(Objektobjekt) | "assertNotNull" funktionalitet är att kontrollera att ett objekt inte är null. |
| 4. | void assertNull(Objektobjekt) | "assertNull" funktionalitet är att kontrollera att ett objekt är null. |
| 5. | void assertTrue (booleskt tillstånd) | "assertTrue"-funktionen är att kontrollera att ett villkor är sant. |
| 6. | void fail() | Om du vill utlösa ett assertion-fel resulterar fail() alltid i en fail-dominance. |
| 7. | void assertSame([Strängmeddelande] | "assertSame" funktionalitet är att kontrollera att de två objekten refererar till samma objekt. |
| 8. | void assertNotSame([Strängmeddelande] | "assertNotSame" funktionalitet är att kontrollera att de två objekten inte refererar till samma objekt. |
JUnit Testfall Klass
För att köra flera tester är TestCase-klassen tillgänglig i junit.framework paket. @Test-annoteringen berättar JUnit att denna public void-metod (ett testfall här) som den är kopplad till kan köras som ett testfall.
Versionsnotering: Testfall, Testresultat och Test svit tillhör arvet junit.framework paket från JUnit 3. De levereras fortfarande inuti junit 4.x-artefakten, men annoteringsbaserade tester utökar inte TestCase.
Tabellen nedan visar några viktiga metoder som finns tillgängliga i junit.framework.TestCase klass:
| S.No. | Metod | BESKRIVNING |
|---|---|---|
| 1. | int countTestCases() | Denna metod används för att räkna hur många testfall som körs av kör (TestResultat tr) metod. |
| 2. | TestResult createResult() | Denna metod används för att skapa en Testresultat objekt. |
| 3. | Sträng getName () | Denna metod returnerar en sträng som inte är annat än en Testfall namn. |
| 4. | TestResult run() | Den här metoden används för att köra ett test, vilket returnerar en Testresultat objekt. |
| 5. | ogiltig körning (testresultatresultat) | Denna metod används för att utföra ett test med en Testresultat objekt, som inte returnerar någonting. |
| 6. | void setName (Strängnamn) | Den här metoden används för att ange namnet på en Testfall. |
| 7. | void setUp() | Den här metoden används för att skriva resursassociationskod, till exempel för att skapa en databasanslutning. |
| 8. | void tearDown() | Den här metoden används för att skriva kod för resursfrisättning, till exempel för att frigöra en databasanslutning efter att en transaktionsoperation har utförts. |
JUnit Testresultatklass
När du kör ett test returnerar det ett resultat (i form av en Testresultat Detta TestResult-objekt kan användas för att analysera det resulterande objektet. Testresultatet kan antingen vara misslyckat eller lyckat.
Se tabellen nedan för viktiga metoder som används i junit.framework.TestResult-klassen:
| S.No. | Metod | BESKRIVNING |
|---|---|---|
| 1. | void addError(Testtest, Kastbar t) | Den här metoden används om du behöver lägga till ett fel i testet. |
| 2. | void addFailure(Testtest, AssertionFailedError t) | Den här metoden används om du behöver lägga till ett fel i listan över fel. |
| 3. | void endTest(Testtest) | Denna metod används för att meddela att ett test är utfört (slutfört). |
| 4. | int errorCount() | Den här metoden används för att identifiera fel som upptäcks under testkörning. |
| 5. | Uppräkning fel() | Den här metoden returnerar helt enkelt en samling (här en uppräkning) av fel. |
| 6. | int failureCount() | Den här metoden används för att få antalet fel som upptäcks under testkörning. |
| 7. | ogiltig körning (TestCase-test) | Denna metod används för att utföra ett testfall. |
| 8. | int runCount() | Den här metoden räknar helt enkelt de utförda testen. |
| 9. | void startTest(Testtest) | Denna metod används för att meddela att ett test har startat. |
| 10. | void stop() | Den här metoden används för att stoppa testkörningen. |
JUnit Testsvitklass
Om du vill köra flera tester i en specifik ordning kan det göras genom att kombinera alla tester på ett ställe. Denna plats kallas en testsvit, och JUnit testsvit handledningen går igenom ett fullständigt exempel.
Se tabellen nedan för viktiga metoder som används i junit.framework.TestSuite klass:
| S.No. | Metod | BESKRIVNING |
|---|---|---|
| 1. | void addTest (Test test) | Den här metoden används om du vill lägga till ett test i sviten. |
| 2. | void addTestSuite(Class testklass) | Den här metoden används om du vill ange klassen medan du lägger till ett test i sviten. |
| 3. | int countTestCases() | Denna metod används om du vill räkna antalet testfall. |
| 4. | Sträng getName () | Denna metod används för att få namnet på testsviten. |
| 5. | ogiltig körning (testresultatresultat) | Denna metod används för att utföra ett test och samla in testresultatet i en Testresultat objekt. |
| 6. | void setName (Strängnamn) | Den här metoden används för att ange namnet på Test svit. |
| 7. | Testa testAt(int index) | Den här metoden används om du vill returnera testet vid ett givet index. |
| 8. | int testCount() | Den här metoden används om du vill returnera antalet tester i sviten. |
| 9. | statisk testvarning (strängmeddelande) | Denna metod returnerar ett test som kommer att misslyckas och loggar ett varningsmeddelande. |
