How do I get a jacoco coverage report using Android gradle plugin 0.10.0 or higher?

前端 未结 5 1654
花落未央
花落未央 2020-11-28 03:22

I\'m trying to get a test coverage report using Gradle Android plugin 0.10.2. But I still can\'t get a coverage report after running some tests. (connectedAndroidTest).

相关标签:
5条回答
  • 2020-11-28 03:51

    I created an open source plugin for that.

    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'
        }
    }
    

    Then simply execute

    ./gradlew jacocoTestReportDebug // or jacocoTestReportRelease
    

    It'll run the JUnit tests and then give you the Jacoco output in xml and html form in the corresponding build directory for debug build type.

    0 讨论(0)
  • 2020-11-28 04:02

    If you want to use a different version than the default, then add

    jacoco {
        version = '0.7.3.201502191951'
    }
    

    inside the android tag in your app's build.gradle.

    One way to find the latest version number: search for "org.jacoco:jacoco" on JCenter.

    0 讨论(0)
  • 2020-11-28 04:08

    Over the hundreds of times searching the answer to getting a coverage report, I finally found an exact answer what I want.

    From the this blog post, I found that gradlew createDebugCoverageReport creates the jacoco coverage report.

    Also, from the gradle plugin source code, the plugin uses jacoco 0.6.2.201302030002 by default. (therefore, jacoco version definition is not required if you are going to use a default version)

    In summary, the ESSENTIAL steps to get a jacoco coverage report with Android gradle plugin are:

    1. Android gradle plugin version 0.10.0 or higher (typically in your project's build.gradle)
    2. add testCoverageEnabled true to the build type you want (i.e. debug)
    3. run $ gradlew createDebugCoverageReport or gradlew connectedCheck to get a jacoco coverage report.

    You can find your coverage report at the build/reports/coverage/{buildType}. (i.e. build/reports/coverage/debug for debug build)

    (Add multi-flavor case from @odiggity's comment)

    If your project uses multi-flavor configuration, use create{flavorName}CoverageReport instead. The coverage report will be generated at build/reports/coverage/{flavorName}/{buildType}.

    Example for flavor krInternal with debug build type:

    • Command: ./gradlew createKrInternalDebugCoverageReport
    • Report is genarated at: build/reports/coverage/krInternal/debug

    Tip :

    Since you can only get a coverage report with the emulator and device with root permission, you'll get following error after running a command on the regular(non-rooted) device:

    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 script to get code coverage

    Include this block in build.gradle, for all modules (library, sample, etc)

    android {
        lintOptions {
            abortOnError false
        }
    }
    

    Below is the .travis-ci.yml file

    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)
    
    0 讨论(0)
  • 2020-11-28 04:10

    Have to add an answer instead of a comment since my reputation is lower than 50...

    What I want to supplement is:

    Google released new build tools fixing the nasty "VerifyError" (link) issue.

    Please try to change your setting in gradle to use latest build tools if you encounter the "VerifyError" issue. For instance,

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

    Since the 21.0.0 build tools is buggy, please use a version greater than 21.0.0. I use 21.1.1.

    0 讨论(0)
  • 2020-11-28 04:11

    Gradle already has built-in support for generating test coverage reports and we don't need to create any additional configurations or add any plugins to generate test coverage report. Basically, the only thing we need to do, is to set testCoverageEnabled parameter to true in build.gradle file as follows:

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

    Next, we can execute the following Gradle task from CLI:

    ./gradlew createDebugCoverageReport
    

    On Windows, we can execute it like this:

    gradlew.bat createDebugCoverageReport
    

    Task will analyze code of our project in /src/main/java/ directory and unit tests placed in /src/androidTest/java/ directory. After executing this task, we can find test coverage report in the following directory of the module:

    /build/outputs/reports/coverage/debug/
    

    When we open index.html file, we can see visual report from test coverage, which can be viewed in a web browser.

    It looks as on the image below.

    article about test coverage report in Android application http://blog.wittchen.biz.pl/test-coverage-report-for-android-application/

    0 讨论(0)
提交回复
热议问题