Вопрос:

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

testing console gradle

83032 просмотра

12 ответа

17195 Репутация автора

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

gradle test

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

Автор: tolitius Источник Размещён: 18.10.2010 09:53

Ответы (12)


128 плюса

8469 Репутация автора

Вы можете добавить 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"
    }
}
Автор: stefanglase Размещён: 27.11.2010 04:56

121 плюса

23226 Репутация автора

Решение

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

gradle test -i
Автор: Benjamin Muschko Размещён: 19.03.2011 02:01

92 плюса

8957 Репутация автора

Как Стефанглаз ответил:

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

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

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

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

Умный градл!

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

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

редактировать

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

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

Мир.

Автор: Langusten Gustel Размещён: 03.12.2013 07:04

43 плюса

3775 Репутация автора

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

test {
    testLogging.showStandardStreams = true
}

Это задокументировано здесь .

Автор: Darwin Размещён: 21.01.2015 01:31

32 плюса

939 Репутация автора

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

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

Смотрите следующее: https://stackoverflow.com/a/31665341/3521637

Автор: user3521637 Размещён: 28.07.2015 09:21

7 плюса

1260 Репутация автора

В 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] с результатом: SUCCESS

Автор: radeklos Размещён: 08.09.2015 03:34

122 плюса

14160 Репутация автора

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

необычный результат теста

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))
            }
        }
    }
}
Автор: Shubham Chaudhary Размещён: 21.03.2016 12:00

17 плюса

25663 Репутация автора

В качестве продолжения великого ответа Шубхэма я хотел бы предложить использовать значения enum вместо строк . Пожалуйста, ознакомьтесь с документацией класса 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
    }
}
Автор: JJD Размещён: 24.03.2016 11:37

3 плюса

1976 Репутация автора

Слияние 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))
           }
       }
   }
}
Автор: odemolliens Размещён: 30.11.2016 12:50

7 плюса

5314 Репутация автора

Моя любимая минималистичная версия, основанная на ответе Шубхам Чаудхари. введите описание изображения здесь

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

test {
    afterSuite { desc, result ->
    if (!desc.parent)
        println("${result.resultType} " +
            "(${result.testCount} tests, " +
            "${result.successfulTestCount} successes, " +
            "${result.failedTestCount} failures, " +
            "${result.skippedTestCount} skipped)")
    }
}
Автор: Andrzej Rehmann Размещён: 31.05.2017 03:16

47 плюса

49115 Репутация автора

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

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

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

Примеры

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

Мокко Тема Мокко тема

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

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 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 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
}

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

Автор: adarshr Размещён: 02.10.2017 08:21

1 плюс

2100 Репутация автора

Следуя ответу Бенджамина Мушко (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:"

Пример с тестовыми инструментами Android:

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

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

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

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

Автор: Mr-IDE Размещён: 20.10.2018 10:59
Вопросы из категории :
32x32