![](/img/trans.png)
[英]Global code coverage in multi-module Android project: merge code coverage reports (Unit & UI tests)
[英]Measuring tests coverage in multi-module and dynamic feature module Android project using Jacoco
我目前正在开发一个新的 Android 应用程序,我正在尝试使用模块化原则。
我的 android 项目由以下模块组成:
app
类型的应用com.android.application
com.android.library
类型的core
com.android.dynamic-feature
类型的home
我想为 CI(Azure 管道)生成一份统一的代码覆盖率报告,其中我可以看到单元测试的全局代码覆盖率和所有模块的检测测试。
我阅读了很多文章并尝试了几个自定义 jacoco gradle 插件,以生成这样的报告,但没有成功。
我终于写了以下jacoco.gradle
文件:
apply plugin: 'jacoco'
tasks.withType(Test) {
jacoco.includeNoLocationClasses = true
jacoco.excludes = ['jdk.internal.*']
}
project.afterEvaluate {
}
tasks.create(name: "createUnifiedCoverageReport", type: JacocoReport, dependsOn: [
':app:testInternalDebugUnitTest', ':app:createInternalDebugCoverageReport',
':home:testInternalDebugUnitTest', ':home:createInternalDebugCoverageReport',
':core:testDebugUnitTest', ':core:createDebugCoverageReport',
]) {
reports
{
html.enabled = true
xml.enabled = true
csv.enabled = false
}
def fileFilter = [
//some files to filter
]
classDirectories.setFrom(files([
//app
fileTree(dir: "$project.rootDir/app/build/tmp/kotlin-classes/internalDebug", excludes: fileFilter),
fileTree(dir: "$project.rootDir/app/build/intermediates/javac/internalDebug", excludes: fileFilter),
//home
fileTree(dir: "$project.rootDir/home/build/tmp/kotlin-classes/debug", excludes: fileFilter),
fileTree(dir: "$project.rootDir/home/build/intermediates/javac/debug", excludes: fileFilter),
//core
fileTree(dir: "$project.rootDir/core/build/tmp/kotlin-classes/debug", excludes: fileFilter),
fileTree(dir: "$project.rootDir/core/build/intermediates/javac/debug", excludes: fileFilter),
]))
def coverageSourceDirs = [
//app
"$project.rootDir/app/src/main/java",
"$project.rootDir/app/src/main/kotlin",
//home
"$project.rootDir/home/src/main/java",
"$project.rootDir/home/src/main/kotlin",
//core
"$project.rootDir/core/src/main/java",
"$project.rootDir/core/src/main/kotlin",
]
additionalSourceDirs.setFrom(files(coverageSourceDirs))
sourceDirectories.setFrom(files(coverageSourceDirs))
def uiAppTestsData = fileTree(dir: "${project.rootDir}/app/build/outputs/code_coverage/internalDebugAndroidTest/connected/", includes: ["**/*.ec"])
def uiHomeTestsData = fileTree(dir: "${project.rootDir}/home/build/outputs/code_coverage/internalDebugAndroidTest/connected/", includes: ["**/*.ec"])
def uiCoreTestsData = fileTree(dir: "${project.rootDir}/core/build/outputs/code_coverage/debugAndroidTest/connected/", includes: ["**/*.ec"])
executionData(files([
//app
uiAppTestsData,
"$project.rootDir/app/build/jacoco/testInternalDebugUnitTest.exec",
//home
uiHomeTestsData,
"$project.rootDir/home/build/jacoco/testInternalDebugUnitTest.exec",
//core
uiCoreTestsData,
"$project.rootDir/core/build/jacoco/testDebugUnitTest.exec",
]))
}
然后使用以下指令将此jacoco.gradle
应用于每个模块:
apply from: '../jacoco.gradle'
因此,为了创建统一的代码覆盖率报告,我使用了 gradle 任务createUnifiedCoverageReport
。
该任务创建一个统一的代码覆盖率报告,其中包含app
的类和core
模块。 但是此报告中缺少home
模块中的类。
所以我有几个问题:
谢谢您的帮助。
配置正常,但模块类的路径不正确。 风味信息丢失:
fileTree(dir: "$project.rootDir/home/build/tmp/kotlin-classes/internalDebug", excludes: fileFilter),
fileTree(dir: "$project.rootDir/home/build/intermediates/javac/internalDebug", excludes: fileFilter),
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.