Я использую JaCoCo с проектом с помощью RoboGuice, и Robolectric нож для масла. Я смог настроить его с помощью решения @Hieu Rocker, однако были некоторые незначительные недостатки, то есть в нашем проекте мы используем ароматы и дополнительные тесты для этих ароматов, а также дополнительный код Java для каждого из них. Мы также используем разные типы сборки. Поэтому решение полагаться на задачу «testDebug» было недостаточно. Вот мое решение: В build.gradle в приложение модуль добавить
apply from: '../app/jacoco.gradle'
Затем создайте jacoco.gradle файл внутри приложения модуля со следующим содержанием:
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('$$', '$'))
}
}
}
}
}
Вы можете выполнить его из командной строки следующим образом:
.gradlew jacocoFlavor1DebugTestReport
или
.gradlew jacocoOtherflavorPrereleaseTestReport
В нашем проекте мы используем соглашение не использовать прописную букву внутри аромата и строить имена типов, но если ваш проект не следовать этому соглашению, вы можете просто изменить getFlavorFromVariant (. ,) и getBuildTypeFromVariant (..) функции
Надеется, что это помогает кому-то
Тестовое покрытие еще не поддерживается плагином-градиентом android. Я тоже ищу способ достичь, но теперь он выглядит безнадежным, поскольку плагин gradle для android не сообщает андроиду для создания любого покрытия. – Snicolas
до тех пор, пока плагин java и плагин android не будут совместимы, вы можете использовать ant.java для выполнения тестов, а также создать отчет о покрытии. в основном делайте то, что вы сделали бы в ANT. – skipy
@skipy: У вас есть пример того, как это сделать в муравье? Я не смог найти пример настройки jacocoagent и получения отчета от эмулятора. – unholysampler