Gradle返回退出代码为0,尽管其任务之一失败

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

假设我运行gradle任务,如下所示: ./gradlew cleanTest task1 task2-信息-重新运行任务 在这里,如果task1失败且task2通过,则此运行的退出代码仍然为0。如果任何任务失败,我希望它返回非零

这些是添加到我的build.gradle文件中的任务

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生成文件是的,我正在这样做,忽略失败为真。我不想让考试停止。如果失败,我希望它运行进一步的测试。但如果其中一个失败,我需要退出状态为非零