JUnit Testfälle @Before @BeforeClass-Annotation

⚡ Intelligente Zusammenfassung

JUnit ist das am weitesten verbreitete Unit-Testing-Framework für Javaund seine Test-Fixture-Annotationen steuern genau, was vor und nach dem Ausführen jeder Testmethode innerhalb einer Testklasse geschieht.

  • 🔘 Befestigung: Eine Testumgebung ist der feste Kontext von Objekten und Ressourcen, in dem ein Testfall ausgeführt wird.
  • ☑️ Fahrwerks-Konfiguration: @Before wird vor jeder Testmethode ausgeführt, während @BeforeClass einmalig vor der gesamten Klasse ausgeführt wird.
  • Abreißen: @After wird nach jedem Test ausgeführt, selbst wenn der Test einen Fehler auslöst oder eine Assertion fehlschlägt.
  • 🧪 Auftrag: Die Oberklasse @Before wird zuerst ausgeführt, dann die Unterklasse @Before, dann @Test und anschließend jede @After-Klasse.
  • Läufer: JUnitCore.runClasses() führt Testklassen aus und gibt ein Result-Objekt zurück, das alle Fehler enthält.
  • 📊 JUnit 5: @Before, @After, @BeforeClass und @AfterClass werden zu @BeforeEach, @AfterEach, @BeforeAll und @AfterAll.

JUnit Testumgebung mit @Before- und @BeforeClass-Annotationen

JUnit ist die beliebteste Einheit Tests Rahmen in JavaEs wird ausdrücklich empfohlen für Unit Tests. JUnit Für das Testen einer Webanwendung wird kein Server benötigt, wodurch der Testprozess beschleunigt wird.

Das JUnit Das Framework ermöglicht außerdem die schnelle und einfache Generierung von Testfällen und Testdaten. Der org.junit Das Paket besteht aus vielen Schnittstellen und Klassen für JUnit Tests wie Test, Assert, After und Before. Die umfassenderen JUnit Auf denselben Bausteinen baut die Familie auf.

Was ist eine Testvorrichtung?

Bevor wir verstehen, was eine Testvorrichtung ist, wollen wir uns den folgenden Code ansehen.

Dieser Code dient dazu, zwei Testfälle für eine einfache Datei auszuführen.

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

Hier gibt es ein paar Probleme

  • Der Code ist nicht lesbar.
  • Der Code ist nicht einfach zu warten.
  • Wenn die Testsuite komplex ist, kann der Code logische Probleme enthalten.

Vergleichen Sie denselben Code mit 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
    }
}

Der Code ist wesentlich lesbarer und wartungsfreundlicher. Die obige Codestruktur ist eine Prüfvorrichtung.

Eine Testvorrichtung ist ein Kontext, in dem a JUnit Testfall läuft. Zu den Testvorrichtungen gehören in der Regel:

  • Objekte oder Ressourcen, die für jeden Testfall verfügbar sind.
  • Erforderliche Aktivitäten, um diese Objekte und Ressourcen verfügbar zu machen.
  • Diese Aktivitäten sind
    1. Zuteilung (-Setup)
    2. Freigabe aufheben (Teardown).

Auf- und Abbau

Einrichtungsgegenstände sind wichtig, weil JUnit Diese Hooks werden in jedem Test ausgeführt.

  • Normalerweise müssen vor jedem Testfall einige wiederholte Aufgaben erledigt werden. Ejemplo: Erstellen Sie eine Datenbankverbindung.
  • Ebenso kann es am Ende jedes Testfalls zu wiederholten Aufgaben kommen. Ejemplo: zum Aufräumen, sobald die Testausführung abgeschlossen ist.
  • JUnit Es bietet Annotationen, die beim Einrichten und Abbauen helfen. Es stellt sicher, dass Ressourcen freigegeben werden und das Testsystem für den nächsten Testfall bereit ist.

Diese JUnit Die Anmerkungen werden im Folgenden erläutert.

Einrichtung

@Vor Anmerkung in JUnit wird für eine Methode verwendet, die enthält Java Code, der vor jedem Testfall ausgeführt wird, d.h. er wird vor jeder Testausführung ausgeführt.

Teardown (unabhängig vom Urteil)

@Nach dem Die Annotation wird auf eine Methode angewendet, die Folgendes enthält: Java Code, der nach jedem Testfall ausgeführt wird. Diese Methoden werden auch dann ausgeführt, wenn im Testfall Ausnahmen auftreten oder Assertions fehlschlagen.

Hinweis:

  • Es ist eine beliebige Anzahl der oben aufgeführten Anmerkungen zulässig.
  • Alle mit kommentierten Methoden @Vor in JUnit werden vor jedem Testfall ausgeführt, sie können jedoch in beliebiger Reihenfolge ausgeführt werden.
  • Sie können die Methoden `@Before` und `@After` von einer Oberklasse erben. Die Ausführung erfolgt wie folgt und ist ein Standardausführungsprozess in JUnit.
  1. Führen Sie die aus JUnit @Before-Methoden in der Superklasse
  2. Führen Sie die @Before-Methoden in dieser Klasse aus
  3. Führen Sie in dieser Klasse eine @Test-Methode aus
  4. Führen Sie die @After-Methoden in dieser Klasse aus
  5. Führen Sie die @After-Methoden in der Oberklasse aus

JUnit Anmerkung für 5: Diese Anmerkungen sind JUnit 4 (org.junit). JUnit 5 benannten sie um in org.junit.jupiter.apiund die JUnit Der unten stehende Code 4 läuft immer noch unter dem alten Motor.

JUnit 4 Anmerkungen JUnit 5 (Jupiter) Äquivalent Läuft
@Vor @BeforeEach Vor jeder Testmethode
@Nach dem @Nach jedem Nach jeder Testmethode
@Vor dem Unterricht @Vor allen Einmal vor der ganzen Klasse
@Nach dem Unterricht @Schließlich Sobald die ganze Klasse
@Ignorieren @Behindert Überspringt den annotierten Test

Beispiel: Erstellen einer Klasse mit einer Datei als Testumgebung

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
    }
}

Im obigen Beispiel ergibt sich folgende Ausführungskette. Das Diagramm traces gibt einen Erstellungs-Test-Lösch-Zyklus pro Testmethode.

JUnit @Before- und @After-Ausführungskette um zwei Testmethoden

  1. createOutputFile()
  2. testFile1()
  3. deleteOutputFile()
  4. createOutputFile()
  5. testFile2()
  6. deleteOutputFile()

Annahme:

testFile1() wird vor testFile2() ausgeführt, was nicht garantiert ist.

Einmalige Einrichtung

  • Es ist möglich, eine Methode nur einmal für die gesamte Testklasse auszuführen, bevor einer der Tests ausgeführt wird, und zwar vor jedem anderen @Vor Methode(n).
  • Die einmalige Einrichtung ist nützlich zum Starten von Servern, Herstellen von Verbindungen und ähnlichen Aufgaben. Es ist zeitaufwändig, Ressourcen für jeden Test zu schließen und wieder zu öffnen.
  • Dies kann mithilfe der Annotation erfolgen @Vor dem Unterricht in JUnit.
@BeforeClass public static void Method_Name() {	
    // class setup code here	
 }	

Die Methode muss sein öffentliche statische LeereDa JUnit wird aufgerufen, bevor irgendeine Testinstanz existiert.

Einmaliger Abriss

  • Ähnlich wie bei der einmaligen Einrichtung steht auch eine einmalige Bereinigungsmethode zur Verfügung. Sie wird nach allen Testfallmethoden ausgeführt. @Nach dem Anmerkungen wurden ausgeführt.
  • Es ist nützlich zum Anhaltenping Server und Schließung von Kommunikationsverbindungen.
  • Dies kann mit Hilfe der @Nach dem Unterricht Anmerkung.
 @AfterClass public static void Method_Name()	
 {	
    // class cleanup code here	
 }	

JUnit Testsuiten

Sobald die Testumgebung eingerichtet ist, werden zusammengehörige Testklassen in der Regel gruppiert und gemeinsam gestartet.

Wenn wir mehrere Tests in einer bestimmten Reihenfolge ausführen möchten, können wir dies erreichen, indem wir alle Tests an einem Ort zusammenfassen. Dieser Ort wird als Testsuite bezeichnet. Weitere Details zur Ausführung von Testsuiten und deren Verwendung finden Sie in [Link einfügen]. JUnit werden in diesem Abschnitt behandelt Lernprogramm.

JUnit Testläufer

JUnit stellt ein Tool zur Ausführung Ihrer Testfälle bereit.

  • JUnitCore Die Klasse wird zum Ausführen dieser Tests verwendet.
  • Eine Methode namens runClasses Zur Verfügung gestellt von org.junit.runner.JUnitCore wird verwendet, um eine oder mehrere Testklassen auszuführen.
  • Der Rückgabetyp dieser Methode ist der Lösung Objekt (org.junit.runner.Ergebnis), die zum Abrufen von Informationen über die Tests verwendet wird. Das folgende Codebeispiel verdeutlicht dies.
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());					
   }		
}      

Im obigen Code wird das „result“-Objekt verarbeitet, um die erfolgreichen und fehlgeschlagenen Ergebnisse der ausgeführten Testfälle zu ermitteln. Hilfsfunktionen wie … behauptenGleich diese Fehler ansprechen, während @Ignorieren überspringt einen Test.

JUnit Anmerkung für 5: JUnitCore ist das JUnit 4 Runner. JUnit 5 ersetzt es durch das JUnit Plattform Launcher API, normalerweise von der IDE gestartet, Gradle oder Maven Surefire.

Vorname JUnit Programm

Gute Kenntnisse des Softwareentwicklungszyklus (SDLC), Java Programmierung und die Grundlagen der Softwaretest Der Prozess hilft dabei, ein Verständnis zu entwickeln JUnit Programm, ebenso wie das Wissen, wie Komponententests unterscheiden sich von Integrationstests.

Lassen Sie uns Unit-Tests anhand eines praktischen Beispiels verstehen. Wir müssen eine Testklasse mit einer Testmethode erstellen, die mit folgender Annotation versehen ist: @Prüfung wie unten angegeben:

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

Um unsere Testmethode (siehe oben) auszuführen, müssen wir einen Test-Runner erstellen. Im Test-Runner müssen wir die Testklasse als Parameter hinzufügen. JUnitDie Methode `runClasses()` von Core gibt das Testergebnis zurück, je nachdem, ob der Test bestanden oder fehlgeschlagen ist.

Weitere Details hierzu finden Sie im folgenden 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());							
   }		
}      	

Ausgang

Sobald TestRunner.java Wenn wir unsere Testmethoden ausführen, erhalten wir die Ausgabe „fehlgeschlagen“ oder „bestanden“. Die Erklärung der Ausgabe finden Sie unten:

  1. In diesem Beispiel nach der Ausführung MyFirstClassTest.javaDer Test wurde bestanden und das Ergebnis ist grün.
  2. Wäre es fehlgeschlagen, hätte es das Ergebnis rot angezeigt, und der Fehler ist im Fehlerbericht zu erkennen. trace. Siehe die JUnit GUI unten:

Eclipse JUnit Ansicht mit grünem Bestehensbalken für MyFirstClassTest

Häufig gestellte Fragen

JUnit Es wird für jede Testmethode eine neue Instanz der Testklasse erstellt, sodass keine Instanz existiert, wenn Code auf Klassenebene ausgeführt werden muss. Die Deklaration der Methode als statisch ermöglicht dies. JUnit Rufen Sie es direkt auf.

Nein. Die Reihenfolge der Methoden ist absichtlich nicht festgelegt. JUnit 4 Angebote @FixMethodOrder und JUnit 5 bietet @TestMethodOrder an, aber abhängig von der Reihenfolge werden gekoppelte Tests signalisiert.

Die Testmethode wird nie aufgerufen und als Fehler, nicht als Fehlschlag, gemeldet. Jede @After-Methode wird weiterhin ausgeführt, daher muss die Bereinigung ein nur teilweise erstelltes Fixture tolerieren.

Neue Projekte sollten Folgendes hinzufügen: JUnit 5 aggregierte Artefakte org.junit.jupiter:junit-jupiter. Teams, die Legacy-Dateien verwenden JUnit 4 Suiten fügen junit-vintage-engine hinzu, sodass beide auf einer Plattform laufen.

Eine Testumgebung umfasst den gesamten vorbereiteten Kontext eines Tests, einschließlich realer Dateien oder Verbindungen. Ein Mock ist ein Stellvertreter mit vordefiniertem Verhalten, der häufig von der Testumgebung erstellt wird.

Ja, über @BeforeClass in JUnit 4 oder @BeforeAll in JUnit 5. Gemeinsam genutzte Fixtures sind zwar schneller, geben aber den Zustand preis. Daher sollten sie für teure, schreibgeschützte Ressourcen reserviert werden.

KI-Assistenten lesen eine Klasse, ermitteln die benötigten Kollaboratoren und erstellen die @Before-Konfiguration mit der passenden @After-Bereinigung. Überprüfen Sie die generierten Zusicherungen immer selbst.

GitHub-Copilot Erstellt eine Testklasse aus einer Methodensignatur, einschließlich Lebenszyklusannotationen. Standardmäßig wird häufig Folgendes verwendet: JUnit Es handelt sich um 4 Importe, daher überprüfen Sie bitte, ob das Paket mit Ihrer Engine kompatibel ist.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: