gpt4 book ai didi

java - 在 gradle mutlimodule 项目中使用 Jacoco 离线检测实现跨模块代码覆盖

转载 作者:行者123 更新时间:2023-12-02 04:56:11 25 4
gpt4 key购买 nike

我必须在我的项目中使用Jacoco离线工具,因为也使用了PowerMock。

问题描述:假设您的 gradle 项目包含两个模块:A、B。模块 A 的测试覆盖了模块 B 中的代码。在代码覆盖率数据收集中,我发现模块 B 的覆盖率数据(应由模块 A 提供)完全丢失。

我创建了一个测试项目来演示该问题:https://github.com/SurpSG/jacoco-offline-instrumentation

Jacoco gradle 项目的离线检测设置基于答案 https://stackoverflow.com/a/42238982/2689114

另一方面,当我使用 jacoco gradle 插件时,我可以观察到模块 A 为模块 B 提供的覆盖率数据已成功收集到摘要报告中。我又创建了一个测试项目来演示这一点:https://github.com/SurpSG/jacoco-gradle-plugin-merge-coverage

我对 gradle 多模块项目 + jacoco 离线检测的设置是否错误?

最佳答案

经过一番调查,我发现 Gradle 中的模块依赖关系是通过 .jar 文件解决的:

<dependent-module>.classpath contains <dependency-module>.jar

因此,就我而言,我需要构建一些包含检测类的特殊 jar。

仪器类

task preprocessClassesForJacoco(dependsOn: ['classes']) {
ext.outputDir = buildDir.path + '/classes-instrumented'
doLast {
ant.taskdef(name: 'instrument',
classname: 'org.jacoco.ant.InstrumentTask',
classpath: configurations.jacoco.asPath)
ant.instrument(destdir: outputDir) {
fileset(dir: sourceSets.main.java.outputDir, includes: '**/*.class', erroronmissingdir: false)
}
}
}

下一步将构建仪器化 jar:

task jacocoInstrumentedJar(type: Jar, dependsOn: [preprocessClassesForJacoco]) {
baseName "${project.name}-instrumented"
from preprocessClassesForJacoco.outputDir // path to instrumented classes
}

最后,我们需要替换通常的.jar用已检测的一个

gradle.taskGraph.whenReady { graph ->
if (graph.hasTask(preprocessClassesForJacoco)) {
tasks.withType(Test) {
doFirst {
...
// getting a module dependencies
def modulesDependencies = moduleDependencies(project)
// removing regular jars
classpath -= files(modulesDependencies.jar.outputs.files)
// adding instrumented jars
classpath += files(modulesDependencies.jacocoInstrumentedJar.outputs.files)
}
}
}
}

我已经更新了示例项目 https://github.com/SurpSG/jacoco-offline-instrumentation按照上述步骤。欢迎查看该项目进行尝试。

关于java - 在 gradle mutlimodule 项目中使用 Jacoco 离线检测实现跨模块代码覆盖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60009231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com