【问题标题】:Android - Jacoco code coverage ignores Robolectric testsAndroid - Jacoco 代码覆盖忽略 Robolectric 测试
【发布时间】:2016-06-25 17:55:58
【问题描述】:

尝试使用 Jacoco 在 Android 中获取我的 Robolectric 测试的代码覆盖率,但它在创建报告时拒绝承认我的 Robolectric 测试。

我的 jacoco.gradle 文件如下:

apply plugin: 'jacoco'

jacoco {
    toolVersion = "0.7.6.201602180812"
}

project.afterEvaluate {

    android.applicationVariants.all { variant ->
        def name = variant.name
        def testTaskName = "test${name.capitalize()}UnitTest"

        tasks.create(name: "${testTaskName}Coverage", type: JacocoReport, dependsOn: "$testTaskName") {
            group = "Reporting"
            description = "Generate Jacoco coverage reports for the ${name.capitalize()} build."

            classDirectories = fileTree(
                    dir: "${project.buildDir}/intermediates/classes/${name}",
                    excludes: ['**/R.class',
                               '**/R$*.class',
                               '**/*$ViewInjector*.*',
                               '**/*$ViewBinder*.*',
                               '**/BuildConfig.*',
                               '**/Manifest*.*']
            )

            sourceDirectories = files(['src/main/java'].plus(android.sourceSets[name].java.srcDirs))
            executionData = files("${project.buildDir}/jacoco/${testTaskName}.exec")

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

通过此设置,我可以获得覆盖率报告,但尽管在“src/test/java”中进行了 Robolectric 测试,但我得到了 0% 的覆盖率。

如果我在该文件中添加以下代码:

android {
    testOptions {
        unitTests.all {
            jacoco {
                includeNoLocationClasses = true
            }
        }
    }
}

Gradle 尝试同步时出现以下错误:

错误:没有这样的属性:类的 includeNoLocationClasses: org.gradle.testing.jacoco.plugins.JacocoTaskExtension_Decorated

我知道我需要 Gradle 2.13 才能使用这个 includeNoLocationClasses 值,所以在 graddle-wrapper.properties 我有以下内容:

#Wed Apr 10 15:27:10 PDT 2013
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions-snapshots/gradle-2.13-20160228000026+0000-all.zip

我很确定我正在运行带有 Android 插件版本 1.5 的 Gradle 2.13

在我的应用程序 Gradle 文件中,我有以下内容:

//...

apply from: 'jacoco.gradle'

//..

testOptions {
    unitTests.returnDefaultValues = true
}

//...

debug {
    testCoverageEnabled true
}

我用来运行覆盖的命令是:

./gradlew createDebugCoverageReport

所以我想知道为什么尽管使用了正确的 Gradle 版本,但仍会收到 includeNoLocationClasses 错误?除此之外,也许我做错了什么,Jacoco 没有在 src/test.java 中进行 Robolectric 测试?

【问题讨论】:

  • 我注意到这段代码现在已被弃用(在 gradle-android-plugin 3.x 中): android { testOptions { unitTests.all { jacoco { includeNoLocationClasses = true } } } }
  • 唐纳,有点帮助。当我尝试执行您提到的配置时,我得到了。 “错误:无法为 org.gradle.api.Project 类型的根项目 'MyProject' 获取未知属性 'android'。” 知道为什么!
  • 对不起@CoDe 我不记得了,我为此工作的代码已被搁置。如果我记得,我会告诉你的。

标签: java android testing robolectric jacoco


【解决方案1】:

我没有完全看到你build.gradle,但要拥有那面旗帜,你必须:

  1. 使用 gradle 2.13+
  2. 使用 jacoco 0.7.6.201602180812

您确定您使用的是正确的 gradle 版本。所以,我认为,问题只在于使用了错误的 jacoco

提及 jacoco {toolVersion = "0.7.6.201602180812"} 不会影响 gradle DSL。您应该添加更新的 jacoco 插件:

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'org.jacoco:org.jacoco.core:...'
    }
}

你应该应用你已经在做的插件:

apply from: 'jacoco'

在这样的配置之后,你就不再需要jacoco {toolVersion = "..."}了。

注意:考虑更新到更新的 android gradle 插件,2.2.x 已经稳定。 jacoco也有更新的版本了0.7.7.201606060606

另一个注意事项:如果您在 Android Studio 中看到原始问题,请检查您是否默认使用 wrapper,并检查您是否将 wrapper 指向 gradle 2.13

【讨论】:

  • 谢谢,默认情况下我没有使用 Gradle 2.13 包装器,更改它删除了 Jacoco 错误,但是当我运行命令以获取测试覆盖率时,Jacoco 仍然没有接受我的 Robolectric 测试并且是尽管存在针对这些类的测试,但报告的覆盖率为 0%。
  • 您可以使用--debug--info 运行它吗?如果找不到 exec 文件,它可能会跳过。所以仔细检查你的路径
  • 当我将 --info 添加到命令中时,我看到了这个 - 执行任务 ':app:connectedDebugAndroidTest'(最新检查耗时 0.0 秒),原因是:任务未声明任何输出.没有找到测试,无事可做。但我认为“连接”意味着它正在寻找 androidTest 进行仪器测试?我还没有这些,只有 app/src/test/java 中的 Robolectric 单元测试,每个测试都是用我的 TestRunner 运行的,它扩展了 RobolectricGradleTestRunner 并且每个测试都用 @Test 注释 - 一定有一些原因 Jacoco 没有拿起测试?
  • 你能运行./gradlew tasks 看看你到底有什么任务吗?此外,您致电createDebugCoverageReport(至少来自问题),但是,您的覆盖任务名为test${variantname}Coverage
  • 好尴尬!我将两个教程混合在一起,完全专注于使用 createDebugCoverageReport 推荐的一个教程,忘记了我正在创建变体任务,它现在正在工作,非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-02-14
  • 1970-01-01
  • 1970-01-01
  • 2021-07-29
  • 2020-01-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多