Gradle: Как отобразить результаты тестирования в консоли в режиме реального времени?

Мне бы хотелось увидеть результаты теста (system.out/err, вести сообщения из тестируемых компонентов), поскольку они запускаются в той же самой консоли, в которой я запускаю:

gradle test

И не ждите, пока тесты не будут выполнены, чтобы просмотреть отчеты об испытаниях (которые генерируются только при завершении тестов, поэтому я не могу "хвост -f" что-либо во время выполнения тестов)

Ответ 1

Вы можете запустить Gradle с уровнем ведения журнала INFO в командной строке. Он покажет вам результат каждого теста во время работы. Недостатком является то, что вы также получите гораздо больше результатов для других задач.

gradle test -i

Ответ 2

Вы можете добавить закрытие Groovy внутри вашего файла build.gradle, который выполняет регистрацию для вас:

test {
    afterTest { desc, result -> 
        logger.quiet "Executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
    }
}

На вашей консоли он затем читается следующим образом:

:compileJava UP-TO-DATE
:compileGroovy
:processResources
:classes
:jar
:assemble
:compileTestJava
:compileTestGroovy
:processTestResources
:testClasses
:test
Executing test maturesShouldBeCharged11DollarsForDefaultMovie [movietickets.MovieTicketsTests] with result: SUCCESS
Executing test studentsShouldBeCharged8DollarsForDefaultMovie [movietickets.MovieTicketsTests] with result: SUCCESS
Executing test seniorsShouldBeCharged6DollarsForDefaultMovie [movietickets.MovieTicketsTests] with result: SUCCESS
Executing test childrenShouldBeCharged5DollarsAnd50CentForDefaultMovie [movietickets.MovieTicketsTests] with result: SUCCESS
:check
:build

Так как версия 1.1 Gradle поддерживает много больше параметров для регистрации тестового вывода. С этими параметрами вы можете получить аналогичный вывод со следующей конфигурацией:

test {
    testLogging {
        events "passed", "skipped", "failed"
    }
}

Ответ 3

Вот моя модная версия:

Приятный результат теста

import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent

tasks.withType(Test) {
    testLogging {
        // set options for log level LIFECYCLE
        events TestLogEvent.FAILED,
               TestLogEvent.PASSED,
               TestLogEvent.SKIPPED,
               TestLogEvent.STANDARD_OUT
        exceptionFormat TestExceptionFormat.FULL
        showExceptions true
        showCauses true
        showStackTraces true

        // set options for log level DEBUG and INFO
        debug {
            events TestLogEvent.STARTED,
                   TestLogEvent.FAILED,
                   TestLogEvent.PASSED,
                   TestLogEvent.SKIPPED,
                   TestLogEvent.STANDARD_ERROR,
                   TestLogEvent.STANDARD_OUT
            exceptionFormat TestExceptionFormat.FULL
        }
        info.events = debug.events
        info.exceptionFormat = debug.exceptionFormat

        afterSuite { desc, result ->
            if (!desc.parent) { // will match the outermost suite
                def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)"
                def startItem = '|  ', endItem = '  |'
                def repeatLength = startItem.length() + output.length() + endItem.length()
                println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength))
            }
        }
    }
}

Ответ 4

Как ответил stefanglase:

добавление следующего кода в ваш build.gradle (начиная с версии 1.1) отлично подходит для вывода на пройденных, пропущенных и неудачных тестах.

test {
    testLogging {
        events "passed", "skipped", "failed", "standardOut", "standardError"
    }
}

Что я хочу сказать дополнительно (я выяснил, что это проблема для стартеров) заключается в том, что команда gradle test выполняет тест только один раз за изменение.

Итак, если вы используете его , второй раз не будет выводиться результат теста. Вы также можете увидеть это в выводе здания: gradle затем говорит UP-TO-DATE в тестах. Таким образом, он не выполнен в n-й раз.

Смарт gradle!

Если вы хотите принудительно запустить тестовые примеры, используйте gradle cleanTest test.

Это немного не по теме, но я надеюсь, что это поможет некоторым новичкам.

изменить

Как sparc_spread, указанный в комментариях:

Если вы хотите заставить gradle всегда запускать свежие тесты (что может не всегда быть хорошей идеей), вы можете добавить outputs.upToDateWhen {false} в testLogging { [...] }. Продолжайте читать здесь.

Мир.

Ответ 5

Отказ от ответственности: я являюсь разработчиком плагина Gradle Test Logger.

Вы можете просто использовать Gradle Test Logger Plugin для печати красивых журналов на консоли. Плагин использует разумные значения по умолчанию, чтобы удовлетворить большинство пользователей с минимальной или нулевой конфигурацией, но также предлагает ряд тем и опций конфигурации на любой вкус.

Примечание. Плагин Gradle Test Logger v1. 4+ теперь также поддерживает параллельное выполнение теста. Просто используйте подходящую тему.

Примеры

Standard Theme Стандартная тема

Mocha Theme Мокко тема

использование

plugins {
    id 'com.adarshr.test-logger' version '<version>'
}

Убедитесь, что вы всегда получаете последнюю версию от Gradle Central.

конфигурация

Вам не нужно никаких настроек вообще. Тем не менее, плагин предлагает несколько вариантов. Это можно сделать следующим образом (показаны значения по умолчанию):

testlogger {
    // pick a theme - mocha, standard, plain, mocha-parallel, standard-parallel or plain-parallel
    theme 'standard'

    // set to false to disable detailed failure logs
    showExceptions true

    // set to false to hide stack traces
    showStackTraces true

    // set to true to remove any filtering applied to stack traces
    showFullStackTraces false

    // set to false to hide exception causes
    showCauses true

    // set threshold in milliseconds to highlight slow tests
    slowThreshold 2000

    // displays a breakdown of passes, failures and skips along with total duration
    showSummary true

    // set to true to see simple class names
    showSimpleNames false

    // set to false to hide passed tests
    showPassed true

    // set to false to hide skipped tests
    showSkipped true

    // set to false to hide failed tests
    showFailed true

    // enable to see standard out and error streams inline with the test results
    showStandardStreams false

    // set to false to hide passed standard out and error streams
    showPassedStandardStreams true

    // set to false to hide skipped standard out and error streams
    showSkippedStandardStreams true

    // set to false to hide failed standard out and error streams
    showFailedStandardStreams true
}

Я надеюсь, вам понравится его использовать.

Ответ 6

Добавьте это к build.gradle, чтобы остановить gradle от проглатывания stdout и stderr.

test {
    testLogging.showStandardStreams = true
}

Здесь описано .

Ответ 7

Задача

'test' не работает для Android-плагина, для плагина Android используйте следующее:

// Test Logging
tasks.withType(Test) {
    testLogging {
        events "started", "passed", "skipped", "failed"
    }
}

Смотрите следующее: fooobar.com/questions/50055/...

Ответ 8

В качестве продолжения Shubham отличный ответ Мне нравится предлагать использовать значения перечисления вместо строк. Пожалуйста, ознакомьтесь с документацией класса TestLogging.

import org.gradle.api.tasks.testing.logging.TestExceptionFormat
import org.gradle.api.tasks.testing.logging.TestLogEvent

tasks.withType(Test) {
    testLogging {
        events TestLogEvent.FAILED,
               TestLogEvent.PASSED,
               TestLogEvent.SKIPPED,
               TestLogEvent.STANDARD_ERROR,
               TestLogEvent.STANDARD_OUT
        exceptionFormat TestExceptionFormat.FULL
        showCauses true
        showExceptions true
        showStackTraces true
    }
}

Ответ 9

Моя любимая минималистичная версия, основанная на ответе Шубхам Чаудхари. enter image description here

Поместите это в файл build.gradle:

test {
    afterSuite { desc, result ->
    if (!desc.parent)
        println("${result.resultType} " +
            "(${result.testCount} tests, " +
            "${result.successfulTestCount} successes, " +
            "${result.failedTestCount} failures, " +
            "${result.skippedTestCount} skipped)")
    }
}

Ответ 10

В Gradle с помощью Android-плагина:

gradle.projectsEvaluated {
    tasks.withType(Test) { task ->
        task.afterTest { desc, result ->
            println "Executing test ${desc.name} [${desc.className}] with result: ${result.resultType}"
        }
    }
}

Тогда вывод будет:

Выполнение теста testConversionMinutes [org.example.app.test.DurationTest] с результатом: УСПЕХ

Ответ 11

Объединить отличный ответ Shubham и JJD использовать перечисление вместо строки

tasks.withType(Test) {
   testLogging {
       // set options for log level LIFECYCLE
       events TestLogEvent.PASSED,
            TestLogEvent.SKIPPED, TestLogEvent.FAILED, TestLogEvent.STANDARD_OUT
       showExceptions true
       exceptionFormat TestExceptionFormat.FULL
       showCauses true
       showStackTraces true

    // set options for log level DEBUG and INFO
       debug {
        events TestLogEvent.STARTED, TestLogEvent.PASSED, TestLogEvent.SKIPPED, TestLogEvent.FAILED, TestLogEvent.STANDARD_OUT, TestLogEvent.STANDARD_ERROR
        exceptionFormat TestExceptionFormat.FULL
       }
       info.events = debug.events
       info.exceptionFormat = debug.exceptionFormat

       afterSuite { desc, result ->
           if (!desc.parent) { // will match the outermost suite
               def output = "Results: ${result.resultType} (${result.testCount} tests, ${result.successfulTestCount} successes, ${result.failedTestCount} failures, ${result.skippedTestCount} skipped)"
               def startItem = '|  ', endItem = '  |'
               def repeatLength = startItem.length() + output.length() + endItem.length()
               println('\n' + ('-' * repeatLength) + '\n' + startItem + output + endItem + '\n' + ('-' * repeatLength))
           }
       }
   }
}

Ответ 12

Следуя ответу Бенджамина Мушко (19 марта 2011 г.), вы можете использовать флаг -i вместе с grep, чтобы отфильтровать тысячи нежелательных строк. Примеры:

Сильный фильтр - отображать только имя и результат каждого модульного теста, а также общее состояние сборки. Ошибки или исключения при настройке не отображаются.

./gradlew test -i | grep -E " > |BUILD"

Мягкий фильтр - отображает название и результат каждого модульного теста, а также ошибки/исключения при настройке. Но это также будет включать некоторую не относящуюся к делу информацию:

./gradlew test -i | grep -E -v "^Executing |^Creating |^Parsing |^Using |^Merging |^Download |^title=Compiling|^AAPT|^future=|^task=|:app:|V/InstrumentationResultParser:"

Мягкий фильтр, Альтернативный синтаксис: (токены поиска разбиты на отдельные строки)

./gradlew test -i | grep -v -e "^Executing " -e "^Creating " -e "^Parsing " -e "^Using " -e "^Merging " -e "^Download " -e "^title=Compiling" -e "^AAPT" -e "^future=" -e "^task=" -e ":app:" -e "V/InstrumentationResultParser:"

Объяснение того, как это работает: вывод первой команды ./gradlew test -i второй команде grep, которая отфильтровывает множество нежелательных строк на основе регулярного выражения. "-E" включает режим регулярного выражения, а "|" означает "или". Имя и результат модульного теста разрешается отображать с помощью " > ", а общий статус - с помощью "BUILD". В программном фильтре флаг "-v" означает "не содержит", а "^" означает "начало строки". Таким образом, он удаляет все строки, которые начинаются с "Выполнение" или начинаются с "Создание" и т.д.


Пример для тестовых модулей Android с Gradle 5.1:

./gradlew connectedDebugAndroidTest --continue -i | grep -v -e \
"^Transforming " -e "^Skipping " -e "^Cache " -e "^Performance " -e "^Creating " -e \
"^Parsing " -e "^file " -e "ddms: " -e ":app:" -e "V/InstrumentationResultParser:"

Пример охвата модульных испытаний Jacoco с Gradle 4.10:

./gradlew createDebugCoverageReport --continue -i | grep -E -v "^Executing |^Creating |^Parsing |^Using |^Merging |^Download |^title=Compiling|^AAPT|^future=|^task=|:app:|V/InstrumentationResultParser:"