JUnit Testcases @Before @BeforeClass Annotatie

โšก Slimme samenvatting

JUnit is het meest gebruikte framework voor unit-testen JavaEn de bijbehorende testfixture-annotaties bepalen precies wat er gebeurt vรณรณr en na elke testmethode die binnen een testklasse wordt uitgevoerd.

  • ๐Ÿ”˜ armatuur: Een testfixture is de vaste context van objecten en resources waarin een testcase wordt uitgevoerd.
  • โ˜‘๏ธ Setup: @Before wordt uitgevoerd vรณรณr elke testmethode, terwijl @BeforeClass eenmaal wordt uitgevoerd vรณรณr de hele klasse.
  • โœ… Scheuren: @After wordt na elke test uitgevoerd, zelfs als de test een uitzondering genereert of een bewering mislukt.
  • ๐Ÿงช Bestellen: De @Before-functie van de superklasse wordt eerst uitgevoerd, daarna de @Before-functie van de subklasse, vervolgens de @Test en daarna elke @After-functie.
  • ๏ธ runner: JUnitCore.runClasses() voert testklassen uit en retourneert een Result-object met alle fouten.
  • ๐Ÿ“Š JUnit 5: @Before, @After, @BeforeClass en @AfterClass worden @BeforeEach, @AfterEach, @BeforeAll en @AfterAll.

JUnit testfixture met @Before- en @BeforeClass-annotaties

JUnit is de meest populaire eenheid Testen raamwerk erin Java. Het wordt uitdrukkelijk aanbevolen voor Testen van een eenheid. JUnit Het testen van een webapplicatie vereist geen server, waardoor het testproces snel verloopt.

De JUnit Het framework maakt ook het snel en eenvoudig genereren van testgevallen en testgegevens mogelijk. De org.junit Het pakket bestaat uit vele interfaces en klassen voor JUnit testen, zoals Test, Assert, After en Before. Het bredere JUnit Het gezin bouwt voort op dezelfde bouwstenen.

Wat is een testopstelling?

Voordat we begrijpen wat een testfixture is, laten we eerst de onderstaande code bekijken.

Deze code is ontworpen om twee testgevallen uit te voeren op een eenvoudig bestand.

public class OutputFileTest {
    private File output; 
    output = new File(...);
    output.delete(); 
public void testFile1(){
        //Code to verify Test Case 1
}
    output.delete();
    output = new File(...);
public void testFile2(){
        //Code to verify Test Case 2
}
 output.delete(); 
}

Weinig problemen hier

  • De code is onleesbaar.
  • De code is niet eenvoudig te onderhouden.
  • Als de testsuite complex is, kan de code logische problemen bevatten.

Vergelijk dezelfde code met behulp van JUnit.

public class OutputFileTest		
{
    private File output; 
    @Before public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

De code is veel beter leesbaar en onderhoudbaar. De bovenstaande codestructuur is een testopstelling.

Een testopstelling is een context waarin a JUnit Testgeval loopt. Typisch omvatten testarmaturen:

  • Objecten of bronnen die beschikbaar zijn voor elke testcase.
  • Er zijn activiteiten nodig om deze objecten en middelen beschikbaar te maken.
  • Deze werkzaamheden zijn
    1. toewijzing (setup)
    2. de-toewijzing (scheuren).

Opstelling en afbraak

Wedstrijdschema's zijn belangrijk omdat JUnit Deze haken worden bij elke test uitgevoerd.

  • Meestal zijn er enkele herhaalde taken die voorafgaand aan elke testcase moeten worden uitgevoerd. Voorbeeld: maak een databaseverbinding.
  • Op dezelfde manier kunnen er aan het einde van elke testcase enkele herhaalde taken zijn. Voorbeeld: om op te ruimen zodra de testuitvoering voorbij is.
  • JUnit Het biedt annotaties die helpen bij het opzetten en afbreken van de testomgeving. Het zorgt ervoor dat resources worden vrijgegeven en dat het testsysteem gereed is voor de volgende testcase.

Deze JUnit De annotaties worden hieronder besproken.

Setup

@Voor annotatie in JUnit wordt gebruikt op een methode die bevat Java Code die vรณรณr elke testcase wordt uitgevoerd, oftewel vรณรณr elke testuitvoering.

Teardown (ongeacht het vonnis)

@Na annotatie wordt gebruikt op een methode die het volgende bevat: Java Code die na elk testgeval wordt uitgevoerd. Deze methoden worden uitgevoerd, zelfs als er uitzonderingen optreden in het testgeval of als beweringen niet kloppen.

Let op:

  • Het is toegestaan โ€‹โ€‹om een โ€‹โ€‹willekeurig aantal hierboven genoemde annotaties te hebben.
  • Alle methoden geannoteerd met @Voor in JUnit worden vรณรณr elke testcase uitgevoerd, maar ze kunnen in willekeurige volgorde worden uitgevoerd.
  • Je kunt de methoden `@Before` en `@After` overerven van een superklasse. De uitvoering verloopt als volgt en is een standaard uitvoeringsproces. JUnit.
  1. Voer de JUnit @Before-methoden in de superklasse
  2. Voer de @Before-methoden in deze klasse uit
  3. Voer een @Test-methode uit in deze klasse
  4. Voer de @After-methoden in deze klasse uit
  5. Voer de @After-methoden uit in de superklasse

JUnit Opmerking voor 5: deze annotaties zijn JUnit 4 (org.junit). JUnit 5 hebben ze hernoemd in org.junit.jupiter.apien JUnit De onderstaande code (4) werkt nog steeds met de vintage engine.

JUnit 4 annotaties JUnit 5 (Jupiter) equivalent Runs
@Voor @VoorElk Vรณรณr elke testmethode
@Na @NaElke Na elke testmethode
@Voor klas @BeforeAll Eenmaal voor de hele klas
@Na de les @AfterAll Eenmaal na de hele les
@Negeren @Gehandicapt Slaat de geannoteerde test over.

Voorbeeld: Een klasse maken met een bestand als testfixture

public class OutputFileTest		
{
    private File output; 
    @Before	public void createOutputFile() 
    { 
       output = new File(...);
    }
  
	@After public void deleteOutputFile() 
    {
        output.delete(); 
    } 
     
    @Test public void testFile1() 
    {
       // code for test case objective
    } 
	@Test public void testFile2() 
    {
       // code for test case objective
    }
}

In het bovenstaande voorbeeld zal de uitvoeringsketen als volgt verlopen. Het diagram tracDat betekent รฉรฉn aanmaak-test-verwijdercyclus per testmethode.

JUnit De @Before- en @After-uitvoeringsketen draait om twee testmethoden.

  1. createOutputFile()
  2. testBestand1()
  3. verwijderUitvoerBestand()
  4. createOutputFile()
  5. testBestand2()
  6. verwijderUitvoerBestand()

Veronderstelling:

testFile1() wordt uitgevoerd vรณรณr testFile2(), wat niet gegarandeerd is.

Eenmalige opstelling

  • Het is mogelijk om een โ€‹โ€‹methode slechts รฉรฉn keer uit te voeren voor de hele testklasse voordat een van de tests wordt uitgevoerd, en voorafgaand aan elke test @Voor methode(n).
  • Een eenmalige configuratie is handig voor het opstarten van servers, het openen van communicatieverbindingen en soortgelijke taken. Het is tijdrovend om resources voor elke test te sluiten en opnieuw te openen.
  • Dit kan gedaan worden met behulp van de annotatie @Voor klas in JUnit.
@BeforeClass public static void Method_Name() {	
    // class setup code here	
 }	

De methode moet zijn openbare statische leegteomdat JUnit roept het aan voordat er een testinstantie bestaat.

Eenmalig afbreken

  • Net als bij de eenmalige instelmethode is er ook een eenmalige opschoonmethode beschikbaar. Deze wordt uitgevoerd na alle testcasemethoden. @Na annotaties zijn uitgevoerd.
  • Het is handig om te stoppenping servers en het verbreken van communicatieverbindingen.
  • Dit kan met behulp van de @Na de les annotatie.
 @AfterClass public static void Method_Name()	
 {	
    // class cleanup code here	
 }	

JUnit Testsuites

Zodra de testopstellingen gereed zijn, worden gerelateerde testklassen doorgaans gegroepeerd en gezamenlijk gelanceerd.

Als we meerdere tests in een specifieke volgorde willen uitvoeren, kunnen we alle tests op รฉรฉn plek combineren. Deze plek noemen we een testsuite. Meer informatie over het uitvoeren van testsuites en hoe ze worden gebruikt, vindt u in [link]. JUnit worden in dit document behandeld zelfstudie.

JUnit Test Runner

JUnit biedt een hulpmiddel voor het uitvoeren van uw testgevallen.

  • JUnitKern klasse wordt gebruikt om deze tests uit te voeren.
  • Een methode genaamd runClasses door org.junit.runner.JUnitKern wordt gebruikt om een โ€‹โ€‹of meerdere testklassen uit te voeren.
  • Het retourneringstype van deze methode is de Resultaat voorwerp (org.junit.runner.Result), die wordt gebruikt om toegang te krijgen tot informatie over de tests. Zie het volgende codevoorbeeld voor meer duidelijkheid.
public class Test {				
			public static void main(String[] args) {									
       		Result result = JUnitCore.runClasses(CreateAndSetName.class);					
			for (Failure failure : result.getFailures()) {							
         		System.out.println(failure.toString());					
      }		
      System.out.println(result.wasSuccessful());					
   }		
}      

In de bovenstaande code wordt het object "result" verwerkt om de geslaagde en mislukte resultaten van de testgevallen die we uitvoeren te verkrijgen. Hulpmiddelen zoals assertIs gelijk aan die mislukkingen aan de kaak stellen, terwijl @Negeren Slaat een toets over.

JUnit Opmerking voor 5: JUnitKern is de JUnit 4 hardlopers. JUnit 5 vervangt het door de JUnit Platform Launcher API, normaal gesproken gestart door de IDE, Gradle of Maven Surefire.

Voornaam* JUnit Programma

Gedegen kennis van SDLC, Java programmeren en de basisprincipes van software testen proces helpt bij het begrijpen van een JUnit programma, net zoals weten hoe eenheidstests verschillen van integratietests.

Laten we unit testen begrijpen aan de hand van een concreet voorbeeld. We moeten een testklasse maken met een testmethode die is geannoteerd met... @Toets zoals hieronder gegeven:

MijnFirstClassTest.java

package guru99.JUnit;		

import static org.junit.Assert.*;				

import org.junit.Test;		

public class MyFirstClassTest {				

    @Test		
    public void myFirstMethod(){					
        String str= "JUnit is working fine";					
        assertEquals("JUnit is working fine",str);					
    }
}		

TestRunner.java

Om onze testmethode (hierboven) uit te voeren, moeten we een testrunner aanmaken. In de testrunner moeten we de testklasse als parameter toevoegen. JUnitDe `runClasses()`-methode van Core. Deze retourneert het testresultaat, afhankelijk van of de test geslaagd of mislukt is.

Voor meer informatie hierover, zie de onderstaande code:

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(MyFirstClassTest.class);					
			for (Failure failure : result.getFailures()) {							
              System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      	

uitgang

Eens TestRunner.java Wanneer we onze testmethoden uitvoeren, krijgen we als resultaat 'mislukt' of 'geslaagd'. Hieronder vindt u een toelichting op de uitvoer:

  1. In dit voorbeeld na het uitvoeren MijnFirstClassTest.javaDe test is geslaagd en het resultaat is groen.
  2. Als het mislukt was, zou het resultaat in het rood zijn weergegeven, en de mislukking is te zien in de foutmelding. trace. Zie de JUnit Onderstaande grafische gebruikersinterface (GUI):

Eclipse JUnit Weergave met een groene balk die aangeeft dat je geslaagd bent voor MyFirstClassTest.

Veelgestelde vragen

JUnit Er wordt voor elke testmethode een nieuwe instantie van de testklasse aangemaakt, zodat er geen instantie bestaat wanneer code op klasseniveau moet worden uitgevoerd. Door de methode als `static` te declareren, wordt ervoor gezorgd dat er geen instantie bestaat. JUnit Roep het direct aan.

Nee. De volgorde van de methoden is opzettelijk niet gespecificeerd. JUnit 4 aanbiedingen @FixMethodOrder en JUnit 5 biedt @TestMethodOrder aan, maar afhankelijk van de volgorde worden gekoppelde tests gesignaleerd.

De testmethode wordt nooit aangeroepen en wordt gerapporteerd als een fout, niet als een mislukking. Elke `@After`-methode wordt nog steeds uitgevoerd, dus de opruimprocedure moet een gedeeltelijk opgebouwd testbestand kunnen verwerken.

Nieuwe projecten moeten het volgende toevoegen: JUnit 5 geaggregeerde artefacten org.junit.jupiter:junit-jupiter. Teams die legacy-objecten beheren JUnit 4 suites voegen junit-vintage-engine toe, zodat beide op รฉรฉn platform draaien.

Een fixture is de volledige voorbereide context rondom een โ€‹โ€‹test, inclusief echte bestanden of verbindingen. Een mock is een vervangende medewerker met geprogrammeerd gedrag, vaak gecreรซerd door de fixture.

Ja, via @BeforeClass in JUnit 4 of @BeforeAll in JUnit 5. Gedeelde armaturen zijn sneller, maar lekken statusinformatie, dus reserveer ze voor dure, alleen-lezen resources.

AI-assistenten lezen een klasse, leiden af โ€‹โ€‹welke samenwerkende klassen nodig zijn en stellen de `@Before`-configuratie op met bijbehorende `@After`-opruimactie. Controleer de gegenereerde beweringen altijd zelf.

GitHub-copiloot Bouwt een testklasse op basis van een methodesignatuur, inclusief lifecycle-annotaties. Het is vaak de standaardinstelling om JUnit 4 importonderdelen, dus controleer of het pakket overeenkomt met uw motor.

Vat dit bericht samen met: