如何使用Android gradle插件0.10.0或更高版本获取jacoco覆盖率报告?

时间:2014-05-21 23:40:42

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

我正在尝试使用Gradle Android插件0.10.2获取测试覆盖率报告。 但是在运行一些测试后我仍然无法获得覆盖率报告。 (connectedAndroidTest)。

我的主模块的build.gradle是:

apply plugin: 'android'

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.3"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 19
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            testCoverageEnabled true
        }

        release {
            runProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
    }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:19.+'
}

项目构建gradle的buildscript部分是:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.10.+'
    }
}

从终端运行gradlew connectedAndroidTest后,我可以在coverage-instrumented-classes文件夹中找到code-coveragebuild文件夹。但我在coverage文件夹中找不到reports文件夹。 (只有我能看到androidTests文件夹)

获取jacoco覆盖率报告是否有任何遗漏?

5 个答案:

答案 0 :(得分:98)

在数百次寻找报道的答案中,我终于找到了我想要的答案。

this blog post,我发现gradlew createDebugCoverageReport创建了jacoco覆盖率报告。

此外,从gradle插件source code开始,该插件默认使用jacoco 0.6.2.201302030002。 (因此,如果您要使用默认版本,则不需要 jacoco版本定义

总之,使用Android gradle插件获取jacoco覆盖率报告的 ESSENTIAL 步骤为:

  1. Android gradle插件版本 0.10.0 或更高版本(通常在您的项目中build.gradle
  2. testCoverageEnabled true添加到您想要的构建类型(即debug
  3. 运行$ gradlew createDebugCoverageReportgradlew connectedCheck以获取jacoco覆盖率报告。
  4. 您可以在build/reports/coverage/{buildType}找到您的承保范围报告。 (即build/reports/coverage/debug用于调试版本)

    (从@ odiggity&#39评论中添加多味案例)

    如果您的项目使用多风味配置,请改用create{flavorName}CoverageReport。覆盖率报告将在build/reports/coverage/{flavorName}/{buildType}生成。

    debug 构建类型的 krInternal 的示例:

    • 命令:./gradlew createKrInternalDebugCoverageReport
    • 报告的内容为:build/reports/coverage/krInternal/debug

    提示:

    由于您只能使用emulatordevice with root permission获取覆盖率报告,因此在常规(非根)设备上运行命令后会出现以下错误:

    05:48:33 E/Device: Error during Sync: Permission denied                         
    java.io.IOException: com.android.ddmlib.SyncException: Permission denied
        at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:114)
        at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:158)
        at com.android.builder.internal.testing.SimpleTestCallable.call(SimpleTestCallable.java:42)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
        at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
        at java.util.concurrent.FutureTask.run(FutureTask.java:138)
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
        at java.lang.Thread.run(Thread.java:695)   
    Caused by: com.android.ddmlib.SyncException: Permission denied
        at com.android.ddmlib.SyncService.doPullFile(SyncService.java:511)
        at com.android.ddmlib.SyncService.pullFile(SyncService.java:320)
        at com.android.ddmlib.Device.pullFile(Device.java:849)
        at com.android.builder.testing.ConnectedDevice.pullFile(ConnectedDevice.java:107)
        ... 10 more                
    :myDirections:connectedAndroidTest FAILED      
    
    FAILURE: Build failed with an exception.
    

    Travis-CI构建脚本以获取代码覆盖率

    在build.gradle中包含此块,用于所有模块(库,样本等)

    android {
        lintOptions {
            abortOnError false
        }
    }
    

    以下是.travis-ci.yml文件

    language: android
    jdk: oraclejdk8
    sudo: required
    
    android:
      components:
      # Uncomment the lines below if you want to
      # use the latest revision of Android SDK Tools
      - tools
      - platform-tools
      # The BuildTools version used by your project
      - build-tools-28.0.3
      # The SDK version used to compile your project
      - android-28
      - android-22
      - add-on
      # Additional components
      - extra-google-google_play_services
      - extra-android-support
      - extra-google-m2repository
      - extra-android-m2repository
      # Specify at least one system image,
      # if you need to run emulator(s) during your tests
      - sys-img-armeabi-v7a-android-22
    
      licenses:
      - 'android-sdk-preview-license-52d11cd2'
      - 'android-sdk-license-.+'
      - 'google-gdk-license-.+'
    
    before_cache:
    - rm -f  $HOME/.gradle/caches/modules-2/modules-2.lock
    - rm -fr $HOME/.gradle/caches/*/plugin-resolution/
    
    cache:
      directories:
        - $HOME/.gradle/caches/
        - $HOME/.gradle/wrapper/
        - $HOME/.android/build-cache
    
    before_install:
    - yes | sdkmanager "build-tools;28.0.3"
    
    before_script:
    - echo no | android create avd --force -n test -t android-22 --abi armeabi-v7a -c 100M
    - emulator -avd test -no-audio -no-window &
    - android-wait-for-emulator
    - sleep 180
    - adb devices
    - adb shell input keyevent 82 &
    
    script:
    - ./gradlew build connectedCheck
    
    after_success:
    - bash <(curl -s https://codecov.io/bash)
    

答案 1 :(得分:7)

我为此创建了open source plugin

Root build.gradle

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

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.3.0'
    }
}

然后只需执行

./gradlew jacocoTestReportDebug // or jacocoTestReportRelease

它将运行JUnit测试,然后在调试构建类型的相应构建目录中以xml和html形式提供Jacoco输出。

答案 2 :(得分:6)

由于我的声誉低于50,所以必须添加答案而不是评论...

我想补充的是:

谷歌发布了新的构建工具,修复了令人讨厌的“VerifyError”(link)问题。

如果遇到“VerifyError”问题,请尝试更改gradle中的设置以使用最新的构建工具。例如,

android {
    ......
    buildToolsVersion '21.1.1'
    .....
}

由于21.0.0构建工具存在问题,请使用大于21.0.0的版本。我用21.1.1。

答案 3 :(得分:3)

如果您想使用与默认版本不同的版本,请添加

jacoco {
    version = '0.7.3.201502191951'
}

在您应用的android内的build.gradle标记内。

查找最新版本号的一种方法:搜索&#34; org.jacoco:jacoco&#34;在JCenter

答案 4 :(得分:2)

Gradle已经内置了对生成测试覆盖率报告的支持,我们不需要创建任何其他配置或添加任何插件来生成测试覆盖率报告。基本上,我们唯一需要做的就是在testCoverageEnabled文件中将true参数设置为build.gradle,如下所示:

android {
   buildTypes {
      debug {
         testCoverageEnabled = true
      }
   }
}

接下来,我们可以从CLI执行以下Gradle任务:

./gradlew createDebugCoverageReport

在Windows上,我们可以这样执行:

gradlew.bat createDebugCoverageReport

任务将分析/src/main/java/目录中项目的代码和/src/androidTest/java/目录中的单元测试。 执行此任务后,我们可以在模块的以下目录中找到测试覆盖率报告:

/build/outputs/reports/coverage/debug/

当我们打开index.html文件时,我们可以看到来自测试覆盖的可视化报告,可以在网络浏览器中查看。

如下图所示。

enter image description here

关于Android应用程序中的测试覆盖率报告的文章 http://blog.wittchen.biz.pl/test-coverage-report-for-android-application/