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.

  • 🔘 @Testa: Markerar en public void-metod som JUnit körs som ett enda testfall.
  • ☑️ Livscykel: @Before och @After omsluter varje test, medan @BeforeClass och @AfterClass omsluter klassen.
  • Kontroll: @Ignore hoppar över ett test, @Test(timeout) begränsar körtiden, @Test(expected) bekräftar ett utlöst undantag.
  • 🧪 Påståenden: org.junit.Assert levererar assertEquals, assertTrue, assertNull, assertSame och fail().
  • 🛠️ Arv: TestCase, TestResult och TestSuite tillhör det äldre junit.framework-paketet.
  • 📊 JUnit 5: Jupiter byter namn på dessa till @BeforeEach, @AfterEach, @BeforeAll, @AfterAll och @Disabled.

JUnit anteckningshandledning som täcker @Test, @Före och @Efter

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:

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

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

Eclipse konsolutdata som visar utskriftssatserna @BeforeClass, @Before, @After och @AfterClass
Konsolutdata producerad av JunitAnnotationsExample

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.

Vanliga frågor

Ja. En metod använder vanligtvis @Test tillsammans med @Ignore, eller @Test med både en timeout och ett förväntat undantag. Du kan inte stapla två livscykelannoteringar, till exempel @Before och @After, på en metod.

@Ignore undertrycker endast en metod JUnit känner redan igen som ett test. Utan @Test bredvid hämtar löparen aldrig metoden, så den varken körs eller listas som hoppad över.

JUnit kör metoden på en separat tråd och misslyckas med en TestTimedOutException när budgeten löper ut. Tråden avbryts, inte avslutas, så ett blockerande anrop kan fortsätta köras.

Endast genom vintage-motorn. Genom att lägga till junit-vintage-engine kan JUnit Plattformen kör befintliga org.junit-tester oförändrade, men Jupiter-tester måste importera org.junit.jupiter.api. Att blanda båda importuppsättningarna i en klass misslyckas.

Endast för underhåll. Äldre tester som utökar TestCase och bygger TestSuite-objekt är fortfarande vanliga i äldre kodbaser, så det är bra att känna igen API:et. Nya tester bör vara annoteringsbaserade.

JUnit bygger en ny instans av testklassen för varje testmetod, så att ingen existerar när installation på klassnivå måste köras. En statisk metod behöver ingen instans, och JUnit avvisar en icke-statisk deklaration.

AI-assistenter läser metoden som testas och föreslår om installationsprogrammet hör hemma i @Before eller @BeforeClass, och om en felsökväg behöver @Test(expected) eller assertThrows. Behandla varje förslag som ett utkast.

GitHub Copilot vanligtvis ställer upp och nedmontering korrekt, men det blandas ofta JUnit 4 och Jupiter importerar i en fil. Kontrollera importblocket innan du kör programsviten.

Sammanfatta detta inlägg med: