我有几个使用我的 build.xml 运行的 Junit 测试。我希望那些失败的测试在下次构建我的项目时应该被忽略。我知道 @ignore 表示法,但如何动态实现它?
示例:我使用 ant 1.9.3 构建项目,在 100 次测试中,有 4 次失败。我的 build.xml 的配置使其将运行所有测试,即haltonfailure = false。现在我希望下次构建时,所有上次失败的测试都应该被忽略。
最佳答案
这是一个很常见的问题 ( "Conditionally ignoring tests in JUnit 4" ),JUnit 创建了一个 Assume类,它与 Assert 类似,但会导致 AsclusionFailedException,JUnit 将其视为忽略测试。但是,对于您的情况,您可能希望有条件地忽略大量测试或测试用例。
首先,您需要某种持久性和设置控制。很高兴在第二次运行时忽略测试,但是它们会在第三次运行时重新包含吗?还是会永久忽略它们,直到您手动重置它们?如何重置它们?
现在,至于直接忽略测试:您可以创建一个自定义 Rule ,它装饰 Statement并且还收到 Description包含方法名称等。(您可以将 Statement 视为 Runnable,它通常代表单个测试方法及其修饰。)触发 AssumptionViolatedException in Rule 可能会简单地带您到达您需要去的地方,但是您需要找出其他方法来识别正在运行哪个测试。
您可能想创建一个自定义的 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);
}
}
...这是可重写的,并委托(delegate)给 runLeaf
in ParentRunner 。将该方法替换为检查您的存储以有条件地忽略测试的方法,您可能已经准备好了。但请记住,runLeaf
是最终的,如果您想在测试失败时更新存储,则需要调用其他函数。
关于java - 如何以编程方式忽略多个失败的junit测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22870664/