Was ist der Unterschied zwischen Fehler und Fehler in JUnit?


93

Ich führe JUnit-Tests auf einer großen Codebasis aus und habe festgestellt, dass manchmal "Fehler" und manchmal "Fehler" auftreten. Was ist der Unterschied?

Antworten:


116

Ok, ich habe gerade ein Muster bemerkt und denke, ich habe es herausgefunden (korrigiere mich, wenn ich falsch liege). Es scheint mir, dass Fehler auftreten, wenn Ihre Testfälle fehlschlagen - dh Ihre Behauptungen sind falsch. Fehler sind unerwartete Fehler, die auftreten, wenn versucht wird, den Test tatsächlich auszuführen - Ausnahmen usw.


5
Wenn jedoch etwas erweitert java.lang.AssertionErrorwird, wird es als Testfehler anstelle eines Testfehlers angezeigt. Sie sollten in Betracht ziehen, Ihre eigene Antwort zu akzeptieren, da sie korrekt ist.
Ponzao

Ja, das ist genau der Unterschied. Und aus pragmatischer Sicht gibt es "keinen Unterschied" - wenn Sie einen Fehler oder einen Fehler erhalten, müssen Sie ihn beheben. Es war also wahrscheinlich ein Fehler, "Fehler" und "Fehler" in JUnit getrennt zu zählen. JUnit 4 kombiniert beide (wie in einer Antwort unten erläutert).
Jeff Grigg

Und wenn die Ausnahme erwartet wird, sollten Sie die @Testmit kommentieren expected = SomeException.class.
Downhillski

@ JeffGrigg gibt es einen pragmatischen Unterschied. Wenn in mehreren Testfällen auf ein Verhalten zurückgegriffen wird, kann ich immer noch nur einen Testfall schreiben, der dieses Verhalten bestätigt, während er nicht erfasste, wahrscheinlich Laufzeitausnahmen in allen anderen Fällen auslöst. Dies bedeutet, dass der Rest der Testfälle etwas anderes testet, obwohl sie immer noch von diesem bestimmten Verhalten abhängen, um ausgeführt zu werden. Wenn dieses Verhalten fehlerhaft ist, meldet nur ein Testfall einen Fehler, während der Rest einen Fehler meldet. Daraus kann ich ersehen, dass genau ein Fehler behoben werden muss, obwohl viele Testfälle nicht bestanden wurden.
RonJRH

org.junit.Assert.assertEquals (), wenn ein Fehler auftritt, wird vom JUnit4-HTML-Bericht als FEHLER betrachtet. Dies widerspricht Ihrer Aussage (die mir bisher bekannt war). Können Sie bitte mehr Licht ins Dunkel bringen?
Krishnom

15

Wenn Ihr Test eine Ausnahme auslöst, die nicht durch das Assertion-Framework in Junit gesprudelt wird, wird dies als Fehler gemeldet. Beispielsweise meldet ein NullPointer oder eine ClassNotFound-Ausnahme einen Fehler:

String s = null;
s.trim();

oder,

try {

    // your code
} catch(Exception e) {
    // log the exception
    throw new MyException(e);
}

Im Folgenden wird jedoch ein Fehler gemeldet:

Assert.fail("Failure here");

oder,

Assert.assertEquals(1, 2);

oder auch:

throw new AssertionException(e);

Dies hängt von der verwendeten Junit-Version ab. Junit 4- unterscheidet zwischen einem Fehler und einem Fehler, Junit 4 vereinfacht dies jedoch nur als Fehler.

Der folgende Link bietet weitere interessante Beiträge:

http://www.devx.com/Java/Article/31983/1763/page/2


Dies ist nicht korrekt. Die Unterscheidung zwischen Testfehler und Testfehler ist in JUnit 4 nicht verschwunden. Ich habe es gerade getestet. Der verlinkte Artikel war irreführend. Es heißt "JUnit 4 macht es einfacher, indem nur Fehler verwendet werden", aber es sollte betont werden, dass JUnit 4 java.lang.AssertionError in Testfehler umwandelt, sodass Sie junit.framework.AssertionFailedError nicht verwenden müssen. Der Vorteil besteht darin, dass Sie damit beginnen können, Testzusicherungen in den Produktionscode zu schreiben, ohne dass das Projekt mit JUnit verknüpft ist. Die Unterscheidung zwischen Testfehler und Testfehler ist ebenfalls immens nützlich und wäre ein Schritt zurück, wenn sie entfernt würde.
RonJRH

RonJRH, können Sie die Fehler in Ihrem Standard-Junit-Bericht sehen?
Neel

Ja Neel. Ich habe es gerade versucht. Ich bin mir nicht ganz sicher, wie das Bild hier verlinkt wird, aber dies zeigt das Ergebnis meines Tests: imagebucket.net/abpxucddkvn1/Capture.PNG
RonJRH

6

Aus "Pragmatisches Unit-Testen in Java 8 mit JUnit":

Assertions (oder Asserts) in JUnit sind statische Methodenaufrufe, die Sie in Ihre Tests einfügen. Jede Behauptung ist eine Gelegenheit, um zu überprüfen, ob eine Bedingung erfüllt ist. Wenn eine bestätigte Bedingung nicht zutrifft, stoppt der Test genau dort und JUnit meldet einen Testfehler.

(Es ist auch möglich, dass beim Ausführen des Tests durch JUnit eine Ausnahme ausgelöst und nicht abgefangen wird. In diesem Fall meldet JUnit einen Testfehler.)


5

Der folgende Test erklärt den Unterschied zwischen Testfehler und Testfehler .

Ich habe die Zeile kommentiert, die Testfehler und Testfehler auslöst.

    @Test
    public void testErrorVsTestFailure() {

        final String sampleString = null;

        assertEquals('j', sampleString.charAt(0) );
        //above line throws test error as you are trying to access charAt() method on null reference

        assertEquals(sampleString, "jacob");
        //above line throws Test failure as the actual value-a null , is not equal to expected value-string "jacob"
        }

Junit zeigt also Testfehler an, wenn Sie eine Ausnahme erhalten, und Testfehler, wenn Ihr erwarteter Ergebniswert nicht mit Ihrem tatsächlichen Wert übereinstimmt


2

Quellklasse: JUnitReportReporter.java

public void generateReport(List<XmlSuite> xmlSuites, List<ISuite> suites, String defaultOutputDirectory) {
//......

            for (ITestResult tr : (Set) entry.getValue()) {
                TestTag testTag = new TestTag();

                boolean isSuccess = tr.getStatus() == 1;
                if (!(isSuccess)) {
                    if (tr.getThrowable() instanceof AssertionError)
                        ++errors;
                    else {
                        ++failures;
                    }
                }
}

Wie Sie unten in der obigen Methode sehen können

tr.getThrowable () Instanz von AssertionError

Die Anzahl der Fehler wird erhöht, wenn es sich um eine Instanz von AssertionError handelt. Andernfalls wird (ein beliebiger Throwable) als Fehler gezählt.


1

Sie haben Recht, dass Fehler von den AssertionErrors stammen, die von den JUnit-Assertion-Methoden ausgelöst wurden, oder durch das Auslösen eines AssertionError oder durch das Auslösen einer Ausnahme, die Sie in Ihrer @TestAnmerkung deklariert haben , und Fehler von anderen, unerwarteten Ausnahmen. Aber es gibt einen wichtigen Unterschied zwischen ihnen:

Ein Fehler bedeutet, dass Ihr Test korrekt ausgeführt wurde und ein Fehler in Ihrem Code festgestellt wurde.

Ein Fehler könnte einen Fehler in Ihrem Code bedeuten, auf den Sie jedoch nicht einmal getestet haben. Es könnte auch bedeuten, dass sich der Fehler im Test selbst befindet.

Kurz gesagt, ein Fehler bedeutet, dass Sie den zu testenden Code neu schreiben müssen. Ein Fehler bedeutet, dass es sich möglicherweise um den Komponententest handelt, den Sie neu schreiben müssen. Dies kann auch dann bedeuten, wenn der Fehler in Ihrem Code aufgetreten ist, z. B. a NullPointerException, weil Sie einen Fehler entdeckt haben, auf den Sie nicht einmal getestet haben. Daher ist es möglicherweise ratsam, dies zu testen.


0

Ironischerweise bieten Junit und andere testbezogene Frameworks (testng, hamcrest) Assert-Operationen, die den Zustand überprüfen und prüfen, ob er fehlschlägt wird "unter der Haube" ein java.lang.AssertionError ausgelöst, der übrigens java.lang.Error erweitert.

Aber es widerspricht keineswegs den obigen Antworten, die natürlich voll gültig sind. Um einen bestimmten Testablauf als Fehler zu markieren, kann AssertionError ausgelöst werden. Ich bin mir jedoch nicht sicher, ob er wirklich in den entsprechenden Handbüchern dokumentiert ist, da er besser für die Verwendung der dedizierten fail () -API geeignet ist. Andere Arten von Throwable werden als Fehler und nicht als Fehler betrachtet.


0

Grundsätzlich beziehen sich Fehler auf unerfüllte Aussagen, während Fehler auf eine abnormale Testausführung zurückzuführen sind . und ich denke, jede IDE hat symbolische Symbole mit unterschiedlichen Farben für bestanden , nicht bestanden und mit Fehlertests .

Weitere Informationen finden Sie hier .

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.