我使用JaCoCo使用RoboGuice,Butterknife和Robolectric项目。我可以使用@Hieu Rocker的解决方案进行设置,但是存在一些小缺陷,即在我们的项目中,我们使用了flavor,并且为这些flavor定义了额外的测试,并为它们中的每一个添加了额外的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的gradle插件并没有告诉android生成任何覆盖。 – Snicolas
,直到java插件和android插件兼容,你可以使用ant.java来执行测试并生成覆盖率报告。基本上做你会在ANT做的事情。 – skipy
@skipy:你有一个如何在蚂蚁做这个例子吗?我一直无法找到配置'jacocoagent'并从模拟器获取报告的例子。 – unholysampler