【问题标题】:Jacoco is reporting 0 coverage of Kotlin classes by unit tests, in an Android projectJacoco 在 Android 项目中通过单元测试报告 Kotlin 类的覆盖率为 0
【发布时间】:2018-05-10 00:11:38
【问题描述】:

我正在使用 Android Gradle 插件 3.0.0。

我正在将一个 Android 应用程序从 java 迁移到 kotlin。我的应用程序有 Java 和 Kotlin 的类,并且测试是用 Java 编写的。

我运行./gradlew clean jacocoTestReport

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

jacoco 在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"
            ])
}

【问题讨论】:

    标签: android gradle junit kotlin jacoco


    【解决方案1】:

    我必须将includeNoLocationClasses = true 添加到我的 gradle 文件中,如下所示,以使 jacoco 报告通过单元测试反映 Kotlin 类的覆盖率:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 2022-11-09
      相关资源
      最近更新 更多