我在一个使用 RoboGuice、Butterknife 和 Robolectric 的项目中使用 JaCoCo。我可以使用@Hieu Rocker 的解决方案来设置它,但是有一些小缺点,即在我们的项目中,我们使用了各种风格,并且对这些风格进行了一些额外的测试,并为它们中的每一个提供了额外的Java 代码。我们还使用不同的构建类型。因此,依赖“testDebug”任务的解决方案还不够好。这是我的解决方案:在app模块中的build.gradle中添加
apply from: '../app/jacoco.gradle'
然后在app模块内创建一个jacoco.gradle文件,内容如下:
应用插件:'jacoco'
雅可{
工具版本“0.7.1.201405082137”
}
def getFlavorFromVariant(字符串变体名称){
def flavorString = variantName.replaceAll(/(.*)([AZ].*)/) { all, flavorName, buildTypeName ->
风味名称
}
返回风味字符串;
}
def getBuildTypeFromVariant(字符串变体名称){
def buildTypeString = variantName.replaceAll(/(.*)([AZ].*)/) { all, flavorName, buildTypeName ->
“${buildTypeName.toLowerCase()}”
}
返回构建类型字符串;
}
def getFullTestTaskName(字符串变体名称){
return "test${variantName.capitalize()}UnitTest";
}
android.applicationVariants.all { 变体 ->
def 变体名称 = 变体名称;
def flavorFromVariant = getFlavorFromVariant("${variantName}");
def buildTypeFromVariant = getBuildTypeFromVariant("${variantName}");
def testTaskName = getFullTestTaskName("${variantName}")
任务(“jacoco${variantName.capitalize()}TestReport”,类型:JacocoReport,dependsOn:testTaskName){
组=“报告”
description = "在运行变体测试后生成 JaCoCo 覆盖率报告:${variantName}。"
报告{
xml.enabled = 真
html.enabled = 真
}
类目录 = 文件树(
目录:“./build/intermediates/classes/${flavorFromVariant}/${buildTypeFromVariant}”,
排除:['**/R*.class',
'**/*$InjectAdapter.class',
'**/*$ModuleAdapter.class',
'**/*$ViewInjector*.class'
]
)
logger.info("为风味配置 JaCoCo:${flavorFromVariant},构建类型:${buildTypeFromVariant},任务:${testTaskName}");
def coverageSourceDirs = [
'../app/src/main/java',
“../app/src/${flavorFromVariant}/java”
]
sourceDirectories = 文件(coverageSourceDirs)
executionData = files("$buildDir/jacoco/${testTaskName}.exec")
// 有点 hacky 但修复了 https://code.google.com/p/android/issues/detail?id=69174。
// 我们遍历编译的 .class 树并将 $$ 重命名为 $。
先做{
new File("$buildDir/intermediates/classes/").eachFileRecurse { 文件 ->
if (file.name.contains('$$')) {
file.renameTo(file.path.replace('$$', '$'))
}
}
}
}
}
您可以像这样从命令行执行它:
.gradlew jacocoFlavor1DebugTestReport
或者
.gradlew jacocoOtherflavorPrereleaseTestReport
在我们的项目中,我们使用约定不要在风味和构建类型名称中使用大写字母,但如果您的项目不遵循此约定,您可以简单地更改getFlavorFromVariant(..)和getBuildTypeFromVariant(..)函数
希望这可以帮助某人