多模块Gradle项目Jacoco覆盖率未包含子模块问题求助
解决方案
问题根源
你之前的配置错误在于依赖了common模块的test任务,但所有测试都在app模块中执行,common模块没有运行测试,自然不会生成test.exec。实际上,对common模块代码的覆盖数据已经包含在app模块的test.exec中,只需要在报告中引入common的类和源码即可。
步骤1:全局启用Jacoco插件
在根项目的build.gradle.kts中配置,确保所有模块都应用Jacoco基础配置:
plugins { jacoco // 保留你项目原有的其他全局插件(如java、application等) } subprojects { apply(plugin = "jacoco") jacoco { toolVersion = "0.8.10" // 与Gradle 8.7兼容的稳定版本 } }
步骤2:调整app模块的Jacoco报告配置
修改app模块的build.gradle.kts,移除对common模块test任务的依赖,仅引用app的执行数据,并正确关联common的类和源码目录:
tasks.jacocoTestReport { val commonProject = project(":common") // 仅依赖app自身的test任务,因为所有测试都在这里执行 dependsOn(tasks.test) // 确保common模块的类已编译 dependsOn(commonProject.tasks.compileJava) // 配置需要统计覆盖率的类目录:包含app和common的主类 classDirectories.setFrom( files("$buildDir/classes/java/main"), files("${commonProject.buildDir}/classes/java/main") // 如果使用Kotlin,替换为:files("$buildDir/classes/kotlin/main") ) // 配置源码目录:包含app和common的主源码 sourceDirectories.setFrom( files("${projectDir}/src/main/java"), files("${commonProject.projectDir}/src/main/java") // Kotlin项目替换为:files("${projectDir}/src/main/kotlin") ) // 执行数据仅需app的test.exec,因为所有测试的覆盖数据都在这里 executionData.setFrom(files("$buildDir/jacoco/test.exec")) reports { xml.required.set(true) html.required.set(true) csv.required.set(false) } } // 可选:配置测试任务执行完成后自动生成报告 tasks.test { finalizedBy(tasks.jacocoTestReport) jacoco { enabled = true // 确保Jacoco在测试时收集数据 } }
步骤3:生成并查看报告
执行以下命令生成覆盖率报告:
./gradlew app:test app:jacocoTestReport
报告生成后,打开app/build/reports/jacoco/test/html/index.html即可查看包含common模块的完整覆盖率数据。
关键注意事项
- 如果你使用Kotlin编写代码,需要将类目录和源码目录中的
java替换为kotlin。 - 确保
common模块已正确编译,否则报告无法找到其类文件。 - Jacoco版本需与Gradle版本兼容,Gradle 8.x推荐使用0.8.10及以上版本。
内容的提问来源于stack exchange,提问作者dragogian
相关产品推荐
相关产品推荐

