任务运行后如何使其失败? Aka如何忽略失败,但在下次运行时重复执行任务?

时间:2018-10-24 07:35:02

标签: gradle

gradle不能在同一测试任务中同时运行JUnit和TestNG测试。

所以我的想法是为TestNG创建第二个测试任务,将两个测试任务都配置为“ ignoreFailures true”,并有一个单独的任务为这两个任务生成单个测试报告。最后,测试监听器检查测试失败,并在需要时让构建失败。

不幸的是,当测试失败时,构建只会在第一次失败时出现。在第二次调用(“ gradlew构建”)时,该构建被错误地认为是成功的。我猜这是因为ignoreFailures使gradle认为测试任务总是成功的,并且由于没有输入或输出发生更改,因此它不会再次运行测试。

是否有一种方法可以告诉gradle在测试失败后继续执行,但是下次仍要重新运行任务?例如,以编程方式将任务标记为肮脏?

或者,换一种说法:我可以与“ --continue”命令行参数具有相同的效果,但是仅在构建设置中才有效,并且仅适用于特定任务吗?

还有其他解决方案吗?我可以为此使用/添加本地任务状态吗?

示例代码位于https://github.com/eekboom/gradle-dual-tests

1 个答案:

答案 0 :(得分:0)

目前看来,“ finalizedBy”确实是实现这一目标的唯一方法:

考虑这个

task a {
    finalizedBy 'b'
}
task b { ... }

当前(等级4.10.2)如果任务图中有“ a”,则总是执行任务“ b”,而不管“ a”是最新的还是已完成的工作。这与gradle文档相反,另请参见gradle论坛上的讨论:finalizedBy tasks runs even though the original task is UP-TO-DATE

如果您希望任务“ b”仅在“ a”完成某些工作后才执行,则必须以这种方式使之明确

task b {
    outputs.upToDateWhen { a.state.upToDate }
}

换句话说,您可以理解“ finalizedBy”,而不仅仅是“指定一个完成该任务完成的工作的任务”(对应于Java中的“ finally”子句),而是一种重新配置任务图的方式“如果还运行此任务a,则始终运行指定的任务b,并始终在a之后运行b”。 (相反,“ b.mustRunAfter a”仅指定顺序,但如果b本身不在任务图上,则不会运行b。)

因此对于同时运行JUnit和TestNG测试并创建统一测试报告的这种用例,您基本上可以做到:

// Configure the default task that runs JUnit
test {
   finalizedBy 'testNG'
}
// Create another test task that runs the TestNG tests
task testNg(type: Test) {
    useTestNG()
    finalizedBy 'testReport'
}
// Create a consolidated test report of both JUnit and TestNG tests
task testReport(type: TestReport) {
    // This does *not* work:
    //    reportOn test, testNg
    // I guess that's because the testNg task was only executed as part of the "finalizedBy" mechanism
    // (and not because of any "dependsOn"). So use "testResultDirs" instead:
    testResultDirs = files("$buildDir/test-results/test/binary", "$buildDir/test-results/testNg/binary")
}

请注意,“ finalizedBy”功能和“ TestReport”任务当前均为incubating

完整示例位于https://github.com/eekboom/gradle-dual-tests