首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >JaCoCo不适用于Robolectric测试

JaCoCo不适用于Robolectric测试
EN

Stack Overflow用户
提问于 2016-03-02 06:42:54
回答 5查看 6.3K关注 0票数 26

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

代码语言:javascript
复制
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工作得很好。但不幸的是,没有报告与RobolectricTestRunner一起运行的测试的覆盖率(测试中明显调用的指令没有报告为覆盖率)。不带@RunWith注释的测试或使用MockitoJUnitTestRunner报告覆盖率运行都很好。

如果有任何帮助来解决这个问题,我们将不胜感激。

更新1:我注意到我应该使用RobolectricGradleTestRunner。但这并不管用。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-03-02 22:49:41

这是可能的解决方法的已知问题- https://github.com/jacoco/jacoco/pull/288

或者将版本降级到0.7.1.201405082137

更新

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

更新根build.gradle

代码语言:javascript
复制
buildscript {
    dependencies {
        classpath 'org.jacoco:org.jacoco.core:0.7.6.201602180812'
    }
}

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

运行./gradlew wrapper

更新项目build.gradle

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

android {
  testOptions {
    unitTests.all {
      jacoco {
        includeNoLocationClasses = true
      }
    }
  }
}
票数 23
EN

Stack Overflow用户

发布于 2018-06-22 05:59:40

公认的答案有点过时了。这是我们刚刚实现的一个类似的修复。在模块(即app) build.gradle中添加:

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

tasks.withType(Test) {
    jacoco.includeNoLocationClasses = true
}

这确实需要JaCoCo 7.6+,但您可能已经在使用它了。

Studio备注:

  1. 此选项仅修复命令行界面。如果您使用JaCoCo从Studio运行coverage,仍然不会报告Robolectric覆盖率。
  2. 除非我在IntelliJ JUnit -> VM Options

中添加了-noverify,否则测试会间歇性崩溃。

票数 7
EN

Stack Overflow用户

发布于 2016-03-03 18:44:59

我也面临着同样的问题,但现在我可以通过这个链接来解决这个问题。

问题链接:https://github.com/robolectric/robolectric/issues/2230

这里提到了这个问题的解决方案:

https://github.com/dampcake/Robolectric-JaCoCo-Sample/commit/f9884b96ba5e456cddb3d4d2df277065bb26f1d3

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

https://stackoverflow.com/questions/35735085

复制
相关文章

相似问题

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