Android - Jacoco代码覆盖忽略了机器人电气测试



尝试使用Jacoco在Android上获得robolelectric测试的代码覆盖率,但在创建报告时它只是拒绝承认我的robolelectric测试。

我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"中进行了robolelectric测试,但我获得了0%的覆盖率。

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

android {
    testOptions {
        unitTests.all {
            jacoco {
                includeNoLocationClasses = true
            }
        }
    }
}
当Gradle尝试同步时,我得到以下错误:

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

我知道,我需要有Gradle 2.13使用这个inclenolocationclasses值所以在Gradle -wrapper。我有以下属性:

#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

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

在我的apps Gradle文件中,我有以下内容:

//...
apply from: 'jacoco.gradle'
//..
testOptions {
    unitTests.returnDefaultValues = true
}
//...
debug {
    testCoverageEnabled true
}

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

。/gradlew createDebugCoverageReport

所以我想知道为什么我得到inclenolocationclasses错误,尽管使用正确的Gradle版本?除此之外,也许我做错了什么,Jacoco没有在src/test.java中拾取robolelectric测试?

我没有完全看到你的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

最新更新