gpt4 book ai didi

java - 如何解决使用 Gradle 的 Java 项目的 Cobertura 代码覆盖率不一致问题?

转载 作者:行者123 更新时间:2023-12-02 05:37:55 24 4
gpt4 key购买 nike

我正在为我的 Java 项目使用 Cobertura Gradle 插件来生成代码覆盖率报告。 Cobertura 在我的 Windows 机器上提供了一致的报告,但是当我在 Jenkins 服务器上运行相同的版本并使用声纳扫描仪在 SonarQube 上发布报告时,我可以看到不一致的覆盖率报告。每个构建都给出不同的覆盖百分比。
Cobertura版本:2.1.1
Cobertura Gradle 插件版本:'net.saliman:gradle-cobertura-plugin:2.3.2'
Java版本:1.7
Gradle 版本:3.5

我尝试在信息模式下调试 gradle 构建,并在记录日志时发现 classNotFoundException,因此我尝试使用 gradle cobertura 插件的 auxillaryClasspath 设置手动添加所有依赖项,但没有成功。

Cobertura.gradle 文件

buildscript {
repositories {
maven { url 'http://central.maven.org/maven2/' }
mavenLocal()
dependencies.classpath 'org.apache.commons:commons-lang3:3.2',
'oro:oro:2.0.8',
'org.ow2.asm:asm:5.0.1',
'org.ow2.asm:asm-analysis:5.0.1',
'org.ow2.asm:asm-commons:5.0.1',
'org.ow2.asm:asm-tree:5.0.1',
'org.ow2.asm:asm-util:5.0.1',
'net.saliman:gradle-cobertura-plugin:2.3.2'
}
}

apply plugin: net.saliman.gradle.plugin.cobertura.CoberturaPlugin

def jobpath = new File(buildDir.toString() + "/reports/cobertura")
cobertura {
coverageFormats = ['html', 'xml']
coverageReportDir = jobpath
}
test.finalizedBy(project.tasks.cobertura)


文件的Main build.gradle部分粘贴在此处

apply plugin: 'java'
apply from: 'cobertura.gradle'
...
...
test {
forkEvery = 2
maxParallelForks = 4
maxHeapSize = "2048m"
afterTest { TestDescriptor td, TestResult tr ->
println "${tr} ${td}"
}
}
....
...
dependencies{
...
..
}

Windows 计算机上的覆盖率为 85%,并且保持一致,因此 Jenkins 服务器报告也需要反射(reflect)同样的情况。

最佳答案

我尝试通过使用 "--info" 命令运行 gradle 构建来分析 cobertura 日志,发现在插入 cobertura 时正在编写 349 个类,但在生成报告时它正在加载随机数类。但在我的 Windows 机器上,它保存和加载相同数量的类,即 349。

在 Jenkins 服务器上构建日志:
15:17:27 04:47:27.782 [INFO] [net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler] Cobertura:保存了 349 个类的信息...
15:18:14 04:48:14.326 [INFO] [net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler] Cobertura:已加载有关 181 个类的信息

在 Windows 笔记本电脑上构建日志:
14:30:25.745 [INFO] [net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler] Cobertura:保存了 349 个类的信息...
14:31:58.940 [INFO] [net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler] Cobertura:已加载有关 349 个类的信息。

我检查了cobertura问题列表,发现编写cobertura.ser文件时存在并发问题。 https://github.com/cobertura/cobertura/issues/342

解决方法是在运行测试用例时删除并行 fork 。

由于我们在主 build.gradle 中使用 ma​​xParallelForks = 4,并行执行器损坏了 .ser 文件。

我已从测试任务中删除了 ma​​xParallelForks = 4,因为默认情况下它将使用 1,并且 Jenkins 服务器已开始提供与 Windows 计算机相同的覆盖范围。

我们的 Jenkins 服务器是一台具有多核处理器的强大机器,我认为这就是并行 fork 在 Jenkins 上工作并给我们带来上述问题的原因。

关于java - 如何解决使用 Gradle 的 Java 项目的 Cobertura 代码覆盖率不一致问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56155423/

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