RoboGuice、Butterknife、および Robolectric を使用するプロジェクトで JaCoCo を使用しています。@Hieu Rocker のソリューションを使用してセットアップできましたが、いくつかの小さな欠点がありました。つまり、私たちのプロジェクトではフレーバーを使用しており、それらのフレーバーに対していくつかの追加のテストと、それぞれの追加の Java コードがあります。また、さまざまなビルドタイプを使用しています。したがって、「testDebug」タスクに依存するソリューションは十分ではありませんでした。これが私の解決策です:アプリモジュールのbuild.gradleに追加します
apply from: '../app/jacoco.gradle'
次に、アプリモジュール内に次の内容のjacoco.gradleファイルを作成します。
プラグインを適用: 'jacoco'
ジャココ {
ツールバージョン「0.7.1.201405082137」
}
def getFlavorFromVariant(String variantName) {
defflavorString = variantName.replaceAll(/(.*)([AZ].*)/) {すべて、flavorName、buildTypeName ->
フレーバー名
}
フレーバー文字列を返します。
}
def getBuildTypeFromVariant(String variantName) {
def buildTypeString = variantName.replaceAll(/(.*)([AZ].*)/) { すべて、フレーバー名、ビルドタイプ名 ->
「${buildTypeName.toLowerCase()}」
}
buildTypeString を返します。
}
def getFullTestTaskName(String variantName) {
return "test${variantName.capitalize()}UnitTest";
}
android.applicationVariants.all { バリアント ->
def variantName = variant.name;
deflavorFromVariant = getFlavorFromVariant("${variantName}");
def buildTypeFromVariant = getBuildTypeFromVariant("${variantName}");
def testTaskName = getFullTestTaskName("${variantName}")
task ("jacoco${variantName.capitalize()}TestReport"、タイプ: JacocoReport、dependsOn: testTaskName) {
グループ = "レポート"
description = "バリアントのテストを実行した後、JaCoCo カバレッジ レポートを生成します: ${variantName}。"
レポート {
xml.enabled = true
html.enabled = true
}
classDirectories = fileTree(
dir: "./build/intermediates/classes/${flavorFromVariant}/${buildTypeFromVariant}",
除外: ['**/R*.class',
'**/*$InjectAdapter.class',
'**/*$ModuleAdapter.class',
「**/*$ViewInjector*.class」
]
)
logger.info("フレーバー用に JaCoCo を構成しています: ${flavorFromVariant}、buildType: ${buildTypeFromVariant}、タスク: ${testTaskName}");
デフカバレッジSourceDirs = [
'../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 { ファイル ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}
}
次のようにコマンドラインから実行できます。
.gradlew jacocoFlavor1DebugTestReport
また
.gradlew jacocoOtherflavorPrereleaseTestReport
私たちのプロジェクトでは、フレーバー名とビルド タイプ名に大文字を使用しないという規則を使用していますが、プロジェクトがこの規則に従っていない場合は、getFlavorFromVariant(..)およびgetBuildTypeFromVariant(..)関数を変更するだけです。
これが誰かを助けることを願っています