JUnit ErrorCollector @Rule mit Beispiel

⚡ Intelligente Zusammenfassung

JUnit ErrorCollector ist eine Regel, die es einem Test ermöglicht, nach einem Fehler weiterzulaufen, indem sie alle Fehlerobjekte sammelt und diese nach Abschluss der Testmethode zusammen meldet, anstatt den Test zu stoppen.ping beim ersten Problem.

  • 🔘 Zweck: Setzen Sie den Test fort, nachdem eine Assertion, eine Netzwerk- oder GUI-Prüfung fehlgeschlagen ist, und melden Sie anschließend alle gesammelten Fehler auf einmal.
  • ☑️ Erklärung: @Rule für ein öffentliches, nicht-statisches ErrorCollector-Feld sagt JUnit Die Regel jedem Test zuzuordnen.
  • ✅ Sammeln: addError(Throwable) speichert jeden Error oder Exception, da Throwable die übergeordnete Klasse von beiden ist.
  • 🧪 Überprüfung: Die Funktion checkThat() wertet einen Matcher aus und protokolliert eine Nichtübereinstimmung, ohne die restlichen Anweisungen abzubrechen.
  • ️ Reporting: Der Fehlschlag trace listet alle gesammelten Wurfgegenstände mit ihrer jeweiligen Zeilennummer in der JUnit Aussicht.
  • 📌 JUnit 5: Da es auf Jupiter keine Regeln mehr gibt, spielen assertAll() oder AssertJ SoftAssertions dieselbe Rolle.

JUnit Die ErrorCollector-Regel sammelt mehrere Fehler in einem Testlauf.

In einem normalen Szenario würden Sie jedes Mal, wenn Sie während der Testausführung einen Fehler feststellen, den Test stoppen, den Fehler beheben und den Test erneut ausführen.

Doch JUnit verfolgt einen etwas anderen Ansatz. Mit dem JUnit Dank des Fehlersammlers kann die Testausführung auch dann fortgesetzt werden, wenn ein Problem auftritt oder der Test fehlschlägt. Der Fehlersammler erfasst alle Fehlerobjekte und meldet sie nur einmal, nach Abschluss der Testausführung.

Warum Error Collector verwenden?

Beim Schreiben eines Testskripts möchten Sie alle Tests ausführen, selbst wenn eine Codezeile aufgrund eines Netzwerkfehlers, eines Assertionsfehlers oder aus einem anderen Grund fehlschlägt. In diesem Fall können Sie die Ausführung des Testskripts mithilfe einer speziellen Funktion fortsetzen. JUnit bekannt als „Fehlersammler“.

Dafür, JUnit verwendet das @Rule-AnmerkungDiese Methode dient zur Erstellung eines Fehlersammlerobjekts. Sobald das Fehlersammlerobjekt erstellt ist, können Sie mithilfe der Methode alle Fehler einfach dem Objekt hinzufügen. addError (auslösbarer Fehler). Wie du weißt, Werfen ist die Superklasse der Exception und Fehler Klassen in JavaWenn Sie auf diese Weise Fehler hinzufügen, werden diese Fehler protokolliert. JUnit Testergebnis.

Der Vorteil, alle Fehler in einem Fehlersammler zu erfassen, besteht darin, dass Sie alle Fehler gleichzeitig überprüfen können. Selbst wenn das Skript mittendrin fehlschlägt, wird die Ausführung bis zum Ende der Testmethode fortgesetzt.

HinweisBei Verwendung einer einfachen Assert-Anweisung oder eines try/catch-Blocks ist die Verwendung der Fehlersammelmethode nicht möglich.

Beispielcode

Um mehr über den Fehlersammler zu erfahren, sehen Sie sich das folgende Codebeispiel an, das zeigt, wie Sie ein Fehlersammlerobjekt erstellen und alle Fehler diesem Objekt hinzufügen. track das Problem:

package guru99.junit;		

import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							
    collector.checkThat(getResults(),			
                not(containsString("here is an error")));			
    // all lines of code will execute and at the end a combined failure will		
    be logged in.		
    }		
}	

Hinweis: Dies ist ein illustratives Beispiel.tract ist keine kompilierbare Datei. Der nachfolgende Kommentar wird ohne führendes // in eine zweite Zeile umgebrochen, und getResults() sowie die Hamcrest-Matcher werden nicht angezeigt. Die vollständige lauffähige Version folgt unter Beispiel mit ErrorCollector.

Was ist @Rule in JUnit?

JUnit bietet eine besondere Art der Testbehandlung. Testfall oder Testsuite mithilfe der @Rule-AnmerkungMit @Rule können Sie das Verhalten des Tests einfach hinzufügen oder neu definieren.

Es gibt mehrere integrierte Regeln, die vom System bereitgestellt werden. JUnit Es gibt eine API, die ein Tester verwenden kann, und Sie können auch Ihre eigene Regel schreiben. Ein Regelfeld muss öffentlich, nicht statisch und von einem Typ sein, der TestRule implementiert.

Die folgende Codezeile zeigt, wie die @Rule-Annotation zusammen mit dem Error Collector verwendet wird:

@Rule				
public ErrorCollector collector= new ErrorCollector();

JUnit Anmerkung für 5: Jupiter hat die Regeln durch die Extension API ersetzt, daher existieren @Rule und ErrorCollector in org.junit.jupiter nicht. Die nächstliegenden Entsprechungen sind Assertions.assertAll() und AssertJ SoftAssertions. JUnit Der hier gezeigte Code 4 läuft noch immer durch den Oldtimer-Motor. Siehe den JUnit Anmerkungen Anleitung für die vollständige Karteping.

Beispiel mit ErrorCollector

Um den Fehlersammler zu verstehen, erstellen wir eine Klasse und eine Regel, die alle Fehler sammelt. Sie fügen alle Fehler hier mit `addError(throwable)` hinzu.

Der unten stehende Code erstellt lediglich eine Regel, die nichts anderes als ein „Fehlersammelobjekt“ ist. Dieses wird anschließend verwendet, um alle Fehler hinzuzufügen und das Problem am Ende zu melden:

ErrorCollectorExample.java

package guru99.junit;		

import org.junit.Assert;		
import org.junit.Rule;		
import org.junit.Test;		
import org.junit.rules.ErrorCollector;		

public class ErrorCollectorExample {				
    @Rule		
    public ErrorCollector collector = new ErrorCollector();							

    @Test		
    public void example() {					
    collector.addError(new Throwable("There is an error in first line"));							
    collector.addError(new Throwable("There is an error in second line"));							

        System.out.println("Hello");					
        try {			
            Assert.assertTrue("A " == "B");					
        } catch (Throwable t) {					
            collector.addError(t);					
        }		
        System.out.println("World!!!!");					
    }		
}		

TestRunner.java

Fügen wir die obige Testklasse einem Test-Runner hinzu und führen wir sie aus, um alle Fehler zu erfassen. Siehe den 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(ErrorCollectorExample.class);					
			for (Failure failure : result.getFailures()) {							
         System.out.println(failure.toString());					
      }		
      System.out.println("Result=="+result.wasSuccessful());							
   }		
}      

Ausgang:

Siehe das Versagen trace, welches tracEs fasst alle Fehler an einem Ort zusammen. JUnit Die Ansicht zählt einen Durchlauf, meldet aber zwei Fehler und einen Ausfall, jeweils mit eigener Zeilennummer:

Eclipse JUnit Fehler tracDie Auflistung von zwei Throwable-Fehlern und einem AssertionError, die in einem einzigen Durchlauf aufgetreten sind, ist e.

Vorteile der JUnit ErrorCollector

Sie können eine JUnit Behauptung für die funktionale oder GUI-Validierung, zum Beispiel:

  1. assertEquals(String message, Object expected, Object actual), das vergleicht, ob zwei Objekte gleich sind.
  2. In ähnlicher Weise stellt „asserTrue(Boolesche Bedingung)“ fest, dass eine Bedingung wahr ist.

Mithilfe von Assertions wird das Validierungstesten vereinfacht. Ein großes Problem besteht jedoch darin, dass die Testausführung selbst dann abbricht, wenn eine einzige Assertion fehlschlägt.

Die Kontinuität und Wiederherstellung von Tests ist entscheidend für den Erfolg der Testautomatisierung und spielt insbesondere bei langen Testläufen eine wichtige Rolle. Selenium Bei Anwendungen, bei denen das Neustarten des Browsers nach jedem fehlgeschlagenen Check aufwändig ist, ist der Error Collector die beste Lösung für solche Szenarien.

Häufig gestellte Fragen

`addError(Throwable)` protokolliert einen bereits abgefangenen oder erzeugten Fehler. `checkThat(value, matcher)` wertet einen Hamcrest-Matcher aus und protokolliert automatisch eine Nichtübereinstimmung, sodass es sich wie eine Assertion liest, während die restlichen Anweisungen weiterhin ausgeführt werden können.

Ja. Die Methode wird vollständig ausgeführt, dann JUnit Markiert den Fehler und gibt alle gesammelten Wurfgegenstände im Fehlerfall aus. trace. Der Beispiel-Screenshot zeigt zwei Fehler und einen Fehlschlag bei einer einzelnen Testmethode.

JUnit Die Testklasse wird nach öffentlichen Instanzfeldern durchsucht, die mit @Rule annotiert sind, und jede dieser Annotationen wird auf jede Testmethode angewendet. Private oder statische Felder werden ignoriert. JUnit löst einen Initialisierungsfehler aus, anstatt den Test auszuführen.

Nein. Jupiter hat den Regelmechanismus entfernt, daher existiert org.junit.rules.ErrorCollector nur in JUnit 4. Verwenden Sie Assertions.assertAll() für gruppierte Assertions oder fügen Sie AssertJ SoftAssertions hinzu, wenn komplexere Matcher benötigt werden.

Ja, und das ist ein gängiges Vorgehen. Eine Seite mit mehreren Feldern kann in einem Durchlauf validiert werden, wobei alle Abweichungen erfasst werden, anstatt beim ersten Fehler abzubrechen. Dadurch wird vermieden, dass die Browsersitzung für jeden gefundenen Fehler neu gestartet werden muss.

Beide verzögern die Meldung von Fehlern, aber SoftAssert erfordert einen expliziten Aufruf von assertAll() am Ende des Tests, während ErrorCollector automatisch einen Fehler meldet, sobald die Methode zurückkehrt. Das Vergessen von assertAll() in TestNG Verschweigt Fehler stillschweigend.

KI-Assistenten gruppieren sich ein langes Versagen tracDurch die Analyse der Ursachen werden zwanzig gesammelte Fehler auf eine Handvoll unterschiedlicher Defekte reduziert. Außerdem wird deutlich, welche Prüfungen in einem gemeinsamen Testlauf und nicht in separaten Tests durchgeführt werden sollten.

GitHub-Copilot Das Feld `@Rule` wird zwar korrekt geschrieben, aber häufig in eine Jupiter-Testklasse eingefügt, in der keine Regeln existieren. Stellen Sie sicher, dass die Importe `org.junit` sind, bevor Sie die Testsuite ausführen.

Fassen Sie diesen Beitrag mit folgenden Worten zusammen: