Java 声纳假全覆盖(jacoco)

Java 声纳假全覆盖(jacoco),java,sonarqube,jacoco,Java,Sonarqube,Jacoco,我负责Jacoco和Sonar的多模块Java8项目。 我在每个模块中都有单元测试,为了节省资源,我将所有“集成测试”收集到一个“集成测试运行器”中,并在那里运行它们(用前后测试包装它们) 测量覆盖率时,UT会为每个模块target/jacoco-UT.exec生成exec文件,而模块生成一个exec文件:/target/jacoco-IT.exec 当我运行sonar时,我会重用这些exec文件,并给出jacoco-it.exec的路径 我得到一个非常奇怪的图像: 总覆盖率怎么会更低呢?为什

我负责Jacoco和Sonar的多模块Java8项目。 我在每个模块中都有单元测试,为了节省资源,我将所有“集成测试”收集到一个“集成测试运行器”中,并在那里运行它们(用前后测试包装它们)

测量覆盖率时,UT会为每个模块target/jacoco-UT.exec生成exec文件,而模块生成一个exec文件:/target/jacoco-IT.exec

当我运行sonar时,我会重用这些exec文件,并给出jacoco-it.exec的路径

我得到一个非常奇怪的图像:


总覆盖率怎么会更低呢?

为什么这么奇怪?单元测试和集成测试执行代码,某些执行的代码块重叠。换句话说,单元测试和集成测试所涵盖的代码不是不相交的,因此您不能简单地将它们相加。

我找到了问题和解决方案

:

默认情况下,当未找到覆盖率报告时,JaCoCo插件将 未为覆盖率度量设置任何值。这种行为可能是错误的 覆盖以强制覆盖率为0%,以防 设置以下属性:
sonar.jacoco.reportMissing.force.zero=true


这意味着未进行任何测试的模块将跳过UT分析。 由于我已从父pom设置了
sonar.jacoco.itReportPath
,因此对所有模块进行了集成测试覆盖率和总体覆盖率分析。

底线:从父pom设置属性
sonar.jacoco.reportMissing.force.zero=true
修复了这些数字。

这并不能解释为什么总体覆盖率低于单元测试覆盖率,是吗?两种测试类型的底层代码是否完全相同?生成的代码覆盖率文件是否包含覆盖指令的绝对数量?使用Sonar Java插件2.9.2和jacoco插件0.7.3.20150219951