【问题标题】:Jacoco code covergage file empty leading to false coverage reportsJacoco 代码覆盖率文件为空导致错误的覆盖率报告
【发布时间】:2015-07-20 14:06:19
【问题描述】:

可以在此处找到包含用于此问题的代码的 Github 存储库: https://github.com/thenewmr/UnitTestCoverageExample

我们在尝试通过正确生成 Jacoco 获取代码覆盖率报告时遇到了严重问题。

我们已经关注了互联网上的各种指南,包括 this onePatrick McLaren,他在他的 answer 中链接到这个 question

我们还研究了有关堆栈溢出的各种问题,但到目前为止还没有什么乐趣。

这是我们目前所掌握的(以项目符号的形式,以免这个问题太长而无法阅读):

  • testCoverageEnabled = true 添加到调试闭包中创建了一个名为“createDebugCoverageReport”的任务
  • 运行此任务:

    • 在以下位置为我们的 Android 测试生成报告:app/build/outputs/reports/androidTests/connected/index.html,其中包含测试通过和失败等的准确报告
    • 但覆盖率报告不准确(0% 覆盖率)位于:app/build/outputs/reports/coverage/debug/index.html
    • 它还会在以下位置生成看似空的覆盖率数据:app/build/outputs/code-coverage/connected/coverage.ec
  • 现在,如果我们添加以下内容:

    apply plugin: 'jacoco'
    
    //specify which directories should be examined by jacoco
    def coverageSourceDirs = [
            'src/main/java'
    ]
    
    task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
        group = "Reporting"
    
        description = "Generate Jacoco coverage reports"
    
        classDirectories = fileTree(
                dir: 'build/intermediates/classes/debug',
                excludes: ['**/R.class',
                           '**/R$*.class',
                           '**/*$ViewInjector*.*',
                           '**/BuildConfig.*',
                           '**/Manifest*.*']
        )
    
        additionalSourceDirs = files(coverageSourceDirs)
        sourceDirectories = files(coverageSourceDirs)
        executionData = files('build/jacoco/testDebug.exec')
    
        reports {
            xml.enabled = true
            html.enabled = true
        }
    }
    

到应用程序的 build.gradle 文件(有或没有上面的位)并运行 jacocoTestReport,我们得到:

  • 原版单元测试的测试报告位于:app/build/reports/tests/debug/index.html
  • app/build/reports/jacoco/jacocoTestReport/html/index.html 上的准确代码覆盖率报告

因此,我们得到了适用于普通单元测试的正确内容,但不适用于 Android 单元测试。

上面提到的blog post 讲的是如何合并两个报告。但是如果我们一开始就不能得到Android测试覆盖率报告,那似乎就没有意义了。

问题似乎是由于前面提到的空 coverage.ec 文件。

这个答案说这曾经是一个错误: https://stackoverflow.com/a/28080713/487812

这个错误报告说这个问题已经修复: https://code.google.com/p/android/issues/detail?id=78556

但也许它作为回归被重新引入?我们是否遗漏了一些明显的东西?

【问题讨论】:

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


    【解决方案1】:

    虽然 nius 的回答是正确的,但以下信息是我们特定问题的解决方案。

    事实证明,出于某种奇怪的原因,在三星设备上运行测试会产生空的覆盖文件。在模拟器或非三星手机上运行相同的测试产生了预期的结果。

    在此处包含此信息,以便人们了解这一点。

    【讨论】:

    • 我在三星遇到过同样的问题。当我的三星 S6 插入时,我运行 ./gradlew createDebugCoverageReport 并获得 0 测试覆盖率。切换到我的 Droid Turbo,我得到了正确的结果。 CMON 三星 ;-)
    【解决方案2】:

    现在(2015 年 10 月)您可以将其用作 android team has fixed the bug

    android {
        ...
        buildTypes {
            debug {
                testCoverageEnabled true
            }
        }
        ...
        dependencies{
            androidTestCompile 'com.android.support.test:runner:0.4.1'
            // Set this dependency to use JUnit 4 rules
            androidTestCompile 'com.android.support.test:rules:0.4.1'
            // Set this dependency to build and run Espresso tests
            androidTestCompile 'com.android.support.test.espresso:espresso-core:2.2.1'
            // Espresso-contrib for DatePicker, RecyclerView, Drawer actions, Accessibility checks, CountingIdlingResource
            androidTestCompile 'com.android.support.test.espresso:espresso-contrib:2.2.1'
        }
    }
    

    然后只需使用./gradlew createDebugCoverageReport。在app/build/reports/coverage/debug/index.html 中查找报告。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-31
      • 1970-01-01
      • 2016-11-11
      • 2019-01-02
      • 2012-11-02
      • 2018-09-09
      相关资源
      最近更新 更多