繁体   English   中英

使用 Jacoco 测量多模块和动态功能模块 Android 项目中的测试覆盖率

[英]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模块中的类。

所以我有几个问题:

  • 如何修改我的 Jacoco 配置以生成统一的代码覆盖率报告,其中包括 3 个模块的单元测试和仪器测试?
  • 是否可以使用“纯”jacoco gradle 插件来做到这一点,或者我应该使用更多面向 Android 的插件吗?

谢谢您的帮助。

配置正常,但模块类的路径不正确。 风味信息丢失:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM