2012-12-13 5 views
5

Ich habe eine Junit-Testklasse mit mehreren @Test-Methoden, die ich in der Reihenfolge ausführen muss. Wenn in einer Methode eine Ausnahme ausgelöst wird, möchte ich den gesamten Testfall und den gesamten Fehler beenden, aber alle anderen Testmethoden werden ausgeführt.Junit-Testklasse mit mehreren @Test-Methoden

public class{ 

@Test{ 
//Test1 method`enter code here` 
} 

@Test{ 
//Test2 method 
} 

@Test{ 
//Test3 method 
} 

} 

Wenn Test1 Methode dann andere Tests laufen nicht fehlschlägt

Hinweis: Alle sind unabhängige Tests

Antwort

9

Unit-Tests sollten unabhängig voneinander laufen ausgelegt sein. Die Reihenfolge der Ausführung kann nicht garantiert werden. Sie sollten Ihre Testklasse so umgestalten, dass die Reihenfolge nicht wichtig ist.

Ohne weitere Informationen ist es schwierig, Sie gezielt zu beraten. Aber es kann hilfreich sein, eine @before Methode zu haben, die vor dem Ausführen jedes Tests nach einer Vorbedingung sucht. Wenn Sie einen Methodenaufruf Assume.assumeTrue(...) einbezogen haben, könnte Ihr Test übersprungen werden, wenn die Bedingung fehlschlägt?

2

Wenn Sie die Konsequenz behalten müssen und einen Test versäumen, um den ganzen Satz nicht zu versagen, setzen Sie alle solche Tests in einen und testen Sie durch annehmen.

8

Wie beschrieben here unterstützt JUnit 4.11 die geordnete Ausführung mit der Anmerkung @FixMethodOrder, aber die anderen sind richtig, alle Tests sollten unabhängig voneinander sein.

Am Ende eines Tests können Sie ein globales Erfolgsflag setzen. Diese Flagge wird zu Beginn jedes Tests getestet. Wenn das Flag am Ende eines Tests nicht gesetzt ist (weil es vor dem Beenden fehlschlägt), werden alle anderen Tests ebenfalls fehlschlagen. Beispiel:

@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class ConsecutiveFail{ 
    private boolean success = true; 

    @Test 
    public void test1{ 
    //fist two statements in all tests 
    assertTrue("other test failed first", success); 
    success = false; 
    //do your test 
    //... 

    //last statement 
    success = true; 
    } 

    @Test 
    public void test2{ 
    //fist two statements in all tests 
    assertTrue("other test failed first", success); 
    success = false; 
    //do your test 
    //... 

    //last statement 
    success = true; 
    } 
} 
1

Hier ist Beispiel für testng etwas Hilfe bieten könnte, wie Test fahrbereitem Zustand angeben:

@Test(priority = 1) 
public void test1(){} 

@Test(priority = 2) 
public void test2(){} 

@Test(priority = 3) 
public void test3(){}