EDIT4:Gradle 7.4 RC1 发行说明表明 gradle 现在可以为 JUnit 和 JaCoCo 生成单个报告文件。这将避免下面解释的脆弱配置。
您所要做的就是应用相关的插件
目前(7.4 RC1)的当前缺点是仅支持 HTML 报告。并且这些聚合任务与JVM 测试套件插件(但由插件自动添加java
)协同工作。
因此,请在下一个版本中关注此功能。
使用 Gradle 5.4.1(现在是 5.5.1),我能够在任何测试任务之后获得报告,目前我同时拥有test
和integrationTest
任务。
EDIT3:修复了仅执行一些测试任务时的潜在错误
- 不要
executionData
在doLast
/doFirst
块中配置,这是我的错误。有关更多信息,请查看此gradle github 票
- 添加了更谨慎的选择(同样不在
doLast
/doFirst
块中)
executionData { tasks.withType(Test).findAll { it.jacoco.destinationFile.exists() }*.jacoco.destinationFile }
EDIT2:解决方案是一样的,我只是调整了一下
- 要使用的报告目的地
jacoco.reportsDir
,
- executionData 现在需要
tasks.withType(Test)
而不是仅仅[test, integrationTest]
- 设置
executionData
是在doFirst
块中完成的,而不是doLast
编辑:查看文档后JacocoReport
,有一个变体JacocoReport:executionData直接接受 Gradle 任务。它之所以有效,是因为JaCoCo 插件JacocoTaskExtension
为所有类型的任务添加了扩展Test
。这样就不容易出错。
jacocoTestReport {
// The JaCoCo plugin adds a JacocoTaskExtension extension to all tasks of type Test.
// Use task state to include or not task execution data
// https://docs.gradle.org/current/javadoc/org/gradle/api/tasks/TaskState.html
// This declaration will be used as a closure, notice there no wrapping parenthesis
executionData tasks.withType(Test).findAll { it.state.executed }
// If the above instruction really don't work, there maybe some things that intervene in the process, in this case, you may be a bit more lucky with this instruction
// executionData { tasks.withType(Test).findAll { it.jacoco.destinationFile.exists() }*.jacoco.destinationFile }
reports {
xml.enabled true
xml.destination(file("${jacoco.reportsDir}/all-tests/jacocoAllTestReport.xml"))
html.enabled true
html.destination(file("${jacoco.reportsDir}/all-tests/html"))
}
}
同样的技巧也可以应用于sonarqube
task :
sonarqube {
group = "verification"
properties {
// https://jira.sonarsource.com/browse/MMF-1651
property "sonar.coverage.jacoco.xmlReportPaths", jacocoTestReport.reports.xml.destination
properties["sonar.junit.reportPaths"] += integrationTest.reports.junitXml.destination
properties["sonar.tests"] += sourceSets.integrationTest.allSource.srcDirs
// ... other properties
}
}
较旧但非常有效的答案。同样使用上述知识(Test
任务由 扩展JacocoTaskExtension
),可以替换by和的手动file
配置。executionData
test.jacoco.destinationFile
integrationTest.jacoco.destinationFile
// Without it, the only data is the binary data,
// but I need the XML and HTML report after any test task
tasks.withType(Test) {
finalizedBy jacocoTestReport
}
// Configure the report to look for executionData generated during the test and integrationTest task
jacocoTestReport {
executionData(file("${project.buildDir}/jacoco/test.exec"),
file("${project.buildDir}/jacoco/integrationTest.exec"))
reports {
// for sonarqube
xml.enabled true
xml.destination(file("${project.buildDir}/reports/jacoco/all-tests/jacocoAllTestReport.xml"))
// for devs
html.enabled true
html.destination file("${project.buildDir}/reports/jacoco/all-tests/html")
}
}
sonarqube {
group = "verification"
properties {
// https://jira.sonarsource.com/browse/MMF-1651
property "sonar.coverage.jacoco.xmlReportPaths", ${project.buildDir}/test-results/integrationTest"
properties["sonar.junit.reportPaths"] += "${project.buildDir}/test-results/integrationTest"
properties["sonar.tests"] += sourceSets.integrationTest.allSource.srcDirs
// ... other properties
}
}
project.tasks["sonarqube"].dependsOn "jacocoTestReport"