JUnit Annotaties Tutorial met voorbeeld: Wat is @Test en @After

⚡ Slimme samenvatting

JUnit Annotaties zijn een vorm van syntactische metadata die worden toegevoegd aan Java broncode zodat een testrunner weet welke methoden uitgevoerd moeten worden, wanneer ze uitgevoerd moeten worden en hoe lang elke methode kan duren.

  • 🔘 @Test: Markeer een openbare void-methode die JUnit wordt uitgevoerd als één enkele testcase.
  • ☑️ Levenscyclus: @Before en @After worden om elke test heen geplaatst, terwijl @BeforeClass en @AfterClass de klasse zelf omhullen.
  • Controle: @Ignore slaat een test over, @Test(timeout) beperkt de runtime, @Test(expected) controleert of een uitzondering is opgetreden.
  • 🧪 Beweringen: org.junit.Assert biedt de methoden assertEquals, assertTrue, assertNull, assertSame en fail().
  • Nalatenschap: TestCase, TestResult en TestSuite behoren tot het oudere junit.framework-pakket.
  • 📊 JUnit 5: Jupiter hernoemt deze naar @BeforeEach, @AfterEach, @BeforeAll, @AfterAll en @Disabled.

JUnit Handleiding voor annotaties met de annotaties @Test, @Before en @After

Wat is JUnit annotaties?

JUnit annotaties zijn een speciale vorm van syntactische metadata die kan worden toegevoegd aan Java Broncode voor betere leesbaarheid en structuur. Variabelen, parameters, pakketten, methoden en klassen kunnen worden geannoteerd. Annotaties werden geïntroduceerd in JUnit 4, wat maakt Java De code is leesbaarder en eenvoudiger. Dat is het grote verschil tussen JUnit 3 en JUnit 4: JUnit 4 is gebaseerd op annotaties.

Met een goede kennis van deze annotaties kan men gemakkelijk een leerproces starten en implementeren. JUnit test. Hieronder vindt u de belangrijkste en meest gebruikte JUnit annotatielijst, met de JUnit 5 (Jupiter) equivalent naast elk ervan:

S.No. Annotaties Beschrijving JUnit 5 equivalent
1. @Toets Deze annotatie vervangt junit.framework.TestCase en geeft aan dat de openbare void-methode waaraan deze is gekoppeld, als testcase kan worden uitgevoerd. @Test (org.junit.jupiter.api)
2. @Voor Deze annotatie wordt gebruikt als u vóór elke testcase een instructie wilt uitvoeren, zoals precondities. @VoorElk
3. @Voor klas Deze annotatie wordt gebruikt als u bepaalde instructies wilt uitvoeren vóór alle testgevallen, bijvoorbeeld een testverbinding die moet worden geopend voordat alle testgevallen worden uitgevoerd. @BeforeAll
4. @Na Deze annotatie kan worden gebruikt als u na elke instructie enkele instructies wilt uitvoeren Testgevalbijvoorbeeld het resetten van variabelen of het verwijderen van tijdelijke bestanden. @NaElke
5. @Na de les Deze annotatie kan worden gebruikt als u bepaalde instructies wilt uitvoeren na alle testgevallen, bijvoorbeeld het vrijgeven van resources na het uitvoeren van alle testgevallen. @AfterAll
6. @Negeren Deze annotatie kan worden gebruikt als u bepaalde instructies tijdens de testuitvoering wilt negeren, bijvoorbeeld door bepaalde testgevallen uit te schakelen. @Gehandicapt
7. @Test(time-out=500) Deze annotatie kan worden gebruikt als u een time-out wilt instellen tijdens de testuitvoering, bijvoorbeeld als u werkt onder een SLA (service level agreement) en tests binnen een bepaalde tijd moeten worden voltooid. @Timeout of assertTimeout
8. @Test(expected=IllegalArgumentException.class) Deze annotatie kan worden gebruikt als u tijdens de testuitvoering een uitzondering wilt afhandelen. Bijvoorbeeld om te controleren of een bepaalde methode een gespecificeerde uitzondering genereert. assertThrows

JUnit Annotaties Voorbeeld

Laten we een klasse maken die belangrijk omvat JUnit annotaties met eenvoudige printinstructies en voer deze uit met een testrunner-klasse:

Stap 1) Overweeg het volgende: Java klasse met diverse methoden die zijn gekoppeld aan de hierboven vermelde annotaties:

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

    }		

}		

Stap 2) Laten we een testrunnerklasse maken om de bovenstaande test uit te voeren:

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

verwacht resultaat

  • Alle testgevallen worden één voor één uitgevoerd en alle printopdrachten zijn zichtbaar in de console.
  • Zoals besproken in de bovenstaande tabel, @Before en @BeforeClass in JUnit [methoden m2() en m1()] worden respectievelijk vóór elk testgeval en vóór alle testgevallen uitgevoerd.
  • Op dezelfde manier als @After en @AfterClass in JUnit De methoden m4() en m3() worden respectievelijk na elk testgeval en na alle testgevallen uitgevoerd. @Ignore (methode m6()) wordt beschouwd als het negeren van de test.

Laten we de testgevallen analyseren die hierboven zijn gebruikt. Java De les in detail:

  1. Beschouw de methode m5() zoals hieronder weergegeven:
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

Bij de bovenstaande methode voeg je een tekenreeks toe aan de variabele "lijst":

  • lijst.isEmpty() zal vals retourneren.
  • assertFalse(lijst.isEmpty()) moet waar terugkeren.
  • Als gevolg hiervan zal de testcase dat wel doen passeren.

Omdat je slechts één tekenreeks aan de lijst hebt toegevoegd, is de grootte één.

  • lijst.grootte() moet de integerwaarde "1" retourneren.
  • So assertEquals(1, lijst.grootte()) moet waar terugkeren.
  • Als gevolg hiervan zal de testcase dat wel doen passeren.
  1. Beschouw de methode m7() zoals hieronder weergegeven:
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Zoals hierboven besproken, @Test(time-out = 10) wordt gebruikt om een ​​time-out af te dwingen in de testcase. De waarde is in milliseconden, dus m7() moet binnen 10 ms klaar zijn.

  1. Beschouw de methode m8() zoals hieronder weergegeven:
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Zoals hierboven besproken, @Test(verwacht) De methode m8() controleert tijdens de uitvoering op de opgegeven uitzondering, waardoor de methode "No Such Method Exception" zal genereren. Hierdoor zal de test met een uitzondering worden uitgevoerd.

Nauwkeurigheidsopmerking: m8() print slechts één regel, dus de gedeclareerde uitzondering wordt nooit daadwerkelijk gegenereerd. JUnit 4 meldt dat de test is mislukt. Stem het verwachte type af op wat de methode daadwerkelijk retourneert. JUnit 5 schrijft dit met assertThrows.

Doordat alle testgevallen zijn doorstaan, resulteert dit in een succesvolle testuitvoering.

Werkelijke resultaat

Aangezien er in het bovenstaande voorbeeld drie testgevallen zijn, worden alle testgevallen één voor één uitgevoerd. Zie de onderstaande schermafbeelding van de console:

Eclipse Console-uitvoer met de printopdrachten @BeforeClass, @Before, @After en @AfterClass.
Console-uitvoer geproduceerd door JunitAnnotationsExample

Zie onderstaande printverklaringen die op de console te zien zijn:

Met behulp van @BeforeClass , uitgevoerd vóór alle testgevallen

Met behulp van @Before-annotaties, uitgevoerd vóór elke testcase

Met behulp van @After, uitgevoerd na elke testcase

Met behulp van @Before-annotaties, uitgevoerd vóór elke testcase

Met behulp van @Test(timeout) kan dit worden gebruikt om een ​​time-out af te dwingen JUnitTestcase uit 4

Met behulp van @After, uitgevoerd na elke testcase

Met behulp van @Before-annotaties, uitgevoerd vóór elke testcase

Met behulp van @Test(expected) wordt tijdens de uitvoering gecontroleerd op gespecificeerde uitzonderingen

Met behulp van @After, uitgevoerd na elke testcase

Met behulp van @AfterClass, uitgevoerd na alle testgevallen

JUnit Beweer klasse

De annotaties bepalen wanneer een methode wordt uitgevoerd; de assert-methoden bepalen of deze slaagt.

Deze klasse biedt een aantal assertiemethoden die nuttig zijn bij het schrijven van testcases. Als alle assert-statements slagen, zijn de testresultaten succesvol. Als een van de assert-statements mislukt, zijn de testresultaten mislukt. De specifieke JUnit beweren Deze handleiding behandelt elke methode uitgebreid.

Zoals u eerder hebt gezien, beschrijft de onderstaande tabel belangrijke Assert-methoden en hun omschrijving:

S.No. Methode Beschrijving
1. void assertEquals(boolean verwacht, boolean feitelijk) Het controleert of twee waarden gelijk zijn, vergelijkbaar met de equals-methode van de Object-klasse.
2. void assertFalse(booleaanse voorwaarde) De functionaliteit bestaat uit het controleren of een voorwaarde onwaar is.
3. void assertNotNull(objectobject) De “assertNotNull”-functionaliteit is om te controleren of een object niet nul is.
4. void assertNull(objectobject) De “assertNull”-functionaliteit is om te controleren of een object nul is.
5. void assertTrue(booleaanse voorwaarde) De “assertTrue”-functionaliteit is om te controleren of een voorwaarde waar is.
6. ongeldig mislukt() Als je een assertiefout wilt genereren, resulteert fail() altijd in een fail-oordeel.
7. void assertSame([String bericht] De “assertSame”-functionaliteit is om te controleren of de twee objecten naar hetzelfde object verwijzen.
8. void assertNotSame([String bericht] De “assertNotSame”-functionaliteit is om te controleren of de twee objecten niet naar hetzelfde object verwijzen.

JUnit Testgevallenklasse

Om meerdere tests uit te voeren, is de klasse TestCase beschikbaar in de junit.framework pakket. De @Test-annotatie geeft aan JUnit dat deze openbare void-methode (hier een testgeval) waaraan deze is gekoppeld, als testgeval kan worden uitgevoerd.

Versie-opmerking: Testcase, Testresultaat en Test pak behoren tot de erfenis junit.framework pakket van JUnit 3. Ze worden nog steeds meegeleverd in het JUnit 4.x-artefact, maar op annotaties gebaseerde tests breiden TestCase niet uit.

De onderstaande tabel toont enkele belangrijke methoden die beschikbaar zijn in de junit.framework.TestCase klasse:

S.No. Methode Beschrijving
1. int countTestCases() Deze methode wordt gebruikt om te tellen hoeveel testgevallen er worden uitgevoerd door de run(TestResultaat tr) methode.
2. TestResultaat createResult() Deze methode wordt gebruikt om een Testresultaat voorwerp.
3. String getName () Deze methode retourneert een string die niets anders is dan a Testcase naam.
4. TestResultaat uitvoeren() Deze methode wordt gebruikt om een ​​test uit te voeren, die een resultaat retourneert. Testresultaat voorwerp.
5. ongeldige run (TestResultaat resultaat) Deze methode wordt gebruikt om een ​​test uit te voeren met een Testresultaat object, dat niets retourneert.
6. void setName (String naam) Deze methode wordt gebruikt om de naam van een Testcase.
7. ongeldige setUp() Deze methode wordt gebruikt om code te schrijven voor het koppelen van resources, bijvoorbeeld het maken van een databaseverbinding.
8. leegte tearDown() Deze methode wordt gebruikt om code te schrijven voor het vrijgeven van resources, bijvoorbeeld het vrijgeven van een databaseverbinding na het uitvoeren van een transactie.

JUnit TestResultaat-klasse

Wanneer je een test uitvoert, retourneert deze een resultaat (in de vorm van een Testresultaat object). Dit TestResult-object kan worden gebruikt om het resulterende object te analyseren. Dit testresultaat kan een mislukking of een succes zijn.

Zie onderstaande tabel voor belangrijke methoden die worden gebruikt in de klasse junit.framework.TestResult:

S.No. Methode Beschrijving
1. void addError(Testtest, Throwable t) Deze methode wordt gebruikt als u een foutmelding aan de test wilt toevoegen.
2. void addFailure(Testtest, AssertionFailedError t) Deze methode wordt gebruikt als u een fout aan de lijst met fouten wilt toevoegen.
3. void endTest(testtest) Deze methode wordt gebruikt om aan te geven dat een test is uitgevoerd (voltooid).
4. int errorCount() Deze methode wordt gebruikt om de fouten te achterhalen die tijdens de testuitvoering zijn gedetecteerd.
5. Opsomming fouten() Deze methode retourneert eenvoudigweg een verzameling (in dit geval een Enumeration) van fouten.
6. int mislukkingCount() Deze methode wordt gebruikt om het aantal fouten te tellen dat tijdens de testuitvoering is gedetecteerd.
7. ongeldige run (TestCase-test) Deze methode wordt gebruikt om een ​​testcase uit te voeren.
8. int runCount() Deze methode telt simpelweg het aantal uitgevoerde tests.
9. void startTest(Testtest) Deze methode wordt gebruikt om te melden dat een test is gestart.
10. ongeldige stop() Deze methode wordt gebruikt om de testrun te stoppen.

JUnit Suiteklasse testen

Als je meerdere tests in een specifieke volgorde wilt uitvoeren, kun je dat doen door alle tests op één plek te combineren. Deze plek noemen we een testsuite. JUnit testsuite De tutorial doorloopt een volledig voorbeeld.

Zie onderstaande tabel voor belangrijke methoden die worden gebruikt in de junit.framework.TestSuite klasse:

S.No. Methode Beschrijving
1. void addTest(Testtest) Deze methode wordt gebruikt als u een test aan de suite wilt toevoegen.
2. void addTestSuite(Klasse testKlasse) Deze methode wordt gebruikt als u de klasse wilt opgeven terwijl u een test aan de suite toevoegt.
3. int countTestCases() Deze methode wordt gebruikt als u het aantal testgevallen wilt tellen.
4. String getName () Deze methode wordt gebruikt om de naam van de testsuite te achterhalen.
5. ongeldige run (TestResultaat resultaat) Deze methode wordt gebruikt om een ​​test uit te voeren en het testresultaat te verzamelen in een Testresultaat voorwerp.
6. void setName (String naam) Deze methode wordt gebruikt om de naam van de in te stellen. Test pak.
7. Test testAt(int-index) Deze methode wordt gebruikt als u de test op een bepaalde index wilt retourneren.
8. int testAantal() Deze methode wordt gebruikt als u het aantal tests in de suite wilt retourneren.
9. statische testwaarschuwing (stringbericht) Deze methode retourneert een test die mislukt en er wordt een waarschuwingsbericht geregistreerd.

Veelgestelde vragen

Ja. Een methode heeft doorgaans de annotatie @Test samen met @Ignore, of @Test met zowel een timeout als een verwachte uitzondering. Je kunt geen twee lifecycle-annotaties, zoals @Before en @After, op één methode combineren.

@Ignore onderdrukt alleen een methode JUnit wordt al herkend als een test. Zonder @Test ernaast verzamelt de runner de methode nooit, waardoor deze niet wordt uitgevoerd en ook niet als overgeslagen wordt weergegeven.

JUnit De methode wordt uitgevoerd in een aparte thread en mislukt met een TestTimedOutException zodra het budget is verstreken. De thread wordt onderbroken, niet beëindigd, waardoor een blokkerende aanroep kan blijven draaien.

Alleen via de vintage engine. Door junit-vintage-engine toe te voegen, wordt het mogelijk om... JUnit Het platform voert bestaande org.junit-tests ongewijzigd uit, maar Jupiter-tests moeten org.junit.jupiter.api importeren. Het combineren van beide importsets in één klasse werkt niet.

Alleen voor onderhoud. Legacy-testsuites die TestCase uitbreiden en TestSuite-objecten bouwen, komen nog steeds veel voor in oudere codebases, dus het herkennen van de API is nuttig. Nieuwe tests moeten op annotaties gebaseerd zijn.

JUnit Er wordt voor elke testmethode een nieuwe instantie van de testklasse aangemaakt, waardoor er geen instantie bestaat wanneer de klasse-instellingen moeten worden uitgevoerd. Een statische methode heeft geen instantie nodig. JUnit Een niet-statische declaratie wordt afgewezen.

AI-assistenten lezen de te testen methode en suggereren of de setup in `@Before` of `@BeforeClass` thuishoort, en of een foutpad `@Test(expected)` of `assertThrows` vereist. Beschouw elke suggestie als een concept.

GitHub-copiloot Het plaatst de onderdelen meestal correct op en af ​​demonteert ze ook goed, maar het verwisselt ze vaak. JUnit 4 en Jupiter importeren in één bestand. Controleer het importblok voordat u de suite uitvoert.

Vat dit bericht samen met: