gradle不能在同一测试任务中同时运行JUnit和TestNG测试。
所以我的想法是为TestNG创建第二个测试任务,将两个测试任务都配置为“ ignoreFailures true”,并有一个单独的任务为这两个任务生成单个测试报告。最后,测试监听器检查测试失败,并在需要时让构建失败。
不幸的是,当测试失败时,构建只会在第一次失败时出现。在第二次调用(“ gradlew构建”)时,该构建被错误地认为是成功的。我猜这是因为ignoreFailures使gradle认为测试任务总是成功的,并且由于没有输入或输出发生更改,因此它不会再次运行测试。
是否有一种方法可以告诉gradle在测试失败后继续执行,但是下次仍要重新运行任务?例如,以编程方式将任务标记为肮脏?
或者,换一种说法:我可以与“ --continue”命令行参数具有相同的效果,但是仅在构建设置中才有效,并且仅适用于特定任务吗?
还有其他解决方案吗?我可以为此使用/添加本地任务状态吗?
答案 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