Gradle возвращает код выхода как 0, хотя одна из его задач не удалась

#gradle #groovy

#gradle #groovy

Вопрос:

Предположим, что я запускаю задачи 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"
}```
  

Комментарии:

1. У вас есть простой файл сборки gradle, который воспроизводит это?

2. Обычно Gradle должен завершаться сбоем при любом сбое задачи. Некоторые задачи могут допускать сбои и продолжать сборку, если они настроены таким образом (например, задачи типа Test с использованием свойства ignoreFailures ). Задачи из сторонних плагинов или пользовательских задач могут регистрировать сбои, но никогда не выдавать исключение, таким образом, Gradle может подумать, что они успешно завершены.

3. @tim_yates Я добавил файл сборки gradle в основной вопрос

4. Да, я делаю это ignoreFailures как true. Я не хочу, чтобы тесты останавливались. в случае сбоя я хочу, чтобы он запустил дальнейшие тесты. Но мне нужен статус выхода как ненулевой, если одна из них завершается с ошибкой

Ответ №1:

Из обсуждения я понял, что 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 .