Агрегирование результатов многопроектного теста Gradle с использованием TestReport
У меня есть структура проекта, которая выглядит следующим образом. Я хочу использовать функциональность TestReport в Gradle, чтобы объединить все результаты теста в один каталог. Затем я могу получить доступ ко всем результатам теста через один файл index.html для ВСЕХ подпроектов. Как я могу сделать это?
.
|--ProjectA
|--src/test/...
|--build
|--reports
|--tests
|--index.html (testresults)
|--..
|--..
|--ProjectB
|--src/test/...
|--build
|--reports
|--tests
|--index.html (testresults)
|--..
|--..
6 ответов
Из примера 23.13. Создание отчета о модульных испытаниях для подпроектов в Руководстве пользователя Gradle:
subprojects {
apply plugin: 'java'
// Disable the test report for the individual test task
test {
reports.html.enabled = false
}
}
task testReport(type: TestReport) {
destinationDir = file("$buildDir/reports/allTests")
// Include the results from the `test` task in all subprojects
reportOn subprojects*.test
}
Полностью рабочий образец доступен с samples/testing/testReport
в полном распределении Gradle.
В добавок к subprojects
блок и testReport
задача, предложенная Peter Niederwieser выше, я бы добавил еще одну строку в сборку ниже этих:
tasks('test').finalizedBy(testReport)
Таким образом, если вы бежите gradle test
(или даже gradle build
), testReport
задача будет запущена после завершения тестов подпроекта. Обратите внимание, что вы должны использоватьtasks('test')
а не просто test.finalizedBy(...)
поскольку test
задача не существует в корневом проекте.
Я отправляю обновленный ответ на эту тему. Я использую Gradle 7.5.1.
Задача TestReport
Короче говоря, я использую следующий скрипт для настройки подпроектов формы агрегации тестов (на основе ответа @Peter):
subprojects {
apply plugin: 'java'
}
task testReport(type: TestReport) {
destinationDir = file("$buildDir/reports/allTests")
// Include the results from the `test` task in all subprojects
testResults.from = subprojects*.test
}
Обратите внимание, чтоreportOn
метод "устарел" или скоро будет заменен на , в то же времяtestResults
по состоянию на 7.5.1 все еще инкубируется. Я получил следующее предупреждение в IDE
The TestReport.reportOn(Object...) method has been deprecated. This is scheduled to be removed in Gradle 8.0.
Намекать:subproject*.test
пример звездообразной нотации в groovy, которая вызывает тестовую задачу в списке подпроектов. Равным образом было бы обращение кsubprojects.collect{it.test}
- TestReport#reportOn (документация API Gradle)
- TestReport#testResults (документация API Gradle)
- отчет о замене gradle 8 (Gradle Forum)
плагин агрегации тестовых отчетов
Существует также альтернативный вариант для агрегирования тестов (начиная с Gradle 7.4). Можно применитьtest-report-aggregation
плагин. Если ваши проекты уже применяютсяjava
плагин, это означает, что они будут поставляться с , все, что вам нужно сделать, это применить плагин.
plugins {
id 'test-report-aggregation'
}
Затем вы сможете вызывать отчеты о тестировании черезtestSuiteAggregateTestReport
задача. Лично не использовал плагин, но думаю, что имеет смысл использовать его, если у вас настроено несколько наборов тестов сjvm-test-suite
.
Пример проекта можно найти в https://github.com/gradle-samples/Aggregating-test-results-using-a-standalone-utility-project-Groovy .
При использовании kotlin Gradle DSL
val testReport = tasks.register<TestReport>("testReport") {
destinationDir = file("$buildDir/reports/tests/test")
reportOn(subprojects.map { it.tasks.findByPath("test") })
subprojects {
tasks.withType<Test> {
useJUnitPlatform()
finalizedBy(testReport)
ignoreFailures = true
testLogging {
events("passed", "skipped", "failed")
}
}
}
И выполнить
gradle testReport
. Источник Как сгенерировать агрегированный отчет о тестировании для всех подпроектов Gradle
Для 'connectedAndroidTest' есть подход, опубликованный Google.( https://developer.android.com/studio/test/command-line.html (разделмногомодульных отчетов))
Добавьте плагин "android-reporting" в ваши проекты build.gradle.
apply plugin: 'android-reporting'
Выполните тесты Android с дополнительным аргументом 'mergeAndroidReports'. Он объединит все результаты тестирования модулей проекта в один отчет.
./gradlew connectedAndroidTest mergeAndroidReports
К вашему сведению, я решил эту проблему, используя следующие subprojects
config в моем корневом проекте build.gradle
файл. Таким образом, никаких дополнительных задач не требуется.
Примечание: это помещает вывод каждого модуля в свой собственный reports/<module_name>
папка, поэтому сборки подпроектов не перезаписывают результаты друг друга.
subprojects {
// Combine all build results
java {
reporting.baseDir = "${rootProject.buildDir.path}/reports/${project.name}"
}
}
Для проекта Gradle по умолчанию это приведет к такой структуре папок, как
build/reports/module_a/tests/test/index.html
build/reports/module_b/tests/test/index.html
build/reports/module_c/tests/test/index.html