如何为使用Gradle的Java Project解决Cobertura不一致的代码覆盖率问题?

时间:2019-05-15 18:17:20

标签: java gradle code-coverage cobertura

我正在使用针对我的Java项目的Cobertura Gradle插件来生成代码覆盖率报告。 Cobertura在我的Windows机器上给出一致的报告,但是当我在Jenkins服务器上运行相同的版本并使用声纳扫描仪在SonarQube上发布报告时,我会看到不一致的覆盖率报告。每个版本都提供不同的覆盖率百分比。
Cobertura版本:2.1.1
Cobertura Gradle插件版本:“ net.saliman:gradle-cobertura-plugin:2.3.2”
Java版本:1.7
摇篮版本: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)


文件的主要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 Server报告中也需要反映相同的情况。

1 个答案:

答案 0 :(得分:0)

我试图通过使用“-info” 命令运行gradle build来分析cobertura日志,发现在入侵cobertura时正在编写349类,而在生成报告时却在加载随机数类。但是在我的Windows计算机上,它正在保存和加载相同数量的类,即349。

在Jenkins服务器上构建日志:
15:17:27 04:47:27.782 [INFO] [net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler] Cobertura: Saved information on 349 classes ...
15:18:14 04:48:14.326 [INFO] [net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler] Cobertura: Loaded information on 181 classes

在Windows笔记本电脑上构建日志:
14:30:25.745 [INFO] [net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler] Cobertura: Saved information on 349 classes ...
14:31:58.940 [INFO] [net.sourceforge.cobertura.coveragedata.CoverageDataFileHandler] Cobertura: Loaded information on 349 classes.

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

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

在主 build.gradle 中使用 maxParallelForks = 4 时,并行执行程序正在破坏.ser文件。

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

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