Gradle 包含多个子模块的 jacoco 覆盖率报告?
Gradle jacoco coverage report with more than one submodule(s)?
有谁知道如何为 java jacoco 报告配置 gradle 文件
包含多个 gradle 个子模块的代码覆盖率?
我目前的方法只显示当前子模块的代码覆盖率,但不显示
兄弟子模块的代码覆盖。
我有这个项目结构
- build.gradle (1)
- corelib/
- build.gradle (2)
- src/main/java/package/Core.java
- extlib/
- build.gradle (3)
- src/main/java/package/Ext.java
- src/test/java/package/Integrationtest.java
当我执行 gradlew :extlib:check :extlib:jacocoTestReport
junit-test "Integrationtest.java"
被执行并生成一个代码覆盖率报告,其中不包含 corelib 类 的代码覆盖率,例如 Core.java
结果应包括 Ext.java 和 Core.java
的代码覆盖
我已经阅读了
却没有发现任何线索
这里是 gradle 个文件的内容
// root build.gradle (1)
// Top-level build file where you can add configuration options
// common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
}
}
allprojects {
repositories {
jcenter()
}
}
// build.gradle (2) subproject build file for corelib.
apply plugin: 'java'
apply plugin: 'jacoco'
dependencies {
}
jacocoTestReport {
reports {
xml.enabled true
html.enabled true
}
}
// build.gradle (3) subproject build file for extlib.
apply plugin: 'java'
apply plugin: 'jacoco'
dependencies {
compile project(':corelib')
testCompile 'junit:junit:4.11'
// this does not compile
// jacocoTestReport project(':pixymeta-core-lib')
}
jacocoTestReport {
reports {
xml.enabled true
html.enabled true
}
}
// workaround because android-studio does not make the test resources available
// see https://code.google.com/p/android/issues/detail?id=64887#c13
task copyTestResources(type: Copy) {
from sourceSets.test.resources
into sourceSets.test.output.classesDir
}
processTestResources.dependsOn copyTestResources
[2016-08-01更新]
感谢@Benjamin Muschko 我也在根 gradle 文件中尝试过
// https://discuss.gradle.org/t/merge-jacoco-coverage-reports-for-multiproject-setups/12100/6
// https://docs.gradle.org/current/dsl/org.gradle.testing.jacoco.tasks.JacocoMerge.html
task jacocoMerge(type: JacocoMerge) {
subprojects.each { subproject ->
executionData subproject.tasks.withType(Test)
}
}
但收到错误消息(gradle-2.14)
* What went wrong:
Some problems were found with the configuration of task ':jacocoMerge'.
> No value has been specified for property 'jacocoClasspath'.
> No value has been specified for property 'executionData'.
> No value has been specified for property 'destinationFile'.
还有 gradle 插件 https://github.com/paveldudka/JacocoEverywhere where i have asked for mulit-submodule support https://github.com/paveldudka/JacocoEverywhere/issues/16
[更新 2016-08-01] 我找到了一个基于 https://github.com/palantir/gradle-jacoco-coverage
的可行解决方案
请参阅下面我自己的回答
您将需要创建类型为 JacocoMerge that aggregates the JaCoCo reports from all subprojects. See a similar discussion in this post 的新任务。
最后我找到了这个插件:https://github.com/palantir/gradle-jacoco-coverage 它为我完成了工作:
root gradle.build
buildscript {
repositories {
jcenter()
}
dependencies {
// see https://jcenter.bintray.com/com/android/tools/build/gradle/
classpath 'com.android.tools.build:gradle:2.1.0'
// classpath 'com.android.tools.build:gradle:2.2.0-alpha1'
// https://github.com/palantir/gradle-jacoco-coverage
classpath 'com.palantir:jacoco-coverage:0.4.0'
}
}
// https://github.com/palantir/gradle-jacoco-coverage
apply plugin: 'com.palantir.jacoco-full-report'
具有
的所有子项目
apply plugin: 'jacoco'
包含在报告中。
一种可能的解决方案(带有一些声纳特定部件):
def getJacocoMergeTask(Project proj){
def jmClosure = {
doFirst {
logger.info "${path} started"
executionData.each { ed ->
logger.info "${path} data: ${ed}"
}
}
onlyIf {
executionData != null && !executionData.isEmpty()
}
}
def jacocoMerge = null
if(!proj.tasks.findByName('jacocoMerge')){
jacocoMerge = proj.tasks.create('jacocoMerge', JacocoMerge.class)
jacocoMerge.configure jmClosure
// sonar specific part
proj.rootProject.tasks["sonarqube"].mustRunAfter jacocoMerge
proj.sonarqube {
properties {
property "sonar.jacoco.reportPaths", jacocoMerge.destinationFile.absolutePath
}
}
// end of sonar specific part
logger.info "${jacocoMerge.path} created"
} else {
jacocoMerge = proj.tasks["jacocoMerge"]
}
jacocoMerge
}
afterEvaluate { project ->
def jacocoMerge = getJacocoMergeTask(project)
project.tasks.withType(Test) { task ->
logger.info "${jacocoMerge.path} cfg: ${task.path}"
task.finalizedBy jacocoMerge
jacocoMerge.dependsOn task
task.doLast {
logger.info "${jacocoMerge.path} executionData ${task.path}"
jacocoMerge.executionData task
}
def cfg = configurations.getByName("${task.name}Runtime")
logger.info "${project.path} process config: ${cfg.name}"
cfg.getAllDependencies().withType(ProjectDependency.class).each { pd ->
def depProj = pd.dependencyProject
logger.info "${task.path} dependsOn ${depProj.path}"
def jm = getJacocoMergeTask(depProj)
task.finalizedBy jm
jm.dependsOn task
task.doLast {
logger.info "${jm.path} executionData ${task.path}"
jm.executionData task
}
}
}
}
这将合并来自所有项目的所有执行数据,这些项目在测试期间将某个项目用作依赖项。
您可以在没有合并 exec
文件的情况下创建合并报告。使用以下内容在 build.gradle
的根目录中创建一个新任务。
task jacocoReport(type: JacocoReport) {
for (p in allprojects) {
def testTask = p.tasks.findByName("test")
if (testTask != null)
dependsOn(testTask)
executionData.setFrom(file("${p.buildDir}/jacoco/test.exec"))
classDirectories.from(file("${p.buildDir}/classes/java/main"))
}
}
这对我有用
plugins {
id 'org.kordamp.gradle.jacoco' version '0.43.0'
}
config {
coverage {
jacoco {
enabled
aggregateExecFile
aggregateReportHtmlFile
aggregateReportXmlFile
additionalSourceDirs
additionalClassDirs
}
}
}
https://kordamp.org/kordamp-gradle-plugins/#_org_kordamp_gradle_jacoco
有谁知道如何为 java jacoco 报告配置 gradle 文件 包含多个 gradle 个子模块的代码覆盖率?
我目前的方法只显示当前子模块的代码覆盖率,但不显示 兄弟子模块的代码覆盖。
我有这个项目结构
- build.gradle (1)
- corelib/
- build.gradle (2)
- src/main/java/package/Core.java
- extlib/
- build.gradle (3)
- src/main/java/package/Ext.java
- src/test/java/package/Integrationtest.java
当我执行 gradlew :extlib:check :extlib:jacocoTestReport
junit-test "Integrationtest.java"
被执行并生成一个代码覆盖率报告,其中不包含 corelib 类 的代码覆盖率,例如 Core.java
结果应包括 Ext.java 和 Core.java
的代码覆盖我已经阅读了
却没有发现任何线索
这里是 gradle 个文件的内容
// root build.gradle (1)
// Top-level build file where you can add configuration options
// common to all sub-projects/modules.
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.1.0'
}
}
allprojects {
repositories {
jcenter()
}
}
// build.gradle (2) subproject build file for corelib.
apply plugin: 'java'
apply plugin: 'jacoco'
dependencies {
}
jacocoTestReport {
reports {
xml.enabled true
html.enabled true
}
}
// build.gradle (3) subproject build file for extlib.
apply plugin: 'java'
apply plugin: 'jacoco'
dependencies {
compile project(':corelib')
testCompile 'junit:junit:4.11'
// this does not compile
// jacocoTestReport project(':pixymeta-core-lib')
}
jacocoTestReport {
reports {
xml.enabled true
html.enabled true
}
}
// workaround because android-studio does not make the test resources available
// see https://code.google.com/p/android/issues/detail?id=64887#c13
task copyTestResources(type: Copy) {
from sourceSets.test.resources
into sourceSets.test.output.classesDir
}
processTestResources.dependsOn copyTestResources
[2016-08-01更新]
感谢@Benjamin Muschko 我也在根 gradle 文件中尝试过
// https://discuss.gradle.org/t/merge-jacoco-coverage-reports-for-multiproject-setups/12100/6
// https://docs.gradle.org/current/dsl/org.gradle.testing.jacoco.tasks.JacocoMerge.html
task jacocoMerge(type: JacocoMerge) {
subprojects.each { subproject ->
executionData subproject.tasks.withType(Test)
}
}
但收到错误消息(gradle-2.14)
* What went wrong:
Some problems were found with the configuration of task ':jacocoMerge'.
> No value has been specified for property 'jacocoClasspath'.
> No value has been specified for property 'executionData'.
> No value has been specified for property 'destinationFile'.
还有 gradle 插件 https://github.com/paveldudka/JacocoEverywhere where i have asked for mulit-submodule support https://github.com/paveldudka/JacocoEverywhere/issues/16
[更新 2016-08-01] 我找到了一个基于 https://github.com/palantir/gradle-jacoco-coverage
的可行解决方案请参阅下面我自己的回答
您将需要创建类型为 JacocoMerge that aggregates the JaCoCo reports from all subprojects. See a similar discussion in this post 的新任务。
最后我找到了这个插件:https://github.com/palantir/gradle-jacoco-coverage 它为我完成了工作:
root gradle.build
buildscript {
repositories {
jcenter()
}
dependencies {
// see https://jcenter.bintray.com/com/android/tools/build/gradle/
classpath 'com.android.tools.build:gradle:2.1.0'
// classpath 'com.android.tools.build:gradle:2.2.0-alpha1'
// https://github.com/palantir/gradle-jacoco-coverage
classpath 'com.palantir:jacoco-coverage:0.4.0'
}
}
// https://github.com/palantir/gradle-jacoco-coverage
apply plugin: 'com.palantir.jacoco-full-report'
具有
的所有子项目apply plugin: 'jacoco'
包含在报告中。
一种可能的解决方案(带有一些声纳特定部件):
def getJacocoMergeTask(Project proj){
def jmClosure = {
doFirst {
logger.info "${path} started"
executionData.each { ed ->
logger.info "${path} data: ${ed}"
}
}
onlyIf {
executionData != null && !executionData.isEmpty()
}
}
def jacocoMerge = null
if(!proj.tasks.findByName('jacocoMerge')){
jacocoMerge = proj.tasks.create('jacocoMerge', JacocoMerge.class)
jacocoMerge.configure jmClosure
// sonar specific part
proj.rootProject.tasks["sonarqube"].mustRunAfter jacocoMerge
proj.sonarqube {
properties {
property "sonar.jacoco.reportPaths", jacocoMerge.destinationFile.absolutePath
}
}
// end of sonar specific part
logger.info "${jacocoMerge.path} created"
} else {
jacocoMerge = proj.tasks["jacocoMerge"]
}
jacocoMerge
}
afterEvaluate { project ->
def jacocoMerge = getJacocoMergeTask(project)
project.tasks.withType(Test) { task ->
logger.info "${jacocoMerge.path} cfg: ${task.path}"
task.finalizedBy jacocoMerge
jacocoMerge.dependsOn task
task.doLast {
logger.info "${jacocoMerge.path} executionData ${task.path}"
jacocoMerge.executionData task
}
def cfg = configurations.getByName("${task.name}Runtime")
logger.info "${project.path} process config: ${cfg.name}"
cfg.getAllDependencies().withType(ProjectDependency.class).each { pd ->
def depProj = pd.dependencyProject
logger.info "${task.path} dependsOn ${depProj.path}"
def jm = getJacocoMergeTask(depProj)
task.finalizedBy jm
jm.dependsOn task
task.doLast {
logger.info "${jm.path} executionData ${task.path}"
jm.executionData task
}
}
}
}
这将合并来自所有项目的所有执行数据,这些项目在测试期间将某个项目用作依赖项。
您可以在没有合并 exec
文件的情况下创建合并报告。使用以下内容在 build.gradle
的根目录中创建一个新任务。
task jacocoReport(type: JacocoReport) {
for (p in allprojects) {
def testTask = p.tasks.findByName("test")
if (testTask != null)
dependsOn(testTask)
executionData.setFrom(file("${p.buildDir}/jacoco/test.exec"))
classDirectories.from(file("${p.buildDir}/classes/java/main"))
}
}
这对我有用
plugins {
id 'org.kordamp.gradle.jacoco' version '0.43.0'
}
config {
coverage {
jacoco {
enabled
aggregateExecFile
aggregateReportHtmlFile
aggregateReportXmlFile
additionalSourceDirs
additionalClassDirs
}
}
}
https://kordamp.org/kordamp-gradle-plugins/#_org_kordamp_gradle_jacoco