如果特定测试失败,则停止JUnit套件

Jon*_*han 18 java junit

我有一个JUnit测试套件的形式:

@RunWith(Suite.class)
@Suite.SuiteClasses( { xx.class, yy.cass })

public class AllTests {

public static Test suite() {
    TestSuite suite = new TestSuite(AllTests.class.getName());
    //$JUnit-BEGIN$

    //$JUnit-END$
    return suite;
}
}
Run Code Online (Sandbox Code Playgroud)

然后调用这样的vanilla测试:

public class xxx {

@Test
public void test () throws {
    ...
Run Code Online (Sandbox Code Playgroud)

我有一种情况,如果在第一次测试中出现错误或失败,我想停止运行测试套件的其余部分.但是其他错误/失败是可以的,套件应该完成尽可能多的其他测试.基本上,第一次测试失败将表明运行其余测试是不安全的.

这可能吗?

小智 13

首先你需要junit RunListener:

import org.junit.runner.notification.Failure;
import org.junit.runner.notification.RunListener;
import org.junit.runner.notification.RunNotifier;

public class FailureListener extends RunListener {

    private RunNotifier runNotifier;

    public FailureListener(RunNotifier runNotifier) {
        super();
        this.runNotifier=runNotifier;
    }

    @Override
    public void testFailure(Failure failure) throws Exception {
        super.testFailure(failure);
        this.runNotifier.pleaseStop();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后准备套房:

public class StopOnFailureSuite extends Suite {

    public StopOnFailureSuite(Class<?> klass, Class<?>[] suiteClasses) throws InitializationError {
        super(klass, suiteClasses);
    }

    public StopOnFailureSuite(Class<?> klass) throws InitializationError {
        super(klass, klass.getAnnotation(SuiteClasses.class).value());
    }

    @Override
    public void run(RunNotifier runNotifier) {
        runNotifier.addListener(new FailureListener(runNotifier));
        super.run(runNotifier);
    }
}
Run Code Online (Sandbox Code Playgroud)

并运行您的套房:

@RunWith(StopOnFailureSuite.class)
@Suite.SuiteClasses({
    FirstTestClass.class,
    SecondTestClass.class,
    ...
})
Run Code Online (Sandbox Code Playgroud)


Hir*_*o2k 9

打电话System.exit()怎么了?

  • Re:一种更优雅的方式,我不相信JUnit提供了开箱即用的功能.它可以导致测试之间的耦合.理想情况下,您的测试应该彼此独立运行,不受其他故障的影响.如果你坚持,那么Hiro2k的建议是最好的. (5认同)

top*_*hef 5

如果是第一次测试,则考虑将其验证移至@BeforeClass并在失败时引发异常。如果出现此异常,则仅运行@AfterClass方法。

当然,这样一来,您将缺少在测试设置方法中创建的所有夹具工件。