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

2024-03-20

假设我运行 gradle 任务如下:
./gradlew cleanTest task1 task2 --info --rerun-task
在这里,如果任务 1 失败而任务 2 通过,则此运行的退出代码仍然为 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"
}```

从讨论中我了解到ignoreFailures and 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.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

尽管其中一项任务失败,Gradle 返回退出代码为 0 的相关文章

随机推荐