Ser*_*ici 36 android unit-testing jacoco android-gradle-plugin
我最近开始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)
Run Code Online (Sandbox Code Playgroud)
有关更清晰的图片,请参阅jacoco-example项目.
我试图集成JaCoCo来生成单元测试的报告,但在我看来,它只运行androidTests基本上是仪器测试.
经过一些谷歌搜索后,我遇到了一些关于GitHub和其他文章的项目,但他们主要关注的是以前的版本,android-gradle-plugin或者正在使用其他第三方插件android-unit-test ,例如这里.
可能是我失去了谷歌的能力.但有人能指出我可以找到一些关于android gradle插件中的新内容以及如何仅针对单元测试运行jacoco任务的文档吗?
UPDATE
采用了nenick的例子中的脚本:
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'
}
Run Code Online (Sandbox Code Playgroud)
之后./gradlew jacocoReport执行并生成报告,但它显示0(零)测试覆盖率,这是不可能的,因为至少有一半的类被测试.
UPDATE_2
试过这个例子.将下一个任务添加到我的一个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
}
}
Run Code Online (Sandbox Code Playgroud)
同样的问题,生成了报告,但代码覆盖率仍为零.
UPDATE_3
它接收来自UPDATE_2的任务有效,但仅适用于具有apply plugin: 'com.android.application'(正确生成报告)的模块.但对于android库(apply plugin: 'com.android.library')的模块,报告显示零覆盖,尽管模块包含更多测试,然后是应用程序模块.
UPDATE_4
创建了一个演示我的问题的简单示例项目.目前,如果运行./gradlew jacocoReport生成报告,则不会为模块项目显示测试覆盖率.看到这个链接
简短说明:当测试是AndroidUnitTests(whiteout JUnit 4和Robolectric)时,JaCoCo报告显示所有模块的覆盖范围.
有任何想法吗?
Nik*_*las 14
麻烦之后我决定为此创建一个开源Gradle插件.
Root build.gradle
buildscript {
repositories {
mavenCentral() // optional if you have this one already
}
dependencies {
classpath 'com.vanniktech:gradle-android-junit-jacoco-plugin:0.8.0'
}
}
apply plugin: 'com.vanniktech.android.junit.jacoco'
Run Code Online (Sandbox Code Playgroud)
然后简单地执行
./gradlew jacocoTestReportDebug
Run Code Online (Sandbox Code Playgroud)
它将在调试模式下运行JUnit测试,然后在相应的构建目录中以xml和html形式提供Jacoco输出.
它还支持口味.有两种颜色的红色和蓝色这些任务将被创建
在进行了一些额外的搜索之后,我偶然发现了这个项目, 我不得不进行一些修改,以便解决方案可以适用于我的项目类型,但现在可以正确生成测试覆盖率报告.
我已将所采用的更改推送到我的示例github repo,以防将来有人遇到类似的问题.
| 归档时间: |
|
| 查看次数: |
17602 次 |
| 最近记录: |