#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
.