Как выполнить задачу после ее запуска?Ака, как игнорировать сбои, но повторить задачу при следующем запуске? - PullRequest
0 голосов
/ 24 октября 2018

gradle не может запустить оба теста JUnit и TestNG в одной и той же тестовой задаче.

Поэтому я хотел создать вторую тестовую задачу для TestNG, сконфигурировать обе тестовые задачи с «ignoreFailures true» и создать отдельную задачу.который генерирует один тестовый отчет для обеих задач.Наконец, прослушиватель тестов проверяет ошибки теста и позволяет сбой сборки, если это необходимо.

К сожалению, в случае сбоя теста сборка завершится неудачей только в первый раз.При втором вызове («сборки gradlew») сборка ошибочно считается успешной.Я полагаю, это потому, что ignoreFailures заставляет gradle считать тестовое задание всегда успешным, и поскольку никакие входные или выходные данные не изменились, он не запускает тесты снова.

Есть ли способ сообщить gradle о продолжении после неудачных тестов,но все равно перезапустить задачу в следующий раз?Так, например, пометить задачу как грязную программно?

Или, другими словами: могу ли я иметь тот же эффект, что и аргумент командной строки "--continue", но прямо в настройке сборки и только для конкретных задач?

Есть еще идеи для решения?Могу ли я как-то использовать / добавить локальное состояние задачи для этого?

Пример кода на https://github.com/eekboom/gradle-dual-tests

1 Ответ

0 голосов
/ 28 октября 2018

Кажется, что на данный момент "finalizedBy" действительно единственный способ достичь этого:

Учитывайте это

task a {
    finalizedBy 'b'
}
task b { ... }

В настоящее время (этап 4.10.2) задача "b" всегда выполняетсяесли «а» находится в графе задач, независимо от того, является ли «а» современным или выполнившим работу.Это противоречит документации для начального уровня, см. Также обсуждение на форуме для начального уровня: finalizedBy задачи запускаются, даже если исходная задача UP-TO-DATE

Если вы хотите задачу "b"чтобы выполнить, только если «a» выполнило некоторую работу, вы должны сделать это явно, например, таким образом

task b {
    outputs.upToDateWhen { a.state.upToDate }
}

Другими словами, вы можете понимать «finalizedBy» не так, как «определяет задачу, которая завершается»работа, выполненная этой задачей "(соответствует предложению" finally "в Java), а скорее как способ перенастроить граф задачи" всегда запускать заданную задачу b, если эта задача также выполняется, и всегда запускать b после a ",(В отличие от этого «b.mustRunAfter a» только определяет порядок, но не запускает b, если b в любом случае не находится на графе задач.)

Так что для этого варианта использования выполняются тесты JUnit и TestNG иСоздав единый отчет о тестировании, вы можете сделать это:

// Configure the default task that runs JUnit
test {
   finalizedBy 'testNG'
}
// Create another test task that runs the TestNG tests
task testNg(type: Test) {
    useTestNG()
    finalizedBy 'testReport'
}
// Create a consolidated test report of both JUnit and TestNG tests
task testReport(type: TestReport) {
    // This does *not* work:
    //    reportOn test, testNg
    // I guess that's because the testNg task was only executed as part of the "finalizedBy" mechanism
    // (and not because of any "dependsOn"). So use "testResultDirs" instead:
    testResultDirs = files("$buildDir/test-results/test/binary", "$buildDir/test-results/testNg/binary")
}

Обратите внимание, что функция "finalizedBy" и задача "TestReport" в настоящее время инкубируют

Выполненопример на https://github.com/eekboom/gradle-dual-tests

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...