工具版本
- 毕业 5.6.4
- 爪哇 1.8
- jacoco 工具版本 0.8.2
项目结构
├── build.gradle
├── app
│ ├── build.gradle (1)
│ └── src
├── submodule_1
│ ├── build.gradle (2)
│ └── src
├── submodule_2
│ ├── build.gradle (3)
│ └── src
├── submodule_3
│ ├── build.gradle (4)
│ └── src
├── submodule_...
├── gradle
│ ├── jacoco_ui.gradle # JacocoReport task; imported by each build.gradle
│ └── other_scripts.gradle
描述
我希望针对 UI 测试中生成的执行数据对应用程序和每个子模块进行代码覆盖。
将子模块引入主项目应用程序的方式有 3 种:
直接依赖:
申报
implementation project(':submodule_1')
_build.gradle (1)
间接依赖:
申报
implementation project(':submodule_2')
_build.gradle (2)
间接依赖 - jar:
compileOnly fileTree(include: '*.jar', dir: '../exclude_libs')
在其他子模块中声明,其中submodule_3
被打包到一个名为exclude_libs的目录下的 jar 中。
对于 Type 1 和 Type 2, Jacoco根据这个 issue通过将以下配置添加到 build.gradle 来成功处理它们。似乎 gradle 会自动选择对app:assembleDebug
任务使用调试类型的子模块。
buildTypes {
debug {
testCoverageEnabled true
}
}
但是,此方法不适用于 Type 3。
问题:如何从子模块生成检测的 jar 文件?
我找到了一个相关的问题,但我认为它是无助的,因为我想在与 jacoco-plugin 捆绑之前/期间处理代码。
以下代码显示了生成 jar 文件的任务build.gradle (4)
:
def outputDir = file("../exclude_libs")
def aarFile = file("${project.buildDir}/outputs/aar/submodule_3-release.aar")
task buildBasePlugin(dependsOn: [":submodule_3:bundleReleaseAar"]) {
doLast {
copy {
from (zipTree(aarFile)) {
include('classes.jar')
}
into outputDir
rename {
'submodule_3.jar'
}
}
}
}
我试过的
由于我发现testCoverageEnabled true
不适用于release
构建类型,因此我认为调试版本可能会起作用。
- 加入.
buildTypes {debug{ testCoverageEnabled true }}
_build.gradle (4)
- 修改
aarFile
和依赖任务如下def aarFile = file("${project.buildDir}/outputs/aar/submodule_3-debug.aar") task buildBasePlugin(dependsOn: [":submodule_3:bundleDebugAar"]) {...}
- 执行
buildBasePlugin
任务以更新exclude_libs中的 jar 。 - 清理并重建项目,然后运行
app:assembleDebug
以获取apk文件。
结果:检查apk中submodule_3的类的字节码,没有找到 Jacoco 的指令,这意味着 jar 文件没有被检测。我不知道出了什么问题。