web-dev-qa-db-ja.com

Android gradle plugin 0.10.0以降を使用してjacocoカバレッジレポートを取得するにはどうすればよいですか?

Gradle Android plugin 0.10.2を使用して、テストカバレッジレポートを取得しようとしていますが、いくつかのテストを実行した後でもカバレッジレポートを取得できません。

私のメインモジュールの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.+'
}

プロジェクトのビルドグラドルのbuildscriptセクションは次のとおりです。

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

ターミナルからgradlew connectedAndroidTestを実行すると、buildフォルダー内でcoverage-instrumented-classesおよびcode-coverageフォルダーを見つけることができます。しかし、coverageフォルダーにreportsフォルダーが見つかりません。 (私が見ることができるのはandroidTestsフォルダのみです)

Jacocoカバレッジレポートを取得するために不足しているものはありますか?

36
Taeho Kim

カバレッジレポートを取得するための答えを検索する何百回にわたって、私は最終的に私が望む正確な答えを見つけました。

このブログ投稿 から、gradlew createDebugCoverageReportがjacocoカバレッジレポートを作成することがわかりました。

また、gradleプラグイン ソースコード から、プラグインはデフォルトでjacoco 0.6.2.201302030002を使用します。 (したがって、デフォルトのバージョンを使用する場合は、jacocoバージョン定義は不要です

要約すると、[〜#〜] essential [〜#〜]ステップはAndroidでjacocoカバレッジレポートを取得しますgradleプラグインは次のとおりです。

  1. Android gradleプラグインバージョン0.10.0以上(通常はプロジェクトのbuild.gradle
  2. testCoverageEnabled trueを希望のビルドタイプに追加します(つまりdebug
  3. $ gradlew createDebugCoverageReportまたはgradlew connectedCheckを実行して、jacocoカバレッジレポートを取得します。

カバレッジレポートはbuild/reports/coverage/{buildType}にあります。 (つまり、デバッグビルド用のbuild/reports/coverage/debug

(@ odiggityのコメントから複数フレーバーのケースを追加)

プロジェクトでマルチフレーバー構成を使用している場合は、代わりにcreate{flavorName}CoverageReportを使用してください。カバレッジレポートはbuild/reports/coverage/{flavorName}/{buildType}で生成されます。

krInternaldebugビルドタイプのフレーバーの例:

  • コマンド:./gradlew createKrInternalDebugCoverageReport
  • レポートの生成:build/reports/coverage/krInternal/debug

ヒント:

カバレッジレポートはemulatorおよびdevice 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)
100
Taeho Kim

オープンソースプラグイン を作成しました。

ルート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出力を提供します。

7
Niklas

私の評判は50未満なので、コメントの代わりに回答を追加する必要があります...

私が補足したいのは:

Googleは厄介な「VerifyError」( link )の問題を修正する新しいビルドツールをリリースしました。

「VerifyError」の問題が発生した場合は、最新のビルドツールを使用するようにgradleの設定を変更してください。例えば、

Android {
    ......
    buildToolsVersion '21.1.1'
    .....
}

21.0.0ビルドツールにはバグがあるため、21.0.0以降のバージョンを使用してください。 21.1.1を使用します。

6
Better Shao

デフォルトとは異なるバージョンを使用する場合は、追加します

jacoco {
    version = '0.7.3.201502191951'
}

アプリのbuild.gradleAndroidタグ内。

最新バージョン番号を見つける1つの方法: JCenter で「org.jacoco:jacoco」を検索します。

3
nhaarman

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ブラウザーで表示できます。

下の画像のようになります。

enter image description here

Android application http://blog.wittchen.biz.pl/test-coverage-report-for-Android-application/ のテストカバレッジレポートに関する記事

2
Yuliia Ashomok