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

Gradle 如何在任务运行后使其失败?Aka如何忽略失败,但在下一次运行时重复该任务?,gradle,Gradle,gradle不能在同一个测试任务中同时运行JUnit和TestNG测试 所以我的想法是为TestNG创建第二个测试任务,使用“ignoreFailures true”配置两个测试任务,并使用一个单独的任务为两个任务生成一个测试报告。最后,测试侦听器检查测试失败,并在需要时让构建失败 不幸的是,当测试失败时,构建只会在第一次失败。在第二次调用(gradlew build)时,错误地认为构建成功。我猜这是因为IGNORTER失败使得Gealle认为测试任务总是成功的,因为没有输入或输出改变,所以它不

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

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

不幸的是,当测试失败时,构建只会在第一次失败。在第二次调用(gradlew build)时,错误地认为构建成功。我猜这是因为IGNORTER失败使得Gealle认为测试任务总是成功的,因为没有输入或输出改变,所以它不会再次运行测试。 有没有办法告诉gradle在测试失败后继续,但下次仍然重新运行任务?例如,以编程方式将任务标记为脏任务

或者,换一种方式:我是否可以与“-continue”命令行参数具有相同的效果,但仅在构建设置中,并且仅针对特定任务

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

示例代码位于

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

想想这个

task a {
    finalizedBy 'b'
}
task b { ... }
当前(gradle 4.10.2)如果任务图中有“a”,则始终执行任务“b”,而不管“a”是最新的还是已经完成了工作。这与gradle文档相反,另请参见gradle论坛上的讨论:

如果您希望任务“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”任务当前都处于激活状态


完整的示例是在

我使用“finalizedBy”(而不是“ignoreFailures”和“dependsOn”)来链接“test”、“testNg”和“testReport”任务。请参见更新的代码注释/非常欢迎替代解决方案。使用“finalizedBy”以这种方式链接任务感觉有点奇怪。我已经看过了,似乎还可以。目前,还不知道是否可以做得更好或以不同的方式。