Jacoco 在 Android 项目中报告了单元测试对 Kotlin 类的 0 覆盖率

Car*_*men 4 junit android gradle jacoco kotlin

我正在使用 Android Gradle 插件 3.0.0。

我正在将一个 Android 应用程序从 java 迁移到 kotlin。我的应用程序包含 Java 和 Kotlin 类,测试使用 Java。

我跑./gradlew clean jacocoTestReport

这将运行单元测试 ( src/test) 和仪器测试 ( src/androidTest)。

jacoco in 生成的报告app/build/reports/jacoco/jacocoTestReport/html/index.html没有显示单元测试确实涵盖了 Kotlin 类的覆盖率。

该报告确实从仪器测试中正确显示了覆盖率。

注意:我遇到了这些其他问题,它们不是完全相同的问题:

我的应用程序模块的 build.gradle 的相关部分:

apply plugin: 'jacoco'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
...
android {
    defaultConfig {
        sourceSets {
            main.java.srcDirs += "$projectDir/src/main/kotlin"
        }
    }

    testOptions {
        unitTests {
            all {
                jvmArgs '-noverify', '-ea'
            }
            includeAndroidResources = true
        }
    }
}

dependencies {
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    ....
}

jacoco {
    toolVersion '0.7.9'
}

task jacocoTestReport(type: JacocoReport, dependsOn: ["testDebugUnitTest", "createDebugCoverageReport"]) {
    reports {
        html.enabled = true
    }
    classDirectories = fileTree(
            dir: "${buildDir}",
            includes: ["tmp/kotlin-classes/debug/ca/rmen/android/poetassistant/**/*.class",
                       "intermediates/classes/debug/ca/rmen/android/poetassistant/**/*.class"],
            excludes: ["**/R.class", "**/R*.class", "**/Manifest.class", "**/Manifest*.class", "**/BuildConfig.class",
                       // ignore databinding generated code:
                       "**/ca/rmen/android/poetassistant/databinding/*.class",
                       ... other excludes ...
                       "**/ca/rmen/android/poetassistant/BR.class",
                       "**/com/android/**/*.class"])
    sourceDirectories = files("${project.projectDir}/src/main/java", "${project.projectDir}/src/main/kotlin")
    executionData = fileTree(
            dir: "${buildDir}",
            includes: [
                    "jacoco/testDebugUnitTest.exec",
                    "outputs/code-coverage/connected/*coverage.ec"
            ])
}
Run Code Online (Sandbox Code Playgroud)

Car*_*men 5

我必须includeNoLocationClasses = true按如下方式添加到我的 gradle 文件中,以使 jacoco 报告反映单元测试对 Kotlin 类的覆盖:

android {
    testOptions {
        unitTests {
            all {
                jvmArgs '-noverify', '-ea'
                jacoco {
                    includeNoLocationClasses = true
                }
            }
            includeAndroidResources = true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:此解决方案适用于从命令行运行测试,但在从 Android Studio 内部使用覆盖率运行时,我仍然获得 0% 的覆盖率。