web-dev-qa-db-ja.com

Android studioのJacocoコードカバレッジ

Jacocoコードカバレッジレポートを生成しようとしています。テストクラスにAndroidTestCaseを使用しました。

TestCoverageEnabled trueを使用し、デフォルトAndroid -studio default jacoco、./gradlew connectedCheckまたはcreateDebugCoverageReportを使用すると、成功/失敗テストケースの割合が作成されますが、カバレッジレポートは作成されません。

次に、jacoco {toolVersion "0.7.1.201405082137"}とタスクjacocoTestReport(type:JacocoReport、dependOn: "testDebug")を試しました。さまざまなタスクでdependOn値を変更しようとしました。レポートには0(ゼロ)のテストカバレッジが表示されますが、これはすべてのクラスの少なくとも半分がテストされるため不可能です。

過去数日間で、スタックオーバーフローに関するさまざまな受け入れられている答えに従いました。結果は負です。

私のgradleファイル:

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

apply plugin: 'com.Android.application'
apply plugin: 'jacoco'

Android {
    compileSdkVersion 21
    buildToolsVersion "21.1.2"

    defaultConfig {
        applicationId "test.gradle.com.myapplicationtestgradle"
        minSdkVersion 21
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false            
            proguardFiles getDefaultProguardFile(
            'proguard-Android.txt'), 'proguard-rules.pro'
        }
        debug {
            testCoverageEnabled true
        }
    }

    jacoco {
        version "0.7.1.201405082137"
    }

    packagingOptions {
        exclude 'LICENSE.txt'
    }
}


jacoco {
    toolVersion "0.7.1.201405082137"
}

task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
    group = "Reporting"

    description = "Generate Jacoco coverage reports"

   // exclude auto-generated classes and tests
    def fileFilter = ['**/R.class', '**/R$*.class', 
    '**/BuildConfig.*', '**/Manifest*.*',           
     'Android/**/*.*']
    def debugTree = fileTree(dir:   
    "${project.buildDir}/intermediates/classes/debug", 
    excludes: fileFilter)
    def mainSrc = "${project.projectDir}/src/main/Java"

    sourceDirectories = files([mainSrc])
    classDirectories = files([debugTree])
    additionalSourceDirs = files([
            "${buildDir}/generated/source/buildConfig/debug",
            "${buildDir}/generated/source/r/debug"
    ])
    executionData = fileTree(dir: project.projectDir, includes: 
                    ['**/*.exec', '**/*.ec'])

    reports {
        xml.enabled = true
        xml.destination = "${buildDir}/jacocoTestReport.xml"
        csv.enabled = false
        html.enabled = true
        html.destination = "${buildDir}/reports/jacoco"
    }
}


dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('junit:junit:4.11') {
        exclude module: 'hamcrest-core'
    }
}
22
user1365169

すでに動作しているようですが、単体テストの実行データを取得するためのより簡単な方法があります。私も最近これを検討していましたが、実際には完全に書き上げました 以前

私の状況では、既存のワークフローの一部としてレポートを生成したかったため、追加のGradleタスクを作成したくありませんでした。また、Jacocoプラグインを明示的に追加したくありませんでした。 Googleはすでにダップしています Instrumentation Testsのカバレッジレポート用のJacoco Antタスクです。

プロパティの設定に加えてAndroid.jacoco.versionおよびbuildTypes.debug.testCoverageEnabled、実行データを生成するためにtestDebug JVM引数に次を追加しました。

project.afterEvaluate {
  def append = "append=true"
  def destFile = "destfile=$buildDir/outputs/code-coverage/connected/coverage.ec"
  testDebug.jvmArgs "-javaagent:$buildDir/intermediates/jacoco/jacocoagent.jar=$append,$destFile"

  createDebugCoverageReport.dependsOn testDebug
}

これにより、connectedAndroidTestによって生成されたカバレッジファイルに単体テストの実行データが追加されるため、レポートには、各バリアントを個別にではなく、インストルメンテーションテストと単体テストの両方が反映されます。

connectedAndroidTestはカバレッジファイルを上書きすることに注意してください。レポートを作成する際にこれを考慮してください。タスクtestDebugに変更がなく、createDebugCoverageReportを実行すると、インストルメンテーションテストのカバレッジのみが反映されます。そのため、ユニットテストに変更を加えます。ここではLinuxコマンドtouchが便利かもしれませんが、まだ試していません。

12
Patrick McLaren

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アプリケーションでテストカバレッジレポートに関する記事を書いて、しばらく前に私のブログに公開しました。そのトピックに興味がある場合は、次のURLで読むことができます。

更新(Robolectricテストの単体テストカバレッジ)

Robolectricで記述された単体テストからテストカバレッジレポートを作成し、JacocoTravis CIおよびCodecov.io、私のブログの新しい記事をご覧ください:

43
piotr.wittchen

Android studio、Android sdk、gradle。その後、すべてを再インストールします。今日は完全に削除しましたAndroid studio、 Android sdk、gradle。その後、すべてを再インストールします。その後、アプリbuild.gradle内に追加しました。

debug {
    testCoverageEnabled true
}

次に、。/ gradlew connectedChecを実行します。すべてが完璧に機能しています。 AndroidスタジオデフォルトのJacocoは私のためにうまく機能しています。jacocoTestReportタスクを作成してからコードカバレッジを作成することも可能だと思います。なぜgradleとAndroidスタジオは以前は機能していませんでした。

2
user1365169

jacocoでコードカバレッジレポートをマージする正しい方法を調査しました。ここで確認できます: https://Gist.github.com/ultraon/54cca81ca159ed0a4a9ebf62e89c26ba

Gradle 3.2でAndroidStudio 2.2.2を使用し、Android Gradle Plugin 2.2.2

1
ultraon