首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用android plugin >= 1.1测试代码覆盖率

用android plugin >= 1.1测试代码覆盖率
EN

Stack Overflow用户
提问于 2015-02-18 15:10:12
回答 9查看 25.5K关注 0票数 41

最近,我开始在我的一个项目中集成android-gradle-plugin 1.1.0。该项目使用robolectric 2.4运行单元测试。

这是一个具有非常复杂依赖关系的多模块项目(有些模块依赖于其他模块)。就像这样:

代码语言:javascript
复制
--> application-module (dependsOn: module1, module2, module-core)
    --> module1 (dependsOn: module-core)
    --> module2 (dependsOn: module-core)
    --> module-core (dependsOn: module3, module4)
        --> module3 (library dependencies)
        --> module4 (library dependencies)

有关更清晰的图片,请参见贾科科-例子项目。

我试图集成JaCoCo来为单元测试生成报告,但在我看来,它只运行androidTests,这基本上是一种工具测试。

经过一些谷歌搜索之后,我在GitHub和其他文章上遇到了一些项目,但它们主要集中在android-gradle-plugin的早期版本上,或者正在使用其他第三方插件,比如android-unit-test 举个例子

也许我已经失去了谷歌的能力。但是,有人能为我指出一个方向吗?我可以找到一些关于android插件中的新东西的文档,以及如何只为单元测试运行jacoco任务?

更新

采用了来自尼尼克的例子的脚本

代码语言:javascript
复制
apply plugin: "jacoco"

configurations {
    jacocoReport
}

task jacocoReport(dependsOn: 'testDebug') << {
    ant {
        taskdef(name:'jacocoreport',
                classname: 'org.jacoco.ant.ReportTask',
                classpath: configurations.jacocoReport.asPath)

        mkdir dir: "${buildDir}/test-coverage-report"
        mkdir dir: "${buildDir}/reports/jacoco/test/"

        jacocoreport {
            executiondata = files("${buildDir}/jacoco/testDebug.exec")

            structure(name: "${rootProject.name}") {
                classfiles {
                    fileset (dir: "${buildDir}/intermediates/classes/debug") {
                        //exclude(name: '**/*_*.class')
                        exclude(name: '**/R.class')
                        exclude(name: '**/R$*.class')
                        exclude(name: '**/BuildConfig.class')
                    }
                }

                sourcefiles {
                    fileset dir: "src/main/java"
                    fileset dir: "${buildDir}/generated/source/buildConfig/debug"
                    fileset dir: "${buildDir}/generated/source/r/debug"
                }
            }

            xml destfile: "${buildDir}/reports/jacoco/test/jacocoTestReport.xml"
            html destdir: "${buildDir}/test-coverage-report/"
        }
    }
}

dependencies {
    jacocoReport 'org.jacoco:org.jacoco.ant:0.7.2.201409121644'
}

在此之后,./gradlew jacocoReport执行并生成报告,但它显示0(零)测试覆盖率,这是不可能的,因为所有类中至少有一半是经过测试的。

UPDATE_2

试用了这个示例。将下一个任务添加到我的一个gradle构建文件中:

代码语言:javascript
复制
task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
    group = "Reporting"
    description = "Generate Jacoco coverage reports"

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

    sourceDirectories = files("${buildDir.parent}/src/main/java")
    additionalSourceDirs = files([
            "${buildDir}/generated/source/buildConfig/debug",
            "${buildDir}/generated/source/r/debug"
    ])
    executionData = files("${buildDir}/jacoco/testDebug.exec")

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

同样的问题,报告会生成,但代码覆盖率仍然为零。

UPDATE_3

它连接来自UPDATE_2的任务起作用,但只适用于带有apply plugin: 'com.android.application'的模块(正确生成的报表)。但是对于安卓库( android,apply plugin: 'com.android.library')的模块,报告的覆盖范围为零,尽管模块包含的测试比应用程序模块更多。

UPDATE_4

创建了一个演示我的问题的简单示例项目。目前,如果运行./gradlew jacocoReport,则会生成报表,但不会显示模块项目的测试覆盖率。参见此链接

简短说明:,当测试是AndroidUnitTests (白出、JUnit 4和Robolectric)时,JaCoCo报告显示了所有模块的覆盖率。

有什么想法吗?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2015-10-11 11:36:42

在遇到麻烦之后,我决定为此创建一个开源Gradle插件

根build.gradle

代码语言:javascript
复制
buildscript {
    repositories {
        mavenCentral() // optional if you have this one already
    }
    dependencies {
        classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.16.0'
    }
}

apply plugin: 'com.vanniktech.android.junit.jacoco'

然后简单地执行

代码语言:javascript
复制
./gradlew jacocoTestReportDebug

它将在Debug模式下运行JUnit测试,然后在相应的构建目录中为您提供XML和HTML的JUnit输出。

它也支持口味。有红色和蓝色两种口味,这些任务将被创建。

  • jacocoTestReportRedDebug
  • jacocoTestReportBlueDebug
  • jacocoTestReportRedRelease
  • jacocoTestReportBlueRelease
票数 20
EN

Stack Overflow用户

发布于 2015-04-13 14:09:59

经过一些额外的搜索之后,我偶然发现了这个项目,我不得不做一些修改,这样解决方案才能适用于我的项目类型,但是现在测试覆盖率报告已经正确生成了。

我已经将采用的修改推到了我的示例github回购上,以防将来有人会遇到类似的问题。

票数 8
EN

Stack Overflow用户

发布于 2015-02-21 17:13:22

警告:这是黑客攻击!使用上面的配置,我根据选择的构建任务在应用程序和库之间切换android插件。这对我来说很好,因为我最终不会提交应用程序模式设置的代码。

代码语言:javascript
复制
// dynamically change the android plugin to application if we are running unit tests or test reports.
project.ext.androidPlugin = 'com.android.library'
for (String taskName : project.gradle.startParameter.taskNames) {
    if (taskName.contains('UnitTest') || taskName.contains('jacocoTestReport')) {
        project.ext.androidPlugin = 'com.android.application'
        break
    }
}

logger.lifecycle("Setting android pluging to ${project.ext.androidPlugin}")
apply plugin: project.ext.androidPlugin

...

apply plugin: 'jacoco'

configurations {
    jacocoReport
}

task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
    group = "Reporting"
    description = "Generate Jacoco coverage reports"

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

    sourceDirectories = files("${buildDir.parent}/src/main/java")
    additionalSourceDirs = files([
            "${buildDir}/generated/source/buildConfig/debug",
            "${buildDir}/generated/source/r/debug"
    ])
    executionData = files("${buildDir}/jacoco/testDebug.exec")

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

让我们希望android工具团队能尽快修复这个问题。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28586882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档