Android - Jacoco 无法正确生成 xml 报告(已解决)

Posted

技术标签:

【中文标题】Android - Jacoco 无法正确生成 xml 报告(已解决)【英文标题】:Android - Jacoco does not generate xml report properly(solved) 【发布时间】:2021-06-15 21:01:35 【问题描述】:

我们已将 JaCoCo 插件集成到我们的 android 项目中,以通过 SonarQube 测量代码覆盖率。但是,它无法测量。因为 SonarQube 期望覆盖报告为 XML 格式。我们在 build.gradle(module) 中添加了一个自定义的 jacocoTestReport 任务。它生成一个 xml 文件,但不包含任何覆盖信息。你遇到过这样的问题吗?如果有,有什么解决办法吗?

build.gradle(root)

classpath "org.jacoco:org.jacoco.core:0.8.5"

build.gradle(模块)

apply plugin: 'jacoco'




...




task jacocoTestReport(type: JacocoReport, dependsOn: ['testDebugUnitTest']) 
reports 
    xml.enabled = true
    html.enabled = true


def fileFilter = ['**/R.class',
                  '**/R$*.class',
                  '**/BuildConfig.*',
                  '**/Manifest*.*',
                  '**/*Test*.*',
                  'android/**/*.*']
def debugTree = fileTree(dir: "$buildDir/intermediates/classes/debug", excludes: fileFilter)
def mainSrc = "$project.projectDir/src/main/java"

getSourceDirectories().setFrom(files([mainSrc]))
getClassDirectories().setFrom(files([debugTree]))
getExecutionData().setFrom(fileTree(dir: "$buildDir", includes: [
        "jacoco/testDebugUnitTest.exec",
        "outputs/code-coverage/connected/*coverage.ec"
]))

输出:

【问题讨论】:

【参考方案1】:

你的 gradle 版本是什么? gradle 6.4+ 似乎有一些问题 https://github.com/gradle/gradle/issues/14132

【讨论】:

嗨@flavio-franco,我们的gradle版本是6.2.2 @tugcekolcu 我已经按照这些配置配置了 jacoco 和声纳 medium.com/wandera-engineering/… 我使用 gradle 6.3 没有问题。 嗨@flavio-franco,我已经解决了这个问题。目录的路径不正确。我刚刚添加了解决方案。谢谢你的兴趣。 :)【参考方案2】:

经过一番谷歌搜索,我终于解决了这个问题。源目录和类目录的路径不正确。正确的路径应该是这样的:

            def javaClasses = fileTree(dir: variant.javaCompileProvider.get().destinationDir,
                    excludes: fileFilter)
            def kotlinClasses = fileTree(dir: "$buildDir/tmp/kotlin-classes/$variantName",
                    excludes: fileFilter)

            classDirectories.setFrom(files([
                    javaClasses,
                    kotlinClasses
            ]))

            def variantSourceSets = variant.sourceSets.java.srcDirs.collect  it.path .flatten()
            sourceDirectories.setFrom(project.files(variantSourceSets))

问候,

【讨论】:

以上是关于Android - Jacoco 无法正确生成 xml 报告(已解决)的主要内容,如果未能解决你的问题,请参考以下文章

Android+jacoco实现代码覆盖率最正确的实现方式,没有之一!

Kotlin协程的Jacoco代码覆盖率不正确

在带有 Gradle 的 Android 项目中使用 JaCoCo

如何在 Maven 测试阶段生成 jacoco 报告

声纳 jacoco hybris

如何在 Java 应用程序中使用 JaCoCo 生成代码覆盖率报告?