Jacoco 代码覆盖率报告显示覆盖率为 0%,但测试报告显示 Android App 的正确数据

问题描述 投票:0回答:0

我一直在使用 Jacoco 生成代码覆盖率报告,并且运行良好。我的项目包含使用 JUnit5 的单元测试。我正在使用“de.mannodermaus.android”插件在 JUnit5 中编写测试。

最近我更新了以下依赖项-

App的Build.gradle文件 -

apply from: '../jacoco-config.gradle' 
apply plugin: "de.mannodermaus.android-junit5"

androidTestImplementation "de.mannodermaus.junit5:android-test-core:1.3.0"
androidTestRuntimeOnly "de.mannodermaus.junit5:android-test-runner:1.3.0"
// (Required) Writing and executing Unit Tests on the JUnit Platform
testImplementation "org.junit.jupiter:junit-jupiter-api:5.8.2"
testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:5.8.2"

// (Optional) If you need "Parameterized Tests"
testImplementation "org.junit.jupiter:junit-jupiter-params:5.8.2"

// (Optional) If you also have JUnit 4-based tests
testRuntimeOnly "org.junit.vintage:junit-vintage-engine:5.8.2"

testImplementation "junit:junit:4.13.2"

项目级Build.gradle文件 -

 classpath "org.jacoco:org.jacoco.core:0.8.8"
   
 classpath "de.mannodermaus.gradle.plugins:android-junit5:1.8.2.1"

我已经创建了一个 gradle 文件来应用 Jacoco 的更改和设置。该文件包含以下主要内容。

jacoco-config.gradle

apply plugin: 'jacoco'

tasks.withType(Test) {
jacoco.includeNoLocationClasses = true
jacoco.excludes = ['jdk.internal.*']}

jacoco {
toolVersion = "0.8.8"
reportsDir = file("$buildDir/JacocoReport")}

android {
buildTypes {
    debug {
        testCoverageEnabled = true
    }
}
testOptions {
    animationsDisabled true
    unitTests {
        includeAndroidResources = true
        returnDefaultValues = true
    }
}
}
project.afterEvaluate {
project.gradle.taskGraph.whenReady {

    testDebugUnitTest {
        ignoreFailures true
    }
}

def androidExclusion = [
        '**/BR.*',
        '**/R.*',
        '**/R$*.*',
        '**/BuildConfig.*',
        '**/Manifest*.*',
        '**/databinding/*.*'
]

// Create coverage task ex: 'jacocoTestReport<Flavor>' depending on
task "jacocoTestReport"(type: JacocoReport, dependsOn: ['testDebugUnitTest']) {
    group = "Reporting"
    description = "Generate Jacoco coverage reports on the testDebugUnitTest build."

    def javaClasses = fileTree(
            dir: "${project.buildDir}/intermediates/javac/debug",
            excludes: androidExclusion)
    def kotlinClasses = fileTree(
            dir: "${project.buildDir}/tmp/kotlin-classes/debug",
            excludes: androidExclusion)
    classDirectories.from = files([ kotlinClasses , javaClasses])
    def coverageSourceDirs = ["src/main/java"]
    getAdditionalSourceDirs().setFrom(files(coverageSourceDirs))
    getSourceDirectories().setFrom(files(coverageSourceDirs))
    getExecutionData().setFrom(fileTree(dir: project.projectDir, includes: ["**/*.exec", "**/*.ec"]))

    reports {
        xml.required = true
        html.required = true
    }
}
}
  1. 运行 Jacoco gradle 任务时,代码覆盖率报告显示 0% 的覆盖率。

  2. 但是,测试结果报告是正确的,分别显示成功和失败测试。

我已经检查了 jacoco gradle 文件的源路径和目标路径是否正确。此外,Java 和 Kotlin 的类文件路径似乎是正确的。

我正在使用 gradle 插件版本 7.2.2distributionUrl 7.3.3

任何帮助表示赞赏。谢谢。

android kotlin unit-testing code-coverage jacoco
© www.soinside.com 2019 - 2024. All rights reserved.