【问题标题】:android jacoco coverage empty with gradleandroid jacoco 覆盖空的 gradle
【发布时间】:2015-01-16 08:59:27
【问题描述】:

我正在尝试让 jacoco 为我的 android 测试项目创建代码覆盖率报告。我在 build.gradle 中有以下内容:

apply plugin: 'com.android.application'
apply plugin: 'jacoco'
...
jacoco {
    toolVersion = "0.7.1.201405082137"
}
...
android {
    buildTypes {
        release {
        }
        debug {
            testCoverageEnabled true
        }
    }
}

当我运行 gradlew -i createDebugCoverageReport 时,我得到一个覆盖率报告,但它是空的。 gradle执行结束如下:

:androidTest:connectedAndroidTest (Thread[main,5,main]) completed. Took 2 mins 36.951 secs.
:androidTest:createDebugCoverageReport (Thread[main,5,main]) started.
:androidTest:createDebugCoverageReport
Executing task ':androidTest:createDebugCoverageReport' (up-to-date check took 0.006 secs) due to:
  Output file /home/akos/src/androidTest/build/outputs/reports/coverage/debug has changed.
  Output file /home/akos/src/androidTest/build/outputs/reports/coverage/debug/index.html has been removed.
  Output file /home/akos/src/androidTest/build/outputs/reports/coverage/debug/.resources/package.gif has been removed.
[ant:reportWithJacoco] Loading execution data file /home/akos/src/androidTest/build/outputs/code-coverage/connected/coverage.ec
[ant:reportWithJacoco] Writing bundle 'debug' with 3 classes
:androidTest:createDebugCoverageReport (Thread[main,5,main]) completed. Took 0.215 secs.

BUILD SUCCESSFUL

Total time: 4 mins 53.467 secs

实际上,上面引用的coverage.ec 文件是空的(长度为0)

在目录 build/intermediates/coverage-instrumented-classes/ 中,我似乎有检测类文件

这是 gradle 2.1

我做错了什么?

【问题讨论】:

  • 您的项目结构是否遵循 Gradle 结构.. 如果您的 src 代码位于 src/java 或 src/main/java 中?您在哪里定义 .exec 文件的位置(什么是 .ec)?
  • 这不是 gradle 结构,但我在构建文件中定义它们。也许我做得不够好。这就是我所拥有的: sourceSets { androidTest { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['res']aidl.srcDirs = ['src'] renderscript.srcDirs = [ 'src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] } } 和 sourceSets 中的 'main' 相同
  • 我希望 Peter N 能对此有所了解。
  • Ákos Maróy,您找到解决问题的方法了吗?我也面临同样的问题。如果您有解决方案,请提供帮助

标签: android gradle code-coverage jacoco


【解决方案1】:

尝试使用Nexus device(5 或 5x)生成调试覆盖率报告,它将完美运行。我在Samsung devices 上遇到了同样的问题(coverage.ec 为空),但之后我用Nexus 5x 运行它,一切正常。

【讨论】:

  • 我的情况是突然间报道停止收集。我在模拟器上运行测试。并且擦除模拟器上的数据有帮助。所以可能是设备问题。感谢您提供线索。
【解决方案2】:

Android Gradle 插件 0.14.0 中存在一个问题,它会生成一个空的 coverage.ec 文件。它是已知的并且被固定在一个分支中,但似乎还没有向公众公开: https://code.google.com/p/android/issues/detail?id=78556

另一方面,可以在此处使用 Jacoco 和 RoboElectric 找到一个可爱的 Android Studio 解决方法模板项目: https://github.com/nenick/android-gradle-template

所以你可以等谷歌修复或者使用别人的build library仓库,但是Android Studio 1.0.0的gradle插件没用。

【讨论】:

    【解决方案3】:

    Jacoco 应该在 android 闭包内,并且不需要 jacoco 插件声明:

    apply plugin: 'com.android.application'
    ...
    android {
        buildTypes {
            release {
            }
            debug {
                testCoverageEnabled true
            }
        }
        jacoco {
            toolVersion = "0.7.1.201405082137"
        }
    }
    

    【讨论】:

    • 不幸的是,这带来了相同的结果:(
    【解决方案4】:

    我使用相同的 gradle.build,只需在终端输入以下命令。它以 html 页面的形式给了我覆盖率报告和测试结果。

    $./gradlew createDebugCoverageReport

    另一个建议是;进入终端

    $./gradlew --gui

    它会打开一个 gui 窗口,您可以找到正确的命令。

    【讨论】:

    • 我很高兴它对你有用。 OTOH 我帖子的中心点是它在我的情况下不起作用,这就是我想知道的
    【解决方案5】:

    我从Jacoco code coverage in Android Studio with flavors 找到了相同问题的解决方案。它有示例在生成coverage.ec 而不是testDebug.exec 时该怎么做。

    1. 我创建了jacocoTestReport 任务。

    2. 我执行了$./gradlew createDebugCoverageReport,它生成了coverage.ec文件

    3. 之后我执行了$./gradlew jacocoTestReport 并创建了 HTML。

    【讨论】:

      【解决方案6】:

      有时由于底层硬件的一些安全限制,您无法获得覆盖率报告。在我的情况下,我使用的是 android:sharedUserId="android.uid.system" ,因此它没有得到任何覆盖并且给了我一个空文件。

      所以我同意 naran 你应该尝试在不同的设备上运行它并确保你的应用没有使用 android:sharedUserId="android.uid.system"。

      【讨论】:

      • 是的,三星设备是我的罪魁祸首
      【解决方案7】:

      现在(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吧。

      【讨论】:

        【解决方案8】:

        我做了一个有趣的观察。我遇到了同样的问题,coverage.ec 文件的大小为 0 字节。我在这里尝试了所有答案以及这些答案:

        https://code.google.com/p/android/issues/detail?id=170607

        它没有改变任何东西。我的build.gradle 文件只有这些设置才能让 jacoco 工作:

        apply plugin: 'com.android.application'
        apply plugin: 'jacoco'
        
        android {
            ...
        buildTypes {
           ...
            debug {
                testCoverageEnabled true
            }
        }
        
        ...
        }
        

        我的 Android Studio 版本是 1.2.2。我在“文件-> 项目结构”中有以下 gradle 设置:

        • Gradle 版本:2.2.1
        • 安卓插件版本:1.2.3

        我尝试在Motorola Moto G 4G LTE - Android 4.4.4 上使用gradlew cC 运行仪器测试,并正确运行仪器测试,但coverage.ec 文件具有0 字节。今天我尝试了另一个设备:LG Spirit 4G LTE - Android 5.0,现在代码覆盖工作了!!! coverage.ec 文件有 322 个字节,我看到正确的 html 覆盖率报告。

        我认为有时使用gradlew cC --debug 运行gradle 表明在设备上找不到coverage.ec,有时它显示文件被拉取。但也许在这两种情况下都无法在设备上找到它。因此,选择其他设备可以解决问题。祝你好运!

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-08-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多