结合androidTest的jacoco覆盖并测试

时间:2015-03-09 19:01:44

标签: android unit-testing gradle code-coverage jacoco

'com.android.tools.build:gradle:1.1.0'发布以来,我将大部分java测试代码从androidTest移动到test文件夹,因为JVM测试速度要快得多。但我不能移动所有测试。我真的需要设备测试,因为有些ContentProvider的东西。

在开始迁移之前,我已经有100%的代码覆盖率。当我正在运行jacoco代码覆盖时,androidTest文件夹获得40%,test文件夹获得71%。我的代码经过100%测试,但我没有证据证明这一点。

有没有办法合并两份报告?我发现JacocoMerge但无法让它发挥作用。

以下是androidTest文件夹的输出:build/outputs/reports/coverage/debug/index.html

这里是test文件夹的输出 build/reports/jacoco/generateJacocoTestReports/html/index.html 使用此gradle任务生成:

def coverageSourceDirs = [
        '../library/src/main/java'
]

task generateJacocoTestReports(type: JacocoReport, dependsOn: "test") {
    group = "Reporting"
    description = 'Generate Jacoco Robolectric unit test coverage reports'

    classDirectories = fileTree(
            dir: '../library/build/intermediates/classes/debug',
            excludes: ['**//*R.class',
                       '**//*R$*.class',
                       '***/*//*$ViewInjector*.*',
                       '**//*BuildConfig.*',
                       '**//*Manifest*.*']
            )
    sourceDirectories = files(coverageSourceDirs)
    additionalSourceDirs = files(coverageSourceDirs)
    executionData = files('../library/build/jacoco/testDebug.exec')
}

4 个答案:

答案 0 :(得分:6)

不确定您是否仍然需要此功能,但我最近发布了Gradle插件,可能会对您有所帮助:https://github.com/paveldudka/JacocoEverywhere

答案 1 :(得分:1)

还有gradle插件https://github.com/palantir/gradle-jacoco-coverage,根据文档也可以完成这项工作。

我没有尝试过一个带有两个不同测试部件的子模块,但它适用于将两个子模块的测试部件合并。

有关详细信息,请参阅Gradle jacoco coverage report with more than one submodule(s)?

答案 2 :(得分:0)

如果您将Jenkins与JaCoCo插件一起使用,您只需在“执行文件路径”中配置所有jacoco.exec和emma.ec文件,即可报告组合覆盖率。

默认情况下,

connectedAndroidTest会在“输出”中的某处产生emma.ec文件。

答案 3 :(得分:0)

JacocoMerge 任务可用于合并两个或更多jacoco执行数据。

可以将以下任务添加到根gradle文件中,并且在成功执行此任务时,可以在根构建目录下找到合并的执行数据。 (的建立/ jacoco / mergeJacocoReport.exec

evaluationDependsOnChildren()
//Missing this might be a problem in fetching JacocoReport tasks from sub-modules.

 task mergeJacocoReport(type: org.gradle.testing.jacoco.tasks.JacocoMerge) {
    group "Jacoco Report"
    description "Merge Jacoco Code Coverage Report"

    def executionFiles = fileTree("$rootProject.rootDir", {
        includes = ['**/*.exec']
    })

    setExecutionData(executionFiles)

}

subprojects.each { $project ->
    def tasks = $project.tasks.withType(JacocoReport)

    if (tasks != null) {
        mergeJacocoReport.dependsOn << tasks
    }
}