web-dev-qa-db-ja.com

Android JaCoCo Gradleプラグインでコードカバレッジをテストする

私はGradleを初めて使用し、Androidテストをしていますが、GradleでビルドするためにAndroidプロジェクトを既に変換しています。

今、GradleのJaCoCoプラグインを使用してAndroidプロジェクトのテストカバレッジを実行しようとしています。

Build.gradleファイルに次を追加しました。

apply plugin: 'jacoco'

そして、「gradle jacocoTestReport」を実行すると、次のエラーが発生します。

Task 'jacocoTestReport' not found in root project '<project name>'.

ドキュメントから、プラグイン「Java」も適用することになっていますが、プラグイン「Android」と競合します。

これを回避する方法はありますか?

前もって感謝します。

32
Henrique Rocha

Jacocoの使用方法は次のとおりです。

buildscript {
  repositories {
    mavenLocal()
    mavenCentral()
  }
  dependencies {
    classpath 'com.Android.tools.build:gradle:0.12.+'
    classpath 'org.robolectric:robolectric-gradle-plugin:0.11.+'
  }
}

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

Android {
  compileSdkVersion 20
  buildToolsVersion "20.0.0"

  defaultConfig {
    applicationId "YOUR_PACKAGE_NAME"
    minSdkVersion 10
    targetSdkVersion 20
    testHandleProfiling true
    testFunctionalTest true
  }
  buildTypes {
    debug {
      testCoverageEnabled false
    }
    release {
      runProguard false
      proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.txt'
    }
  }
  jacoco {
    version "0.7.1.201405082137"
  }
  packagingOptions {
    exclude 'META-INF/DEPENDENCIES.txt'
    exclude 'META-INF/LICENSE.txt'
    exclude 'META-INF/NOTICE.txt'
    exclude 'META-INF/NOTICE'
    exclude 'META-INF/LICENSE'
    exclude 'META-INF/DEPENDENCIES'
    exclude 'META-INF/notice.txt'
    exclude 'META-INF/license.txt'
    exclude 'META-INF/dependencies.txt'
    exclude 'META-INF/LGPL2.1'
    exclude 'META-INF/services/javax.annotation.processing.Processor'
    exclude 'LICENSE.txt'
  }
}

robolectric {
  include '**/*Test.class'
  exclude '**/espresso/**/*.class'

  maxHeapSize "2048m"
}

jacoco {
  toolVersion "0.7.1.201405082137"
}

// Define coverage source.
// If you have rs/aidl etc... add them here.
def coverageSourceDirs = [
    'src/main/Java',
]

task jacocoTestReport(type: JacocoReport, dependsOn: "connectedDebugAndroidTest") {
  group = "Reporting"
  description = "Generate Jacoco coverage reports after running tests."
  reports {
    xml.enabled = true
    html.enabled = true
  }
  classDirectories = fileTree(
      dir: './build/intermediates/classes/debug',
      excludes: ['**/R*.class',
                 '**/*$InjectAdapter.class',
                 '**/*$ModuleAdapter.class',
                 '**/*$ViewInjector*.class'
      ])
  sourceDirectories = files(coverageSourceDirs)
  executionData = files("$buildDir/jacoco/testDebug.exec")
  // Bit hacky but fixes https://code.google.com/p/Android/issues/detail?id=69174.
  // We iterate through the compiled .class tree and rename $$ to $.
  doFirst {
    new File("$buildDir/intermediates/classes/").eachFileRecurse { file ->
      if (file.name.contains('$$')) {
        file.renameTo(file.path.replace('$$', '$'))
      }
    }
  }
}


dependencies {
  androidTestCompile('junit:junit:4.11') {
    exclude module: 'hamcrest-core'
  }
  androidTestCompile('org.robolectric:robolectric:2.3') {
    exclude module: 'classworlds'
    exclude module: 'maven-artifact'
    exclude module: 'maven-artifact-manager'
    exclude module: 'maven-error-diagnostics'
    exclude module: 'maven-model'
    exclude module: 'maven-plugin-registry'
    exclude module: 'maven-profile'
    exclude module: 'maven-project'
    exclude module: 'maven-settings'
    exclude module: 'nekohtml'
    exclude module: 'plexus-container-default'
    exclude module: 'plexus-interpolation'
    exclude module: 'plexus-utils'
    exclude module: 'wagon-file'
    exclude module: 'wagon-http-lightweight'
    exclude module: 'wagon-http-shared'
    exclude module: 'wagon-provider-api'
    exclude group: 'com.Android.support', module: 'support-v4'
  }
}

上記のコードには、 https://code.google.com/p/Android/issues/detail?id=69174 の回避策も含まれています。

詳細: http://chrisjenx.com/gradle-robolectric-jacoco-dagger/

23
Hieu Rocker

RoboGuice、Butterknife、Robolectricを使用したプロジェクトでJaCoCoを使用しています。 @Hieu Rockerのソリューションを使用してセットアップできましたが、プロジェクトにはフレーバーを使用し、フレーバーの追加テストと、追加のJavaコードそれぞれ異なるビルドタイプも使用しているため、「testDebug」タスクに依存するソリューションでは不十分でした。ここに私のソリューションを示します。In build.gradle in app =モジュールの追加

apply from: '../app/jacoco.gradle'

次に、jacoco.gradleファイルをappモジュール内に次の内容で作成します:

 
プラグインの適用: 'jacoco' 
 
 jacoco {
 toolVersion "0.7.1.201405082137" 
} 
 
 def getFlavorFromVariant(String variantName){
 def flavorString = variantName.replaceAll(/(。*)([AZ]。*)/){all、flavorName、buildTypeName-> 
 flavorName 
} 
 return flavorString; 
} 
 
 def getBuildTypeFromVariant(String variantName){
 def buildTypeString = variantName.replaceAll (/(.*)([AZ].*)/){all、flavorName、buildTypeName-> 
 "$ {buildTypeName.toLowerCase()}" 
} 
 return buildTypeString; 
} 
 
 def getFullTestTaskName(String variantName){
 return "test $ {variantName.capitalize()} UnitTest"; 
} 
 
 Android.applicationVariants.all {バリアント-> 
 def variantName = variant.name; 
 def flavorFromVariant = g etFlavorFromVariant( "$ {variantName}"); 
 def buildTypeFromVariant = getBuildTypeFromVariant( "$ {variantName}"); 
 def testTaskName = getFullTestTaskName( "$ {variantName}")
 
タスク( "jacoco $ {variantName.capitalize()} TestReport"、タイプ:JacocoReport、dependsOn:testTaskName){
 group = "Reporting" 
 description = "Generate JaCoCo coverageバリアントのテストを実行した後のレポート:$ {variantName}。 "
レポート{
 xml.enabled = true 
 html.enabled = true 
} 
 
 classDirectories = fileTree(
 dir: "./build/intermediates/classes/${flavorFromVariant}/${buildTypeFromVariant}",
 excludes:['**/R * .class '、
' **/* $ InjectAdapter.class '、
' **/* $ ModuleAdapter.class '、
' **/* $ ViewInjector * .class '
 
)
 
 logger.info( "フレーバー用のJaCoCoの設定:$ {flavorFromVariant}、buildType:$ {buildTypeFromVariant}、タスク:$ {testTaskName} "); 
 
 def coverageSourceDirs = 
 '../app/src/main/Java',
 "../app/src/${flavorFromVariant}/Java"
 
 sourceDirectories = files(coverageSourceDirs)
 executionData = files(" $ buildDir/jacoco/$ {testTaskName } .exec ")
 //少しハックしますが、https://code.google.com/p/Android/issues/detail?id = 69174。
を修正します//コンパイル済みを繰り返し処理します.classツリーと$$の名前を$。
 doFirst {
 new File( "$ buildDir/intermediates/classes /")。eachFileRecurse {file-> 
 if(file。 name.contains( '$$')){
 file.renameTo(file.path.replace( '$$'、 '$'))
} 
} 
} 
} 
} 

次のようにコマンドラインから実行できます:

.gradlew jacocoFlavor1DebugTestReport

または

.gradlew jacocoOtherflavorPrereleaseTestReport

このプロジェクトでは、フレーバー内の大文字を使用せずに型名を作成する規則を使用しますが、プロジェクトがこの規則に従っていない場合は、単にgetFlavorFromVariant(..)およびgetBuildTypeFromVariant(..)関数

これが誰かを助けることを願って

7
Piotr Zawadzki

このGradleプラグインを使用してみてください: https://github.com/arturdm/jacoco-Android-gradle-plugin

ここの答えにはもう少しあります https://stackoverflow.com/a/32572259/1711454

0