Jacoco 未显示 Android Studio 中 Robolectric 测试的覆盖范围

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

我面临一个问题,即使用 Robolectric 的单元测试没有显示 Jacoco 代码覆盖率结果。测试执行并成功通过,但 Jacoco 覆盖范围似乎忽略了使用 Robolectric 的文件。

环境:

  • Android Studio:长颈鹿 | 2022.3.1 补丁 1
  • Android Gradle 插件 (AGP):7.2.0
  • Gradle 版本:7.4.2
  • 机器人电动:4.10.3

项目级build.gradle:

buildscript {
    val agp_version by extra("7.2.0")
}
plugins {
    id("com.android.application") version "7.2.0" apply false
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false}

模块级build.gradle:

plugins {
    id("com.android.application")
    id("org.jetbrains.kotlin.android")
}

android {
    namespace = "com.example.jacocorobolelectric"
    compileSdk = 33

    defaultConfig {
        applicationId = "com.example.jacocorobolelectric"
        minSdk = 23
        targetSdk = 33
        versionCode = 1
        versionName = "1.0"
        testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            isMinifyEnabled = false
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

dependencies {
    implementation("androidx.core:core-ktx:1.9.0")
    implementation("androidx.appcompat:appcompat:1.6.1")
    implementation("com.google.android.material:material:1.9.0")
    testImplementation("junit:junit:4.13.2")
    testImplementation ("org.robolectric:robolectric:4.10.3")
}

我非常感谢任何解决此问题的见解或解决方案。

提前谢谢您!

android kotlin jacoco robolectric test-coverage
1个回答
0
投票

您面临的问题是同时使用 Robolectric 和 Jacoco 的 Android 开发人员中常见的问题。由于 Robolectric 操作字节码的方式,Jacoco 并不总是能够捕获开箱即用的 Robolectric 测试的覆盖范围。

以下是解决此问题的步骤:

  1. 应用 Jacoco 插件: 确保您已在模块级 build.gradle 中应用了 Jacoco 插件:
apply plugin: 'jacoco'

  1. Jacoco 的配置: 在模块级 build.gradle 中添加自定义 Jacoco 配置以指定 Jacoco 版本和其他相关设置:
jacoco {
    toolVersion = "0.8.7" // Update this to the latest available version
}

  1. 测试任务配置: 修改 testDebugUnitTest 任务以考虑 Jacoco 代码覆盖率的 Robolectric 类。在同一个模块级别的build.gradle中:
tasks.withType(Test) {
    jacoco.includeNoLocationClasses = true
}
  1. 机器人电动配置: 将这些 JVM 参数添加到您的 Robolectric 测试中,以确保 Jacoco 考虑它们:
testOptions {
    unitTests {
        includeAndroidResources = true
        all {
            systemProperty 'jacoco-agent.destfile', 
                file("${project.buildDir}/jacoco/testDebugUnitTest.exec").absolutePath
        }
    }
}
  1. 合并执行数据: 生成覆盖率报告时,请确保合并所有生成的 .exec 文件。这将包括来自 Robolectric 测试和其他单元测试的数据。
  2. 更新Jacoco版本: 始终使用最新版本的 Jacoco。他们经常发布解决各种问题的更新。查看 Jacoco 官方发布页面以获取最新版本。

设置这些配置后,重新运行测试,然后生成 Jacoco 覆盖率报告。希望您能看到 Robolectric 测试的覆盖率数据。

如果您在进行这些更改后仍然遇到问题,请考虑检查 Jacoco 版本与您使用的 Robolectric 或 Android Gradle 插件版本之间是否存在任何特定的兼容性问题。

© www.soinside.com 2019 - 2024. All rights reserved.