我的项目结构如下所示。我想使用Gradle中的TestReport功能将所有测试结果聚合到一个目录中。 然后,我可以通过单个index.html文件访问所有子项目的所有测试结果。 我怎么能做到这一点?
.
|--ProjectA
|--src/test/...
|--build
|--reports
|--tests
|--index.html (testresults)
|--..
|--..
|--ProjectB
|--src/test/...
|--build
|--reports
|--tests
|--index.html (testresults)
|--..
|--..
答案 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(多模块报告部分))
将'android-reporting'插件添加到您的项目build.gradle。
apply plugin: 'android-reporting'
使用额外的'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