我正在使用针对我的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报告中也需要反映相同的情况。
答案 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上工作并提供上述问题的原因。