繁体   English   中英

Android-Jacoco代码覆盖率忽略了Robolectric测试

[英]Android - Jacoco code coverage ignores Robolectric tests

试图使用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尝试同步时,出现以下错误:

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

我知道我需要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
}

我用来运行coverage的命令是:

./gradlew createDebugCoverageReport

所以我想知道为什么尽管使用了正确的Gradle版本,但仍然出现includeNoLocationClasses错误? 除此之外,在Jacoco没有在src / test.java中进行Robolectric测试的情况下,我可能做错了什么?

我看不到您完全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中看到原始问题,请检查默认情况下是否使用包装器,并确保包装器指向gradle 2.13

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM