JaCoCo 报告 0% 的代码覆盖率

JaCoCo reporting 0% code coverage

我正在尝试使用 jacoco 设置测试覆盖率,但到目前为止我一直没有成功。

在我的 build.gradle 我添加了:

apply plugin: 'jacoco'

(...)

buildTypes {
    debug {
        testCoverageEnabled true
    }

(...)

task jacocoTestReport(type: JacocoReport, dependsOn: "test<MyFlavor>DebugUnitTest") {
    group = "Reporting"
    description = "Generate Jacoco coverage reports"

    reports {
        xml.enabled = true
        html.enabled = true
    }

    def fileFilter = []
    def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/debug", excludes: fileFilter)
    def mainSrc = "${project.projectDir}/src/main/java"

    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    executionData = fileTree(dir: project.projectDir, includes:
            ['**/*.exec' , '**/*.ec'])
}

然后我运行JaCoCo测试报告代码如下:

./gradlew clean create<MyFlavor>DebugCoverageReport jacocoTestReport

我看到单元测试运行成功,但是当我打开测试报告时,位于:

<project>/build/reports/jacoco/jacocoTestReport/html/index.html

报告似乎是空的,因为覆盖率报告为 N/A,甚至没有显示项目包。

此外,如果我尝试在

打开覆盖文件
<project>/build/jacoco/test<MyFlavor>DebugUnitTest.exec

使用 Android Studio,所有 类 报告的覆盖率为 0.0%。

我正在使用 gradle 3.0.1

我做错了什么? 这跟口味的使用有关系吗?

我也在为 UnitTests 和 JaCoCo 苦苦挣扎。我通过使用不同的 plugin.

解决了我的问题

在你的根 build.gradle 添加:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.10.0'
    }
}

并在您的模块中应用插件 build.gradle:

apply plugin: 'com.vanniktech.android.junit.jacoco'

同步后您应该有新的 gradle 任务:

jacocoTestReport<<BuildVariant>>

我们设法找到了这个问题的解决方案。

似乎,当我们使用 gradle 风味时,我们必须在 classDirectories 行中添加风味。

这是我们当前的任务,并进行了更改:

task jacocoTestReport(type: JacocoReport, dependsOn: "test<MyFlavor>DebugUnitTest") {
    group = "Reporting"
    description = "Generate Jacoco coverage reports"

    reports {
        xml.enabled = true
        html.enabled = true
    }

    def fileFilter = []
    def debugTree = fileTree(dir: "${buildDir}/intermediates/classes/<MyFlavor>/", excludes: fileFilter)
    def mainSrc = "${project.projectDir}/src/main/java"

    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    executionData = fileTree(dir: project.projectDir, includes:
            ['**/*.exec' , '**/*.ec'])
}