Ich verwende JaCoCo mit einem Projekt mit RoboGuice, Buttermesser und Robolectric. Ich konnte es mit der Lösung von @Hieu Rocker einrichten, jedoch gab es einige kleinere Nachteile, d. H. In unserem Projekt verwenden wir Aromen und haben einige zusätzliche Tests für diese Aromen sowie zusätzlichen Java-Code für jede von ihnen. Wir verwenden auch verschiedene Build-Typen. Daher war eine Lösung, die auf die Aufgabe "testDebug" angewiesen war, nicht gut genug. Hier ist meine Lösung: In build.gradle in App Modul
hinzufügen
apply from: '../app/jacoco.gradle'
dann innerhalb von App Modul mit folgendem Inhalt eine jacoco.gradle-Datei erstellen:
apply plugin: 'jacoco'
jacoco {
toolVersion "0.7.1.201405082137"
}
def getFlavorFromVariant(String variantName) {
def flavorString = variantName.replaceAll(/(.*)([A-Z].*)/) { all, flavorName, buildTypeName ->
flavorName
}
return flavorString;
}
def getBuildTypeFromVariant(String variantName) {
def buildTypeString = variantName.replaceAll(/(.*)([A-Z].*)/) { all, flavorName, buildTypeName ->
"${buildTypeName.toLowerCase()}"
}
return buildTypeString;
}
def getFullTestTaskName(String variantName) {
return "test${variantName.capitalize()}UnitTest";
}
android.applicationVariants.all { variant ->
def variantName = variant.name;
def flavorFromVariant = getFlavorFromVariant("${variantName}");
def buildTypeFromVariant = getBuildTypeFromVariant("${variantName}");
def testTaskName = getFullTestTaskName("${variantName}")
task ("jacoco${variantName.capitalize()}TestReport", type: JacocoReport, dependsOn: testTaskName) {
group = "Reporting"
description = "Generate JaCoCo coverage reports after running tests for variant: ${variantName}."
reports {
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("Configuring JaCoCo for flavor: ${flavorFromVariant}, buildType: ${buildTypeFromVariant}, task: ${testTaskName}");
def coverageSourceDirs = [
'../app/src/main/java',
"../app/src/${flavorFromVariant}/java"
]
sourceDirectories = files(coverageSourceDirs)
executionData = files("$buildDir/jacoco/${testTaskName}.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('$$', '$'))
}
}
}
}
}
Sie können es über die Befehlszeile wie folgt ausführen:
.gradlew jacocoFlavor1DebugTestReport
oder
.gradlew jacocoOtherflavorPrereleaseTestReport
In unserem Projekt verwenden wir eine Konvention nicht Großbuchstaben innerhalb des Aromas zu verwenden und Typnamen zu bauen, aber wenn Ihr Projekt können Sie einfach getFlavorFromVariant ändert sich nicht an dieser Konvention (. .) und getBuildTypeFromVariant (..) Funktionen
Hoffnung hilft dieses jemand
Testabdeckung wird vom android Gradle Plugin noch nicht unterstützt. Ich bin auf der Suche nach einem Weg, um zu erreichen, aber es sieht hoffnungslos jetzt aus, wie die Gradle-Plugin für Android Android nicht sagen, um jede Berichterstattung zu generieren. – Snicolas
bis das Java-Plugin und das Android-Plugin miteinander kompatibel sind, können Sie ant.java verwenden, um die Tests auszuführen und auch den Abdeckungsbericht zu erstellen. tun Sie im Grunde, was Sie in ANT tun würden. – skipy
@skipy: Hast du ein Beispiel, wie man das in Ameisen macht? Ich konnte kein Beispiel für die Konfiguration von 'jacocoagent' finden und den Bericht vom Emulator abrufen. – unholysampler