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+ теперь также поддерживает параллельное выполнение теста. Просто используйте подходящую тему.
Примеры
Стандартная тема
Мокко тема
использование
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:"