Android 雅科科没有';不能使用机器人分子测试

Android 雅科科没有';不能使用机器人分子测试,android,code-coverage,robolectric,jacoco,Android,Code Coverage,Robolectric,Jacoco,我想在我的android项目中生成JUnit测试的代码覆盖率报告,所以我添加了JacocoGradle插件。这是我的项目级build.gradle文件: apply plugin: 'jacoco' buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.0.0-beta6' cl

我想在我的android项目中生成JUnit测试的代码覆盖率报告,所以我添加了JacocoGradle插件。这是我的项目级
build.gradle
文件:

apply plugin: 'jacoco'

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.0.0-beta6'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

allprojects {
    repositories {
        jcenter()
        maven { url "https://oss.sonatype.org/content/repositories/snapshots" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

subprojects { prj ->
    apply plugin: 'jacoco'

    jacoco {
        toolVersion '0.7.6.201602180812'
    }

    task jacocoReport(type: JacocoReport, dependsOn: 'testDebugUnitTest') {
        group = 'Reporting'
        description = 'Generate Jacoco coverage reports after running tests.'

        reports {
            xml {
                enabled = true
                destination "${prj.buildDir}/reports/jacoco/jacoco.xml"
            }
            html {
                enabled = true
                destination "${prj.buildDir}/reports/jacoco"
            }
        }

        classDirectories = fileTree(
                dir: 'build/intermediates/classes/debug',
                excludes: [
                        '**/R*.class',
                        '**/BuildConfig*',
                        '**/*$$*'
                ]
        )

        sourceDirectories = files('src/main/java')
        executionData = files('build/jacoco/testDebugUnitTest.exec')

        doFirst {
            files('build/intermediates/classes/debug').getFiles().each { file ->
                if (file.name.contains('$$')) {
                    file.renameTo(file.path.replace('$$', '$'))
                }
            }
        }
    }
}

jacoco {
    toolVersion '0.7.6.201602180812'
}

task jacocoFullReport(type: JacocoReport, group: 'Coverage reports') {
    group = 'Reporting'
    description = 'Generates an aggregate report from all subprojects'

    //noinspection GrUnresolvedAccess
    dependsOn(subprojects.jacocoReport)

    additionalSourceDirs = project.files(subprojects.jacocoReport.sourceDirectories)
    sourceDirectories = project.files(subprojects.jacocoReport.sourceDirectories)
    classDirectories = project.files(subprojects.jacocoReport.classDirectories)
    executionData = project.files(subprojects.jacocoReport.executionData)

    reports {
        xml {
            enabled = true
            destination "${buildDir}/reports/jacoco/full/jacoco.xml"
        }
        html {
            enabled = true
            destination "${buildDir}/reports/jacoco/full"
        }
    }

    doFirst {
        //noinspection GroovyAssignabilityCheck
        executionData = files(executionData.findAll { it.exists() })
    }
}
通过运行
/gradlew jacocoFullReport
,它工作得非常好。但不幸的是,对于使用
RobolectrictTestRunner
运行的测试,没有报告覆盖范围(测试中明显调用的指令没有报告为覆盖范围)。没有
@RunWith
注释的测试或使用
mockitojunitestrunner
报告覆盖率的测试都很好

如能帮助解决此问题,我们将不胜感激


更新1:我注意到我应该使用
RobolectricGradleTestRunner
。但它没有帮助。

这是一个已知的问题,可能的解决方法是-

或将jacoco版本降级至
0.7.1.201405082137

更新

不再需要解决方法。您必须使用gradle版本
2.13
jacoco版本
0.7.6.201602180812

更新root
build.gradle

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

task wrapper( type: Wrapper ) {
  gradleVersion = '2.13'
}
apply plugin: 'jacoco'

android {
  testOptions {
    unitTests.all {
      jacoco {
        includeNoLocationClasses = true
      }
    }
  }
}
运行
/gradlew包装器

更新项目
build.gradle

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

task wrapper( type: Wrapper ) {
  gradleVersion = '2.13'
}
apply plugin: 'jacoco'

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

我以前也遇到过同样的问题,但现在我通过这个链接解决了这个问题

问题链接:

此处提到了此问题的解决方案:


我也有同样的问题。我更改了jacoco插件版本并添加了includeLocationClasses属性。下面是正在工作的jacoco.gradle文件(我使用的是gradle包装器2.14.1):


公认的答案有点过时。下面是我们刚刚实现的类似修复。在模块(即应用程序)build.gradle中添加:

apply plugin: 'jacoco'

tasks.withType(Test) {
    jacoco.includeNoLocationClasses = true
}
这确实需要jacoco7.6+,但您可能已经在使用它了

演播室注意事项:

  • 这只修复了CLI。如果您使用JaCoCo从Studio运行覆盖,则仍然不会报告机器人分子覆盖。默认的IntelliJ Coverage Runner似乎工作正常
  • 除非我在Android JUnit->VM选项中添加-noverify,否则测试会在Studio中间歇性崩溃

  • 在android studio中将coverage runner更改为jacoco 1-选择应用程序(项目根目录) 2单击菜单(运行-->编辑配置-->代码覆盖率-->选择JaCoCo)


    我想说这是绝对可能的,但我不知道如何解决它。我曾在一份旧工作中为Robolectric工作过,但那是一年前的事了,我再也无法访问该代码了。对不起,我帮不了你了
    testCoverageEnabled
    在gradle的更高版本中使用Jacoco,您不需要应用插件。尝试不使用插件。@NikolaDespotoski我相信将testCoverageEnabled设置为true只适用于需要连接设备的android检测测试。这就是我试图通过使用Robolectric来避免的。不幸的是,这种解决方法似乎对我不起作用。在这种情况下,如果它对您来说不是主要的,那么将jacoco的版本降低到
    0.7.1.201405082137
    。如果您使用jenkins最新的jacoco插件,可能仍然存在问题。同时,将它的版本降级到
    1.8
    的某个版本,降级jacoco就成功了。我使用travis ci,它没有问题。在更新部分,不需要执行
    classpath'org.jacoco:org.jacoco.core:0.7.6.201602180812'
    ,因为这是
    apply plugin
    所做的。我不确定,但如果删除它,您将使用默认的jacoco插件,我不确定它是否最新。你试过了吗?尤金·马丁诺夫也提出了同样的建议。但这对我不起作用。这似乎是迄今为止最准确的答案。