0

工具版本

  • 毕业 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 种:

  1. 直接依赖

    申报implementation project(':submodule_1')_build.gradle (1)

  2. 间接依赖

    申报implementation project(':submodule_2')_build.gradle (2)

  3. 间接依赖 - 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构建类型,因此我认为调试版本可能会起作用。

  1. 加入. buildTypes {debug{ testCoverageEnabled true }}_build.gradle (4)
  2. 修改aarFile和依赖任务如下
    def aarFile = file("${project.buildDir}/outputs/aar/submodule_3-debug.aar")
    task buildBasePlugin(dependsOn: [":submodule_3:bundleDebugAar"]) {...}
    
  3. 执行buildBasePlugin任务以更新exclude_libs中的 jar 。
  4. 清理并重建项目,然后运行app:assembleDebug以获取apk文件。

结果:检查apk中submodule_3的类的字节码,没有找到 Jacoco 的指令,这意味着 jar 文件没有被检测。我不知道出了什么问题。

4

0 回答 0