首页 > 解决方案 > 尽管其中一项任务失败,Gradle 将退出代码返回为 0

问题描述

假设我按以下方式运行 gradle 任务:
./gradlew cleanTest task1 task2 --info --rerun-task
如果 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"
}```

标签: gradlegroovy

解决方案


从讨论中我了解到ignoreFailuresfailFast测试任务不符合您的要求,对吧?我可以看到一个用例,您希望确保两个测试任务都实际执行,即使第一个任务测试失败,但同时您希望构建在测试用例失败时最终失败在任何测试任务中。

首先,您可能要考虑这一点。通常,目的是通过尽快失败和中止构建来节省服务器(或本地)上的执行时间。

但是,如果您真的想构建满足您的要求的东西,您已经提供了所有详细信息:您可以添加一个项目变量来存储测试结果并创建一个额外的任务来检查该属性,如果有则失败失败的测试。

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.


推荐阅读