使用测试报告聚合gradle多项目测试结果

时间:2013-06-04 15:10:52

标签: build automated-tests gradle

我的项目结构如下所示。我想使用Gradle中的TestReport功能将所有测试结果聚合到一个目录中。 然后,我可以通过单个index.html文件访问所有子项目的所有测试结果。 我怎么能做到这一点?

.
|--ProjectA
  |--src/test/...
  |--build
    |--reports
      |--tests
        |--index.html (testresults)
        |--..
        |--..
|--ProjectB
    |--src/test/...
      |--build
        |--reports
          |--tests
            |--index.html (testresults)
            |--..
            |--..

5 个答案:

答案 0 :(得分:26)

来自Example 23.13. Creating a unit test report for subprojects中的Gradle User Guide

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
}

完整工作样本可在完整的Gradle分发中从samples/testing/testReport获得。

答案 1 :(得分:1)

对于'connectedAndroidTest',谷歌发布了一种方法。(https://developer.android.com/studio/test/command-line.html#RunTestsDevice多模块报告部分))

  1. 将'android-reporting'插件添加到您的项目build.gradle。

    apply plugin: 'android-reporting'

  2. 使用额外的'mergeAndroidReports'参数执行android测试。它会将项目模块的所有测试结果合并到一个报告中。

    ./gradlew connectedAndroidTest mergeAndroidReports

答案 2 :(得分:1)

除了上面https://stackoverflow.com/users/84889/peter-niederwieser建议的subprojects块和testReport任务之外,我还要在以下代码的下面再添加一行:

tasks('test').finalizedBy(testReport)

这样,如果您运行gradle test(甚至是gradle build),则testReport任务将在子项目测试完成后运行。请注意,您必须使用tasks('test')而不是test.finalizedBy(...),因为test任务在根项目中不存在。

答案 3 :(得分:0)

仅供参考,我已经在根项目subprojects文件中使用以下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

答案 4 :(得分:0)

如果使用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。来源How to generate an aggregated test report for all Gradle subprojects