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: