Gradle jacoco覆盖报告有多个子模块?

有没有人知道如何为包含多个gradle子模块的codecoverage的java jacoco报告配置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”并生成一个codecoverage报告,该报告不包含像Core.java这样的corelib类的codecoverage

结果应该包括Ext.java和Core.java的代码库

我已经读过了

  • https://docs.gradle.org/current/userguide/jacoco_plugin.html
  • 并使用Gradle过滤JaCoCo报告

但没有发现任何线索

这是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我要求mulit-submodule支持https://github.com/paveldudka/JacocoEverywhere/issues/16

[更新2016-08-01]我找到了一个基于https://github.com/palantir/gradle-jacoco-coverage的工作解决方案

请看下面我自己的答案

最后我找到了这个插件: 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 } } } } 

这将合并来自所有项目的所有executionData,这些项目在测试期间将某个项目用作依赖项。

您需要创建一个JacocoMerge类型的新任务,该任务聚合来自所有子项目的JaCoCo报告。 请参阅本文中的类似讨论。