【发布时间】:2015-02-18 15:10:12
【问题描述】:
我最近开始在我的一个项目中集成android-gradle-plugin 1.1.0。该项目使用robolectric 2.4 运行单元测试。
这是一个多模块项目,具有非常复杂的依赖关系(一些模块依赖于其他模块)。类似的东西:
--> application-module (dependsOn: module1, module2, module-core)
--> module1 (dependsOn: module-core)
--> module2 (dependsOn: module-core)
--> module-core (dependsOn: module3, module4)
--> module3 (library dependencies)
--> module4 (library dependencies)
更清晰的图片请查看jacoco-example项目。
我尝试集成 JaCoCo 以生成单元测试报告,但在我看来,它只运行 androidTests,这基本上是仪器测试。
经过一些谷歌搜索后,我在 GitHub 和其他文章上发现了一些项目,但它们主要集中在 android-gradle-plugin 的早期版本或使用其他第三方插件,如 android-unit-test for example here。
可能是我失去了使用 Google 搜索的能力。但是有人可以指出我可以找到一些关于 android gradle 插件中的新内容以及如何仅针对单元测试运行 jacoco 任务的文档的方向吗?
更新
采用nenick's example的脚本:
apply plugin: "jacoco"
configurations {
jacocoReport
}
task jacocoReport(dependsOn: 'testDebug') << {
ant {
taskdef(name:'jacocoreport',
classname: 'org.jacoco.ant.ReportTask',
classpath: configurations.jacocoReport.asPath)
mkdir dir: "${buildDir}/test-coverage-report"
mkdir dir: "${buildDir}/reports/jacoco/test/"
jacocoreport {
executiondata = files("${buildDir}/jacoco/testDebug.exec")
structure(name: "${rootProject.name}") {
classfiles {
fileset (dir: "${buildDir}/intermediates/classes/debug") {
//exclude(name: '**/*_*.class')
exclude(name: '**/R.class')
exclude(name: '**/R$*.class')
exclude(name: '**/BuildConfig.class')
}
}
sourcefiles {
fileset dir: "src/main/java"
fileset dir: "${buildDir}/generated/source/buildConfig/debug"
fileset dir: "${buildDir}/generated/source/r/debug"
}
}
xml destfile: "${buildDir}/reports/jacoco/test/jacocoTestReport.xml"
html destdir: "${buildDir}/test-coverage-report/"
}
}
}
dependencies {
jacocoReport 'org.jacoco:org.jacoco.ant:0.7.2.201409121644'
}
之后,./gradlew jacocoReport 执行并生成报告,但它显示 0(零)测试覆盖率,这是不可能的,因为至少有一半的类都经过测试。
UPDATE_2
试用了这个example。将下一个任务添加到我的一个 gradle 构建文件中:
task jacocoTestReport(type:JacocoReport, dependsOn: "testDebug") {
group = "Reporting"
description = "Generate Jacoco coverage reports"
classDirectories = fileTree(
dir: "${buildDir}/intermediates/classes/debug",
excludes: ['**/R.class',
'**/R$*.class',
'**/*$ViewInjector*.*',
'**/BuildConfig.*',
'**/Manifest*.*']
)
sourceDirectories = files("${buildDir.parent}/src/main/java")
additionalSourceDirs = files([
"${buildDir}/generated/source/buildConfig/debug",
"${buildDir}/generated/source/r/debug"
])
executionData = files("${buildDir}/jacoco/testDebug.exec")
reports {
xml.enabled = true
html.enabled = true
}
}
同样的问题,生成了报告,但代码覆盖率仍然为零。
UPDATE_3
UPDATE_2 中的任务似乎有效,但仅适用于具有apply plugin: 'com.android.application' 的模块(报告正确生成)。但是对于 android 库 (apply plugin: 'com.android.library') 的模块,报告显示零覆盖率,尽管模块包含比应用程序模块更多的测试。
UPDATE_4
创建了一个简单的示例项目来演示我的问题。目前,如果您运行./gradlew jacocoReport,则会生成报告,但不会显示模块项目的测试覆盖率。看到这个link
简短说明:当测试是 AndroidUnitTests(白化 JUnit 4 和 Robolectric)时,JaCoCo 报告显示所有模块的覆盖率。
有什么想法吗?
【问题讨论】:
-
我在 1.1-rc1 中有类似的工作(不可靠)。现在我正在运行 1.1 final 并且只会出错。期待其他回复。
-
gradle-android 相关问题:code.google.com/p/android/issues/detail?id=144664
-
您似乎正在尝试为多项目设置生成覆盖范围?我之前也遇到过类似的问题,详细的解决方法在我的博客里:hidroh.github.io/2014/05/15/…
-
UPDATE_2 在 gradle 1.1.3 的库项目中为我工作
-
那么您是否能够获得代码覆盖率统计信息?我只能获取“androidTest”的代码覆盖率统计信息,但我想分析“test”。
标签: android unit-testing android-gradle-plugin jacoco