Выполнить задание Gradle после теста - PullRequest
0 голосов
/ 28 декабря 2018

После выполнения задачи test в Gradle build я хочу всегда выполнять дополнительную задачу, которая должна иметь доступ к результатам теста.Что-то вроде:

task('afterTest') {
    doLast {
        if (testSuccessful) {
            //
        } else {
            //
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

Как я уже говорил в другом потоке, лучше всего использовать файловую систему для передачи значений из одной задачи в другую.Таким образом, значение будет доступно, даже если тестовое задание было обновлено и пропущено.Например:

test {
    outputs.file "$buildDir/test.properties"
    ext.errorCount = 0
    afterTest {  desc ,  result  ->
        if (result.resultType.name() == "FAILURE") {
            errorCount++
        }
    }
    doLast {
        file("$buildDir/test.properties").text = "errorCount=$errorCount" 
    } 
    finalizedBy 'afterTest' 
    ignoreFailures = true
}
task afterTest {
    dependsOn 'test' 
    inputs.file "$buildDir/test.properties"
    doLast {
        def props = new Properties() 
        props.load(file("$buildDir/test.properties")) 
        def errorCount = Integer.parseInt(props['errorCount'])
        if (errorCount) {
           // doStuff
           throw new TaskExecutionException("$errorCount tests failed") 
        } 
    } 
} 
0 голосов
/ 29 декабря 2018

Ваш вопрос состоит из двух частей: 1) сделать пользовательское задание выполненным всегда после выполнения test задачи, 2) сделать «результат» теста доступным в этом пользовательском задании.

1) Сначалачасть очень проста, вам просто нужно использовать выделенный метод Task.finalizedBy, чтобы создать «окончательную» зависимость между задачей test и вашей пользовательской задачей.(см. Задачи финализатора )

2) Вторая часть немного сложна, поскольку, насколько я знаю, у Gradle нет простого способа получить «результат» (УСПЕХ)или НЕДОСТАТОК) задачи test.Но вы могли бы использовать API, предоставляемый Test Task , чтобы сохранить количество ошибочных тестов в переменной и проверить этот счетчик в своей пользовательской задаче: вот рабочий пример:

ext{
    // counter of test cases in error
    nbTestOnError = 0
}

test {
    // use "afterTest" hook to increment nbTestOnError   counter
    afterTest {  desc ,  result  ->
        if (result.getResultType().equals(TestResult.ResultType.FAILURE)){
            nbTestOnError++
        }
    }
}

task('afterTest') {
    doLast {
        // implement your logic depending on counter value
        if (nbTestOnError > 0) {
            // do something if test failed
        } else{
            // do something when all tests passed
        }
    }
}

// create "finalized by" dependency
test.finalizedBy afterTest

РЕДАКТИРОВАТЬ : на основе важного замечания в комментарии @ lance-java: для поддержки актуальной проверки вы можете настроить свою пользовательскую задачу так, чтобы она была "пропущена", еслиtest задание не выполнено.Простой способ - использовать функцию «Задача upToDateWhen» (см. здесь ):

task('afterTest') {
    // consider this task "UP TO DATE" if `test` task did not execute
    outputs.upToDateWhen {
        !test.didWork
    }
    doLast {
    //...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...