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.

  • 🔘 @Prøve: Markerer en offentlig void-metode, der JUnit udføres som en enkelt testcase.
  • ☑️ Livscyklus: @Before og @After omslutter hver test, mens @BeforeClass og @AfterClass omslutter klassen.
  • Kontrol: @Ignore springer en test over, @Test(timeout) begrænser runtime, @Test(expected) hævder en udløst undtagelse.
  • 🧪 Påstande: org.junit.Assert leverer assertEquals, assertTrue, assertNull, assertSame og fail().
  • 🛠️ Eftermæle: TestCase, TestResult og TestSuite tilhører den ældre junit.framework-pakke.
  • 📊 JUnit 5: Jupiter omdøber disse til @BeforeEach, @AfterEach, @BeforeAll, @AfterAll og @Disabled.

JUnit annotationsvejledning, der dækker @Test, @Før og @Efter

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:

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

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

Eclipse konsoloutput, der viser print-sætningerne @BeforeClass, @Before, @After og @AfterClass
Konsoloutput produceret af JunitAnnotationsExample

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.

Ofte Stillede Spørgsmål

Ja. En metode bærer typisk @Test sammen med @Ignore, eller @Test med både en timeout og en forventet undtagelse. Du kan ikke stable to livscyklusannotationer, f.eks. @Before og @After, på én metode.

@Ignore undertrykker kun en metode JUnit genkender allerede som en test. Uden @Test ved siden af ​​indsamler runneren aldrig metoden, så den hverken køres eller er angivet som sprunget over.

JUnit kører metoden på en separat tråd og fejler den med en TestTimedOutException, når budgettet er udløbet. Tråden afbrydes, ikke afsluttes, så et blokerende kald kan fortsætte med at køre.

Kun gennem vintage-motoren. Tilføjelse af junit-vintage-engine giver mulighed for JUnit Platformen kører eksisterende org.junit-tests uændret, men Jupiter-tests skal importere org.junit.jupiter.api. Blanding af begge importsæt i én klasse mislykkes.

Kun til vedligeholdelse. Ældre testpakker, der udvider TestCase og bygger TestSuite-objekter, er stadig almindelige i ældre kodebaser, så det hjælper at genkende API'en. Nye tests bør være annotationsbaserede.

JUnit bygger en ny instans af testklassen for hver testmetode, så der ikke findes nogen, når opsætning på klasseniveau skal køres. En statisk metode behøver ingen instans, og JUnit afviser en ikke-statisk deklaration.

AI-assistenter læser den metode, der testes, og foreslår, om opsætningen hører hjemme i @Before eller @BeforeClass, og om en fejlsti kræver @Test(expected) eller assertThrows. Behandl hvert forslag som et kladde.

GitHub Copilot normalt placerer opsætning og nedtagning korrekt, men det blandes ofte JUnit 4 og Jupiter importerer i én fil. Tjek importblokken, før du kører pakken.

Opsummer dette indlæg med: