VSTS构建和SonarQube的codecoverage报告的差异

时间:2018-03-23 10:53:26

标签: c# sonarqube azure-devops sonarqube-msbuild-runner

我有一套带有几个测试项目的.Net项目。我跑了一个版本,从VSTS构建我看到我的线覆盖%是45.24(8213/18153),但当我从SonarQube看到相同时,它显示我13.3%(361/2717)。我想知道声纳与VSTS相比如何显示不同的指标。此外,在代码覆盖率中分析的二进制数量也从VST到SonarQube不同。这是预期的吗?

  • SonarQube版本:6.7.1,社区版
  • SonarC#version:6.8.2(build 4717)
  • SonarQube VSTS任务版本:3.2.0(4.1版本根本不起作用)
  • 用于MSBuild的SonarScanner:4.1
  • 解决方案版本:VS 2015
  • VSTest Console.exe版本:14.0.25420.1

如果需要进一步调查,请告知我们。

2 个答案:

答案 0 :(得分:2)

除了上述建议之外,还有其他几个原因可以解释为什么VSTS中报告的整体覆盖率不同(假设您使用的是标准VS代码覆盖率工具并且未提供任何特殊配置)。

VS代码覆盖率工具的默认行为是在计算覆盖率数时包含测试代码,即VSTS中报告的数量是 [测试代码+产品代码] 的覆盖范围,而在SonarQube中报告的数字仅考虑产品代码。

因此,如果VS报告的总覆盖率为80%,则意味着80%的 [test + product] 代码行正在执行。但是,通常情况下几乎所有测试代码都在执行,因此测试代码的代码覆盖率可能高于80%,这意味着产品代码的代码覆盖率将低于80%报告(我最后一次详细分析解决方案的VS代码覆盖率报告时,产品代码的覆盖率比构建报告的摘要数字低10%)。

此外,如果pdb文件可用,VS覆盖率编号还将包括不属于您的解决方案的程序集(我正在查看包含第三方 fluentassertions的覆盖率报告的示例。 core.dll fluentassertions.dll 程序集,两者都显示为> 95%未涵盖)。

VSTS可以非常轻松地设置收集代码覆盖率 - 您只需单击构建定义中的复选框,该编号就会显示在构建摘要页面上。直观地说,您可能希望这个数字是产品代码的覆盖范围(这是SonarQube显示的内容)。然而,几乎可以肯定的是,开箱即用的情况并非如此。包含测试代码往往会使数字向上倾斜,而任何包含pdbs的第三方程序集都会倾向于向下倾斜数字。

如果您想确切了解覆盖率报告中包含哪些项目和程序集,最简单的方法是单击构建摘要页面并在VS中打开它。下载它。

可以更改默认的VS行为以获得产品代码的覆盖范围,但这并不是特别简单。有关详细信息,请参阅MSDN上的Customize code coverage analysis

答案 1 :(得分:1)

数字的差异很可能是由SonarC#的可执行行计算引起的。详细解释in this blog post

简而言之:可执行行计数被输入到覆盖范围报头中未显示的文件的覆盖范母。在计算该百分比时,原生工具会忽略它们的存在。 SonarQube的覆盖率较低,因为它会将所有文件考虑在内。

附录:我的答案是(正确的)与语言无关的。 duncanp的答案是MSDN特定的,因此在这种情况下可能更具相关性。