簡體   English   中英

如何使用 Android gradle 插件 0.10.0 或更高版本獲取 jacoco 覆蓋率報告?

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

我正在嘗試使用 Gradle Android 插件 0.10.2 獲取測試覆蓋率報告。 但是在運行一些測試后我仍然無法獲得覆蓋率報告。 (連接AndroidTest)。

我的主模塊的 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后,我可以在build文件夾中找到coverage-instrumented-classescode-coverage文件夾。 但是我在reports文件夾中找不到coverage文件夾。 (只有我能看到androidTests文件夾)

獲得 jacoco 覆蓋率報告有什么遺漏嗎?

經過數百次搜索獲得覆蓋報告的答案,我終於找到了我想要的確切答案。

這篇博客文章中,我發現gradlew createDebugCoverageReport創建了 jacoco 覆蓋率報告。

此外,從 gradle 插件源代碼來看,該插件默認使用 jacoco 0.6.2.201302030002。 (因此,如果您要使用默認版本,則不需要 jacoco 版本定義

總之,使用 Android gradle 插件獲取jacoco覆蓋率報告的基本步驟是:

  1. Android gradle 插件版本0.10.0或更高版本(通常在您項目的build.gradle
  2. testCoverageEnabled true添加到您想要的構建類型(即debug
  3. 運行$ gradlew createDebugCoverageReportgradlew connectedCheck以獲取jacoco覆蓋率報告。

您可以在build/reports/coverage/{buildType}找到您的覆蓋率報告。 (即用於調試構建的build/reports/coverage/debug

(從@odiggity 的評論中添加多口味案例)

如果您的項目使用多口味配置,請改用create{flavorName}CoverageReport 覆蓋率報告將在build/reports/coverage/{flavorName}/{buildType}

具有調試構建類型的風味krInternal示例:

  • 命令: ./gradlew createKrInternalDebugCoverageReport
  • 報告生成於: build/reports/coverage/krInternal/debug

提示 :

由於您只能使用device with root permissionemulatordevice with root permission獲取覆蓋率報告,因此在常規(非 root )設備上運行命令后,您將收到以下錯誤:

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)

我為此創建了一個開源插件

根構建.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 輸出。

必須添加答案而不是評論,因為我的聲譽低於 50...

我想補充的是:

Google 發布了新的構建工具,修復了令人討厭的“VerifyError”(鏈接)問題。

如果遇到“VerifyError”問題,請嘗試更改 gradle 中的設置以使用最新的構建工具。 例如,

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

由於 21.0.0 構建工具有問題,請使用大於 21.0.0 的版本。 我使用 21.1.1。

Gradle 已經內置支持生成測試覆蓋率報告,我們不需要創建任何額外的配置或添加任何插件來生成測試覆蓋率報告。 基本上,我們唯一需要做的就是在build.gradle文件中將testCoverageEnabled參數設置為true ,如下所示:

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文件時,我們可以看到測試覆蓋率的可視化報告,可以在 Web 瀏覽器中查看。

它看起來如下圖所示。

在此處輸入圖片說明

如果要使用與默認版本不同的版本,請添加

jacoco {
    version = '0.7.3.201502191951'
}

在您應用的build.gradleandroid標簽內。

查找最新版本號的一種方法:在JCenter上搜索“org.jacoco:jacoco”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM