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

标签 java eclipse ant junit junit4

我有几个使用我的 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/

相关文章:

java - nginx.conf中的 "location/logs"和 "location/logs/"有什么区别

Android:无法包含 facebook sdk 库项目

更改目标 sdk 时 Android 项目不运行

java - 在 build.properties 中找不到 key.store 和 key.alias 属性

java - Ant 构建与 Eclipse 不同

java - 如何使用Java的Optional而不带if条件来添加不同的逻辑

java - 基于多个参数的对象列表排序

java - 为什么这个嵌套的泛型转换会导致编译器错误

java - IntelliJ 调试器未在 Maven Java Google App Engine 项目中遇到断点(Eclipse 有效)

java - 使用 ANT 编译 groovy 脚本时不支持 Major.minor 版本 51.0