私は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」と競合します。
これを回避する方法はありますか?
前もって感謝します。
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 の回避策も含まれています。
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(..)関数
これが誰かを助けることを願って
このGradleプラグインを使用してみてください: https://github.com/arturdm/jacoco-Android-gradle-plugin
ここの答えにはもう少しあります https://stackoverflow.com/a/32572259/1711454 。