JUnit Anmerkungs-Tutorial mit Beispiel: Was ist @Test und @After?

⚡ Intelligente Zusammenfassung

JUnit Annotationen sind eine Form von syntaktischen Metadaten, die hinzugefügt werden Java Quellcode, damit der Test-Runner weiß, welche Methoden wann ausgeführt werden sollen und wie lange die einzelnen Methoden dauern dürfen.

  • 🔘 @Prüfen: Markiert eine öffentliche void-Methode, die JUnit wird als einzelner Testfall ausgeführt.
  • ☑️ Lebenszyklus: @Before und @After umschließen jeden Test, während @BeforeClass und @AfterClass die Klasse umschließen.
  • ✅ Steuern: @Ignore überspringt einen Test, @Test(timeout) begrenzt die Laufzeit, @Test(expected) prüft, ob eine Ausnahme ausgelöst wurde.
  • 🧪 Behauptungen: org.junit.Assert stellt assertEquals, assertTrue, assertNull, assertSame und fail() bereit.
  • ️ Erbe: TestCase, TestResult und TestSuite gehören zum älteren junit.framework-Paket.
  • 📊 JUnit 5: Jupiter benennt diese in @BeforeEach, @AfterEach, @BeforeAll, @AfterAll und @Disabled um.

JUnit Annotations-Tutorial zu @Test, @Before und @After

Was ist JUnit Anmerkungen?

JUnit Anmerkungen sind eine spezielle Form von syntaktischen Metadaten, die hinzugefügt werden können Java Quellcode für bessere Lesbarkeit und Strukturierung des Codes. Variablen, Parameter, Pakete, Methoden und Klassen können annotiert werden. Annotationen wurden eingeführt in JUnit 4, was ergibt Java Der Code ist lesbarer und einfacher. Das ist der große Unterschied zwischen JUnit 3 und JUnit 4: JUnit 4 basiert auf Annotationen.

Mit praktischen Kenntnissen dieser Annotationen kann man leicht lernen und implementieren JUnit prüfen. Nachfolgend finden Sie die wichtigsten und häufig verwendeten JUnit Liste der Anmerkungen, mit der JUnit 5 (Jupiter) Äquivalente neben jedem:

S.No. Anmerkungen Beschreibung JUnit 5 Äquivalent
1. @Prüfung Diese Annotation ersetzt junit.framework.TestCase und gibt an, dass die öffentliche void-Methode, an die sie angehängt ist, als Testfall ausgeführt werden kann. @Test (org.junit.jupiter.api)
2. @Vor Diese Annotation wird verwendet, wenn Sie vor jedem Testfall eine Anweisung wie Vorbedingungen ausführen möchten. @BeforeEach
3. @Vor dem Unterricht Diese Annotation wird verwendet, wenn Sie bestimmte Anweisungen vor allen Testfällen ausführen möchten, beispielsweise eine Testverbindung, die vor allen Testfällen geöffnet werden muss. @Vor allen
4. @Nach dem Diese Annotation kann verwendet werden, wenn Sie nach jeder Anweisung einige Anweisungen ausführen möchten Testfallzum Beispiel das Zurücksetzen von Variablen oder das Löschen temporärer Dateien. @Nach jedem
5. @Nach dem Unterricht Diese Annotation kann verwendet werden, wenn Sie nach Abschluss aller Testfälle bestimmte Anweisungen ausführen möchten, beispielsweise Ressourcen freigeben, nachdem alle Testfälle ausgeführt wurden. @Schließlich
6. @Ignorieren Diese Annotation kann verwendet werden, wenn Sie bestimmte Anweisungen während der Testausführung ignorieren möchten, beispielsweise um bestimmte Testfälle während der Testausführung zu deaktivieren. @Behindert
7. @Test(timeout=500) Diese Annotation kann verwendet werden, wenn Sie während der Testausführung ein Timeout festlegen möchten, beispielsweise wenn Sie im Rahmen einer SLA (Service Level Agreement) arbeiten und die Tests innerhalb einer bestimmten Zeit abgeschlossen sein müssen. @Timeout oder assertTimeout
8. @Test(expected=IllegalArgumentException.class) Diese Annotation kann verwendet werden, um Ausnahmen während der Testausführung abzufangen. Beispielsweise, um zu prüfen, ob eine bestimmte Methode eine bestimmte Ausnahme auslöst. assertThrows

JUnit Beispiel für Anmerkungen

Lassen Sie uns eine Klasse erstellen, die wichtige Themen abdeckt JUnit Annotationen mit einfachen print-Anweisungen erstellen und mit einer Test-Runner-Klasse ausführen:

Schritt 1) Betrachten Sie Folgendes: Java Klasse mit verschiedenen Methoden, die den oben aufgeführten Annotationen zugeordnet sind:

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

    }		

}		

Schritt 2) Erstellen wir eine Test-Runner-Klasse, um den obigen Test auszuführen:

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

erwartetes Ergebnis

  • Alle Testfälle werden nacheinander ausgeführt, und alle Ausgaben können auf einer Konsole angezeigt werden.
  • Wie in der obigen Tabelle erläutert, @Before und @BeforeClass in JUnit Die Methoden m2() und m1() werden vor jedem Testfall bzw. vor allen Testfällen ausgeführt.
  • Genauso wie @After und @AfterClass in JUnit Die Methoden m4() und m3() werden nach jedem bzw. allen Testfällen ausgeführt. Die Annotation @Ignore (Methode m6()) bewirkt, dass der Test ignoriert wird.

Lassen Sie uns die oben verwendeten Testfälle analysieren. Java Klasse im Detail:

  1. Betrachten Sie die unten angegebene Methode m5():
	@Test		
    public void m5() {					
        list.add("test");					
        assertFalse(list.isEmpty());			
        assertEquals(1, list.size());			
    }		

Bei der oben beschriebenen Methode fügen Sie der Variablen „list“ eine Zeichenkette hinzu:

  • Liste ist leer() wird false zurückgeben.
  • behauptenFalse(list.isEmpty()) muss true zurückgeben.
  • Infolgedessen wird der Testfall passieren.

Da Sie der Liste nur eine Zeichenkette hinzugefügt haben, beträgt die Größe eins.

  • list.size() muss den Integer-Wert „1“ zurückgeben.
  • So behauptenEquals(1, list.size()) muss true zurückgeben.
  • Infolgedessen wird der Testfall passieren.
  1. Betrachten Sie die unten angegebene Methode m7():
@Test(timeout = 10)		
    public void m7() {					
        System.out.println("Using @Test(timeout),it can be used to enforce timeout in JUnit4 test case");					
    }		

Wie oben besprochen, @Test(timeout = 10) Dient dazu, ein Timeout im Testfall zu erzwingen. Der Wert wird in Millisekunden angegeben, daher muss m7() innerhalb von 10 ms abgeschlossen sein.

  1. Betrachten Sie die unten angegebene Methode m8():
@Test(expected = NoSuchMethodException.class)				
    public void m8() {					
        System.out.println("Using @Test(expected) ,it will check for specified exception during its execution");					
    
    }		

Wie oben besprochen, @Test(erwartet) Die Methode prüft während ihrer Ausführung auf die angegebene Ausnahme, daher löst die Methode m8() eine „No Such Method Exception“ aus. Folglich wird der Test mit einer Ausnahme ausgeführt.

Genauigkeitshinweis: m8() gibt nur eine Zeile aus, daher wird die deklarierte Ausnahme nie tatsächlich ausgelöst und JUnit Fehler 4 meldet, dass der Test fehlgeschlagen ist. Gleichen Sie den erwarteten Typ mit dem tatsächlichen Fehlertyp der Methode ab. JUnit 5 schreibt dies mit assertThrows.

Da alle Testfälle bestanden sind, führt dies zu einer erfolgreichen Testausführung.

Tatsächliche Ergebnis

Da das obige Beispiel drei Testfälle enthält, werden alle Testfälle nacheinander ausgeführt. Siehe den folgenden Screenshot der Konsole:

Eclipse Konsolenausgabe mit Anzeige der print-Anweisungen @BeforeClass, @Before, @After und @AfterClass
Konsolenausgabe, erzeugt von JUnitAnnotationsExample

Siehe folgende Druckanweisungen, die auf der Konsole angezeigt werden können:

Mit @BeforeClass vor allen Testfällen ausgeführt

Verwendung von @Before-Annotationen, die vor jedem Testfall ausgeführt werden

Mit @After nach jedem Testfall ausgeführt

Verwendung von @Before-Annotationen, die vor jedem Testfall ausgeführt werden

Mithilfe von @Test(timeout) kann eine Zeitüberschreitung erzwungen werden JUnit4 Testfall

Mit @After nach jedem Testfall ausgeführt

Verwendung von @Before-Annotationen, die vor jedem Testfall ausgeführt werden

Mit @Test(expected) wird während der Ausführung nach einer bestimmten Ausnahme gesucht

Mit @After nach jedem Testfall ausgeführt

Mit @AfterClass wird es nach allen Testfällen ausgeführt

JUnit Assert-Klasse

Die Annotationen legen fest, wann eine Methode ausgeführt wird; die Assert-Methoden entscheiden, ob sie erfolgreich ist.

Diese Klasse stellt eine Reihe von Assertionsmethoden bereit, die beim Schreiben von Testfällen hilfreich sind. Wenn alle Assertions erfolgreich sind, ist der Test erfolgreich. Schlägt eine Assertionsbedingung fehl, schlägt der Test fehl. JUnit behaupten Das Tutorial behandelt jede Methode ausführlich.

Wie Sie bereits gesehen haben, beschreibt die folgende Tabelle wichtige Assert-Methoden und deren Beschreibung:

S.No. Methodik Beschreibung
1. void AssertEquals(boolescher Wert erwartet, boolescher Istwert) Es prüft, ob zwei Werte gleich sind, ähnlich wie die equals-Methode der Object-Klasse.
2. void affirmFalse(boolesche Bedingung) Die Funktionalität besteht darin zu prüfen, ob eine Bedingung nicht erfüllt ist.
3. voidassuertNotNull(Object object) Mit der Funktion „assertNotNull“ wird überprüft, ob ein Objekt nicht null ist.
4. voidassuertNull(Object object) Die Funktion „assertNull“ besteht darin, zu überprüfen, ob ein Objekt null ist.
5. voidassuertTrue(boolesche Bedingung) Die Funktion „assertTrue“ besteht darin, zu überprüfen, ob eine Bedingung wahr ist.
6. void fail() Wenn Sie einen Assertionsfehler auslösen möchten, führt fail() immer zu einem Fehlschlag.
7. void AssertSame([String-Nachricht] Die Funktion „assertSame“ besteht darin, zu überprüfen, ob die beiden Objekte auf dasselbe Objekt verweisen.
8. void AssertNotSame([String-Nachricht] Die Funktion „assertNotSame“ besteht darin, zu überprüfen, ob die beiden Objekte nicht auf dasselbe Objekt verweisen.

JUnit Klasse „Testfälle“.

Um mehrere Tests auszuführen, steht die TestCase-Klasse zur Verfügung. JUnit-Framework Das Paket. Die @Test-Annotation besagt: JUnit dass diese öffentliche Methode (hier ein Testfall), an die sie angehängt ist, als Testfall ausgeführt werden kann.

Versionshinweis: Testfall, Testergebnis und TestSuite gehören zum Erbe JUnit-Framework Paket von JUnit 3. Sie werden weiterhin im JUnit 4.x-Artefakt ausgeliefert, aber annotationsbasierte Tests erweitern TestCase nicht.

Die folgende Tabelle zeigt einige wichtige Methoden, die in der junit.framework.TestCase Klasse:

S.No. Methodik Beschreibung
1. int countTestCases() Diese Methode dient dazu, zu zählen, wie viele Testfälle vom System ausgeführt werden. run(TestResult tr) Methode.
2. TestResult createResult() Mit dieser Methode wird ein erstellt Testergebnis Objekt.
3. String getName () Diese Methode gibt einen String zurück, der nichts anderes als ein ist Testfall Namen.
4. TestResult run() Diese Methode dient zur Ausführung eines Tests, der ein Ergebnis zurückgibt. Testergebnis Objekt.
5. void run(TestResult-Ergebnis) Diese Methode wird verwendet, um einen Test mit a auszuführen Testergebnis Objekt, das nichts zurückgibt.
6. void setName (String name) Diese Methode wird verwendet, um den Namen eines Testfall.
7. void setUp() Diese Methode wird verwendet, um Code zur Ressourcenzuordnung zu schreiben, beispielsweise zum Herstellen einer Datenbankverbindung.
8. void TearDown() Diese Methode wird verwendet, um Code zur Ressourcenfreigabe zu schreiben, beispielsweise zum Freigeben einer Datenbankverbindung nach der Durchführung einer Transaktionsoperation.

JUnit TestResult-Klasse

Wenn Sie einen Test ausführen, wird ein Ergebnis zurückgegeben (in Form eines Testergebnis Dieses TestResult-Objekt kann zur Analyse des resultierenden Objekts verwendet werden. Das Testergebnis kann entweder fehlschlagen oder erfolgreich sein.

Die folgende Tabelle enthält wichtige Methoden, die in der Klasse junit.framework.TestResult verwendet werden:

S.No. Methodik Beschreibung
1. void addError(Test test, Throwable t) Diese Methode wird verwendet, wenn Sie dem Test einen Fehler hinzufügen möchten.
2. void addFailure(Test test, AssertionFailedError t) Diese Methode wird verwendet, wenn Sie einen Fehler zur Fehlerliste hinzufügen müssen.
3. void endTest(Testtest) Mit dieser Methode wird mitgeteilt, dass ein Test durchgeführt (abgeschlossen) wurde.
4. int errorCount() Mit dieser Methode lassen sich die während der Testausführung festgestellten Fehler ermitteln.
5. Aufzählung Fehler() Diese Methode gibt einfach eine Sammlung (hier eine Aufzählung) von Fehlern zurück.
6. int failCount() Mit dieser Methode wird die Anzahl der während der Testausführung festgestellten Fehler ermittelt.
7. Void-Lauf (TestCase-Test) Mit dieser Methode wird ein Testfall ausgeführt.
8. int runCount() Diese Methode zählt einfach die ausgeführten Tests.
9. void startTest(Testtest) Diese Methode wird verwendet, um zu benachrichtigen, dass ein Test gestartet wurde.
10 void stop() Diese Methode wird verwendet, um den Testlauf zu stoppen.

JUnit Testsuite-Klasse

Wenn Sie mehrere Tests in einer bestimmten Reihenfolge ausführen möchten, können Sie dies erreichen, indem Sie alle Tests an einem Ort zusammenfassen. Dieser Ort wird als Testsuite bezeichnet. JUnit Testsuite Das Tutorial führt Sie durch ein vollständiges Beispiel.

Die folgenden Tabellen enthalten wichtige Methoden, die in der junit.framework.TestSuite Klasse:

S.No. Methodik Beschreibung
1. void addTest(Testtest) Diese Methode wird verwendet, wenn Sie der Suite einen Test hinzufügen möchten.
2. void addTestSuite(Class testClass) Diese Methode wird verwendet, wenn Sie die Klasse angeben möchten, während Sie der Suite einen Test hinzufügen.
3. int countTestCases() Diese Methode wird verwendet, wenn Sie die Anzahl der Testfälle zählen möchten.
4. String getName () Mit dieser Methode wird der Name der Testsuite ermittelt.
5. void run(TestResult-Ergebnis) Diese Methode dient dazu, einen Test durchzuführen und das Testergebnis in einem Testergebnis Objekt.
6. void setName (String name) Diese Methode dient dazu, den Namen des TestSuite.
7. Test testAt(int index) Diese Methode wird verwendet, wenn Sie den Test an einem bestimmten Index zurückgeben möchten.
8. int testCount() Diese Methode wird verwendet, wenn Sie die Anzahl der Tests in der Testsuite zurückgeben möchten.
9. statische Testwarnung (String-Nachricht) Diese Methode gibt einen Test zurück, der fehlschlägt und eine Warnmeldung protokolliert.

Häufig gestellte Fragen

Ja. Eine Methode enthält üblicherweise die Annotationen `@Test` und `@Ignore` oder `@Test` mit einem Timeout und einer erwarteten Ausnahme. Zwei Lebenszyklusannotationen wie `@Before` und `@After` können nicht auf eine Methode angewendet werden.

@Ignore unterdrückt nur eine Methode JUnit Wird bereits als Test erkannt. Ohne @Test daneben erfasst der Runner die Methode nie, daher wird sie weder ausgeführt noch als übersprungen aufgelistet.

JUnit Die Methode wird in einem separaten Thread ausgeführt und schlägt nach Ablauf des Zeitlimits mit einer TestTimedOutException fehl. Der Thread wird unterbrochen, nicht beendet, sodass ein blockierender Aufruf möglicherweise weiterläuft.

Nur durch den Oldtimer-Motor. Das Hinzufügen des junit-Vintage-Motors ermöglicht den JUnit Die Plattform führt bestehende org.junit-Tests unverändert aus, aber Jupiter-Tests müssen org.junit.jupiter.api importieren. Das Mischen beider Importsätze in einer Klasse schlägt fehl.

Nur für Wartungszwecke. Legacy-Testsuiten, die TestCase erweitern und TestSuite-Objekte erstellen, sind in älteren Codebasen weiterhin verbreitet; daher ist es hilfreich, die API zu kennen. Neue Tests sollten annotationsbasiert sein.

JUnit Es wird für jede Testmethode eine neue Instanz der Testklasse erstellt, sodass keine Instanz existiert, wenn die Klasseneinrichtung ausgeführt werden muss. Eine statische Methode benötigt keine Instanz. JUnit Lehnt eine nicht-statische Deklaration ab.

KI-Assistenten lesen die zu testende Methode und schlagen vor, ob die Setup-Anweisung in `@Before` oder `@BeforeClass` gehört und ob ein Fehlerpfad `@Test(expected)` oder `assertThrows` benötigt. Jeder Vorschlag ist als Entwurf zu verstehen.

GitHub-Copilot Die Auf- und Abbaupositionen werden in der Regel korrekt festgelegt, aber häufig werden sie vermischt. JUnit 4 und Jupiter importieren in einer Datei. Überprüfen Sie den Importblock, bevor Sie die Suite ausführen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: