Gradle返回退出代码为0,尽管其任务之一失败
假设我运行gradle任务,如下所示: ./gradlew cleanTest task1 task2-信息-重新运行任务 在这里,如果task1失败且task2通过,则此运行的退出代码仍然为0。如果任何任务失败,我希望它返回非零 这些是添加到我的build.gradle文件中的任务Gradle返回退出代码为0,尽管其任务之一失败,gradle,groovy,Gradle,Groovy,假设我运行gradle任务,如下所示: ./gradlew cleanTest task1 task2-信息-重新运行任务 在这里,如果task1失败且task2通过,则此运行的退出代码仍然为0。如果任何任务失败,我希望它返回非零 这些是添加到我的build.gradle文件中的任务 task task1(type: Test) { maxParallelForks = 1 ignoreFailures true testLogging { events
task task1(type: Test) {
maxParallelForks = 1
ignoreFailures true
testLogging {
events 'started', 'passed', 'skipped', 'failed'
exceptionFormat "full"
showStandardStreams = true
afterSuite { desc, result ->
if (!desc.parent) { // will match the outermost suite
println "RESULT: ${result.resultType} \n" +
"TOTAL TESTS: ${result.testCount}, " +
"SUCCESS: ${result.successfulTestCount}, " +
"FAILED: ${result.failedTestCount}, " +
"SKIPPED: ${result.skippedTestCount}"
finalResult = "${result.resultType}"
failedTest = "${result.failedTestCount}"
}
}
}
include "org/company/proj/test/Task1/Task1Test.class"
}
task task2(type: Test) {
maxParallelForks = 1
ignoreFailures true
testLogging {
events 'started', 'passed', 'skipped', 'failed'
exceptionFormat "full"
showStandardStreams = true
afterSuite { desc, result ->
if (!desc.parent) { // will match the outermost suite
println "RESULT: ${result.resultType} \n" +
"TOTAL TESTS: ${result.testCount}, " +
"SUCCESS: ${result.successfulTestCount}, " +
"FAILED: ${result.failedTestCount}, " +
"SKIPPED: ${result.skippedTestCount}"
finalResult = "${result.resultType}"
failedTest = "${result.failedTestCount}"
}
}
}
include "org/company/proj/test/Task2/Task2Test.class"
}```
从讨论中,我发现测试任务中的忽略失败和failFast不符合您的要求,对吗?我可以看到这样一个用例,您希望确保两个测试任务都被实际执行,即使第一个任务的测试失败,但同时您希望在任何测试任务中都有失败的测试用例时,构建最终失败 首先,你可能想考虑一下。通常,目的是通过尽快失败和中止构建来节省服务器上或本地的执行时间 但是,如果您真的想要构建满足您的需求的东西,那么您已经给出了所有细节:您可以添加一个项目变量来存储测试结果,并创建一个额外的任务来检查该属性,如果测试失败,该任务将失败
ext {
failedTests = false
}
task test1(type: Test) {
ignoreFailures true
afterSuite { desc, result ->
if (result.failedTestCount > 0) {
failedTests = true
}
}
}
task test2(type: Test) {
ignoreFailures true
afterSuite { desc, result ->
if (result.failedTestCount > 0) {
failedTests = true
}
}
}
task verifyTestResults() {
//dependsOn("test1", "test2") // static naming of test tasks
dependsOn tasks.withType(Test) // dynamically depend on all test tasks
doLast {
if(failedTests) {
throw new GradleException("There were failing tests!")
}
}
}
现在,您只需要调用gradlew verifyTestResults即可。从讨论中,我收集到测试任务的ignoreFailures和failFast不符合您的要求,对吗?我可以看到这样一个用例,您希望确保两个测试任务都被实际执行,即使第一个任务的测试失败,但同时您希望在任何测试任务中都有失败的测试用例时,构建最终失败 首先,你可能想考虑一下。通常,目的是通过尽快失败和中止构建来节省服务器上或本地的执行时间 但是,如果您真的想要构建满足您的需求的东西,那么您已经给出了所有细节:您可以添加一个项目变量来存储测试结果,并创建一个额外的任务来检查该属性,如果测试失败,该任务将失败
ext {
failedTests = false
}
task test1(type: Test) {
ignoreFailures true
afterSuite { desc, result ->
if (result.failedTestCount > 0) {
failedTests = true
}
}
}
task test2(type: Test) {
ignoreFailures true
afterSuite { desc, result ->
if (result.failedTestCount > 0) {
failedTests = true
}
}
}
task verifyTestResults() {
//dependsOn("test1", "test2") // static naming of test tasks
dependsOn tasks.withType(Test) // dynamically depend on all test tasks
doLast {
if(failedTests) {
throw new GradleException("There were failing tests!")
}
}
}
现在,您只需要调用gradlew verifyTestResults。您是否有一个简单的gradle生成文件来复制此结果?通常,gradle在任何任务失败时都会失败。如果以这种方式配置,某些任务可能会允许失败并继续生成,例如使用属性ignoreFailures的类型测试任务。来自第三方插件或自定义任务的任务可能会记录失败,但不会引发异常,这样Gradle可能会认为他们成功完成了。@tim_yates我在主要问题中添加了Gradle生成文件是的,我正在这样做,忽略失败为真。我不想让考试停止。如果失败,我希望它运行进一步的测试。但是如果其中一个失败,我需要退出状态为非零。你有一个简单的gradle构建文件来复制这个吗?通常,gradle应该在任何任务失败时失败。如果以这种方式配置,某些任务可能会允许失败并继续生成,例如使用属性ignoreFailures的类型测试任务。来自第三方插件或自定义任务的任务可能会记录失败,但不会引发异常,这样Gradle可能会认为他们成功完成了。@tim_yates我在主要问题中添加了Gradle生成文件是的,我正在这样做,忽略失败为真。我不想让考试停止。如果失败,我希望它运行进一步的测试。但如果其中一个失败,我需要退出状态为非零