首页 文章

android jacoco覆盖空与gradle

提问于
浏览
6

我正在尝试让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

我究竟做错了什么?

8 回答

  • 1

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

  • 0

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

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

    有's a problem in the Android Gradle Plugin 0.14.0 that generates an empty coverage.ec file. It'已知并已在一个分支中修复但似乎尚未向公众发布:https://code.google.com/p/android/issues/detail?id=78556

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

    因此,您可以等待谷歌修复它或使用其他人的构建库存储库,但Android Studio 1.0.0的gradle插件是无用的 .

  • 0

    我使用相同的gradle.build,只需在下面输入命令到终端 . 它给了我一个html页面的报道和测试结果 .

    $ . / gradlew createDebugCoverageReport

    另一个建议是;进入终端

    $ . / gradlew --gui

    它打开一个gui窗口,你可以找到正确的命令 .

  • 2

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

    • 我创建了 jacocoTestReport 任务 .

    • 我执行 $./gradlew createDebugCoverageReport ,生成 coverage.ec 文件

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

  • 1

    有时由于底层硬件的某些安全限制,您无法获得覆盖率报告 . 在我的情况下,我使用android:sharedUserId =“android.uid.system”,由于这个原因,它没有拿起任何报道,并给了我一个空文件 .

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

  • 1

    现在(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 .

  • 1

    我做了一个有趣的观察 . 我遇到了同样的问题, 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

    • Android插件版本:1.2.3

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

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

相关问题