Агрегирование результатов многопроектного теста 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}

плагин агрегации тестовых отчетов

Существует также альтернативный вариант для агрегирования тестов (начиная с 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 (разделмногомодульных отчетов))

  1. Добавьте плагин "android-reporting" в ваши проекты build.gradle.

    apply plugin: 'android-reporting'

  2. Выполните тесты 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
Другие вопросы по тегам