如何以编程方式忽略多个失败的junit测试?

时间:2014-04-04 18:43:51

标签: java eclipse ant junit junit4

我有几个使用build.xml运行的Junit测试。我希望那些失败的测试,下次我们应该忽略它,我构建我的项目。我知道@ignore符号但是如何动态实现它?

示例:我使用ant 1.9.3构建我的项目,在100次测试中,4次失败。我的build.xml配置得如此,它将运行所有测试,即haltonfailure = false。现在我希望下次构建时,所有那些上次失败的测试都应该被忽略。

1 个答案:

答案 0 :(得分:1)

这是一个很常见的问题("Conditionally ignoring tests in JUnit 4"),JUnit创建了一个Assume类,它类似于Assert,但会导致一个AssumptionFailedException,JUnit将其视为一个被忽略的测试。但是,对于您的情况,您可能希望有条件地忽略大量测试或测试用例。

首先,您需要某种持久性和设置控制。很高兴忽略第二次运行时的测试,但是它们会被重新包含在第三次运行中,还是会被永久忽略,直到您手动重置它们为止?你如何重置它们?

现在,至于直接忽略测试:您可以创建一个自定义Rule,它会修饰Statement并收到包含方法名称等的Description。(您可以将一个Statement视为一个Runnable,通常代表一个单独的测试方法及其装饰。)在Rule中点燃AssumptionViolatedException可能会让你到达你需要去的地方,但是你需要找出其他一些确定正在运行哪个测试的方法。

您可能想要创建一个自定义Runner,它会为您提供FrameworkMethod,其中包含您可能需要识别测试的所有内容。在这种情况下,BlockJUnit4TestRunner是为子类设计的一个很好的起点,特别是在runChild方法中:

@Override
protected void runChild(final FrameworkMethod method, RunNotifier notifier) {
    Description description = describeChild(method);
    if (isIgnored(method)) {
        notifier.fireTestIgnored(description);
    } else {
        runLeaf(methodBlock(method), description, notifier);
    }
}

...可以覆盖,并委托给runLeaf in ParentRunner。将该方法替换为检查存储的方法以有条件地忽略测试,并且您可能已设置。但请记住,runLeaf是最终的,如果您想在测试失败时更新您的存储,则需要调用其他内容。