SonarQube与MsTest的测试覆盖率

11

我一直在尝试将SonarQube与一个简单的.NET应用程序配合使用。我已经成功地启动了它,但代码覆盖率不起作用。

看起来像许多其他人一样,在SonarQube停止支持许多“go to”覆盖工具(如DotCover和OpenCover)之后,许多人都面临了这个问题,通过Gallio

我所遵循的示例包括:

我已经尝试了几个VS命令行工具来生成.coverage文件

vstest.console.exe .\UnitTestProject1\bin\Debug\UnitTestProject1.dll /EnableCodeCoverage

CodeCoverage.exe collect /output:DynamicCodeCoverage.coverage .\UnitTestProject1\bin\Debug\UnitTestProject1.dll

我已经编写了一些代码,可以将其转换为.coveragexml文件,代码可从此处获取。

以获得以下XML:

<?xml version="1.0" standalone="yes"?>
<CoverageDSPriv>
  <Module>
    <ModuleName>unittestproject1.dll</ModuleName>
    <ImageSize>32768</ImageSize>
    <ImageLinkTime>0</ImageLinkTime>
    <LinesCovered>12</LinesCovered>
    <LinesPartiallyCovered>0</LinesPartiallyCovered>
    <LinesNotCovered>0</LinesNotCovered>
    <BlocksCovered>9</BlocksCovered>
    <BlocksNotCovered>0</BlocksNotCovered>
    <NamespaceTable>
      <BlocksCovered>9</BlocksCovered>
      <BlocksNotCovered>0</BlocksNotCovered>
      <LinesCovered>12</LinesCovered>
      <LinesNotCovered>0</LinesNotCovered>

甚至可以使用SonarQube运行程序所提供的XSLT样式表。

<?xml version="1.0" encoding="utf-8"?>
<results>
  <modules>
    <module name="unittestproject1.dll" path="unittestproject1.dll" block_coverage="100" line_coverage="100" blocks_covered="9" blocks_not_covered="0" lines_covered="12" lines_partially_covered="0" lines_not_covered="0">
      <functions>
        <function name="Setup" type_name="UnitTest1" block_coverage="100" line_coverage="100" blocks_covered="1" blocks_not_covered="0" lines_covered="2" lines_partially_covered="0" lines_not_covered="0">
          <ranges>
            <range source_id="1" covered="yes" start_line="13" start_column="9" end_line="13" end_column="10" />
            <range source_id="1" covered="yes" start_line="15" start_column="9" end_line="15" end_column="10" />
          </ranges>
        </function>
当我运行Sonar时,我会得到像“Caused By: 未知XML节点,期望覆盖率(Coverage)而得到结果(Results)”这样的错误。这是因为它不喜欢我的XML结构,但我不确定它期望什么以及我需要多少工作来将覆盖文件转换为Sonar喜欢的格式。希望能有一种简单的方法将VS Coverage或coveragexml文件集成到Sonar中,而不需要太多的工作。
关于我的Sonar插件的额外信息是: c#= 4.1 通用覆盖率= 1.1
2个回答

7
C# 4.1插件支持OpenCover和dotCover报告。分别设置sonar.cs.dotcover.reportsPathssonar.cs.opencover.reportsPaths属性,以导入代码覆盖率。
Gallio并非首选工具:自2013年以来该项目一直处于不活跃状态。 SonarQube C#插件2.x插件依赖于Gallio的主要问题是它通过自身启动Gallio - 不允许最终用户自定义如何启动测试和收集覆盖范围。
现在情况变得更容易了:启动您喜欢的代码覆盖工具,请它生成报告,并将其提供给MSBuild SonarQube Runner。
如果您使用Team Foundation Server 2013,则启用代码覆盖率就像选择构建定义中的Enable Code Coverage选项一样简单。
现在,非常不幸和令人困惑的是,Microsoft有两种不同的.coveragexml格式,而SonarQube C#插件只支持其中一种(即,目前如此。请参阅http://jira.sonarsource.com/browse/SONARNTEST-3)。
在等待修复该票务时,以下是生成预期的.coveragexml报告的步骤(注意:如果您使用VS 2013而不是2015,请在各个路径中将14替换为12):
  1. MSBuild.SonarQube.Runner begin /k:SonarQube_Project_Key /n:SonarQube_Project_Name /v:1.0 /d:sonar.cs.vscoveragexml.reportsPaths=%CD%\VisualStudio.coveragexml
  2. msbuild
  3. "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" collect /output:VisualStudio.coverage "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\CommonExtensions\Microsoft\TestWindow\vstest.console.exe" "UnitTestProject1\bin\Debug\UnitTestProject1.dll"
  4. "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" analyze /output:VisualStudio.coveragexml VisualStudio.coverage
  5. MSBuild.SonarQube.Runner end
我不建议使用XSLT转换代码覆盖报告格式,而应使用Microsoft工具CodeCoverage.exe

谢谢您的快速回复!那个方法完美地解决了我的问题。我使用CodeCoverage.exe导入了代码覆盖率。我们不使用TFS(我们的标准是TeamCity),所以我没有探索那个选项。我还没有尝试OpenCover或DotCover建议的解决方案,但我会尝试并报告结果。 - user3210699
@user3210699 你好,你是否曾经成功地将OpenCover选项与MSTest一起使用? - Saan
嗨,我只尝试过将 OpenCover 与 VSTest 结合使用,但我预期 MSTest 也能以类似的方式工作。您可以查看 http://docs.sonarqube.org/display/PLUG/C%23+Code+Coverage+Results+Import 获取完整的指令。 - Dinesh Bolkensteyn
@Dinesh-SonarSourceTeam,是否可以添加如何在TFS VNext构建步骤中执行此操作的说明? - fluf
如果您正在使用VSTest任务,那么只需在那里启用代码覆盖率即可。如果您正在运行第三方代码覆盖工具,则可以使用命令任务运行任何命令。 - Dinesh Bolkensteyn
@DineshBolkensteyn - 上述操作是否适用于VS2015、Sonarqube 5.6.6和SonarJava 4.11.0.10660?我运行了上述命令,创建了一个大约2MB的覆盖文件,但是没有导入到Sonarqube中。 - Richard Schaefer

0
请确保以下事项:
1)您是否有由构建过程生成的覆盖文件?
如果没有生成该文件,那可能需要更新构建脚本以生成该文件,或者需要在构建自动化工具中添加一个明确的步骤来生成它。
For e.g. "C:\Program Files\dotnet\dotnet.exe" test <Target-filename>.csproj --logger:trx --collect:"Code Coverage"

2) 确保生成 CodeCoverage 文件的 XML 版本。

因此,将会有两个文件:

CodeCoverage (generated using dotnet command)

CodeCoverageXml (This is generated by using "CodeCoverage.exe analyze /output: newfilename Your_CodeCoverage_file" )

3) 在调用SonarQube时,提供的Coveragefile路径是否正确?

4) 您的构建服务器是否安装了正确版本的“Dotnet”,并确保执行相同版本的dotnet?

有时构建服务器会有多个版本的Dotnet(例如v2.0.3和v2.1.0)。

为了生成覆盖率报告,使用正确的版本非常重要,否则将显示为零或不会生成Coverage文件本身。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接