【问题标题】:SonarQube Test Coverage with MsTest使用 MsTest 的 SonarQube 测试覆盖率
【发布时间】:2015-10-26 12:33:13
【问题描述】:

我一直在尝试让SonarQube 使用一个简单的 dot net 应用程序。我已成功启动并运行它,但代码覆盖率不起作用。

当 SonarQube 停止支持许多“转到”覆盖工具(例如 DotCover and OpenCover via Gallio)时,看起来许多其他人都面临过这个问题

我遵循的示例是:

我尝试了一些 VS 命令行工具来生成.coverage 文件

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

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

并编写了一些代码,例如将其从 here 转换为 .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>

甚至使用 XSLT 样式表提供了一个可供 SonarQube 运行器使用的样式表

<?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>

当我运行声纳时

  1. MSBuild.SonarQube.Runner.exe 开始
  2. MSBuild
  3. MSBuild.SonarQube.Runner.exe 结束

我收到类似 Caused By: unknown XML Node, Expect Coverage 但 得到了结果

这是因为它不喜欢我的 XML 的结构,但我不确定预期的内容以及我必须对覆盖文件做多少工作才能将其转换为 Sonar 喜欢的格式

希望我走错了路,有一种简单的方法可以将 VS Coverage 或 coveragexml 文件集成到 Sonar 中而无需太多工作

关于我的Sonar plugins 的额外信息是

  1. c# = 4.1
  2. 通用覆盖率 = 1.1

【问题讨论】:

    标签: sonarqube code-coverage mstest vstest


    【解决方案1】:

    C# 4.1 插件支持 OpenCover 和 dotCover 报告。分别为这两个工具设置sonar.cs.dotcover.reportsPathssonar.cs.opencover.reportsPaths 属性以导入代码覆盖率。

    Gallio 并不完全是首选工具:该项目自 2013 年以来一直处于非活动状态。依赖于 Gallio 的 SonarQube C# Plugin 2.x 插件的主要问题是它自己启动了 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 来转换代码覆盖率报告格式,而是使用 CodeCoverage.exe Microsoft 工具。

    【讨论】:

    • 感谢您的快速回复!那工作得很好。我使用 CodeCoverage.exe 导入了代码覆盖率。我们不使用 TFS(TeamCity 是我们的标准),所以我没有探索该选项。我没有尝试过 OpenCover 或 DotCover 建议的解决方案,但会尝试并报告。
    • @user3210699 嗨,你有没有让 OpenCover 选项与 MSTest 一起使用?
    • 嗨,我只用 VSTest 尝试过 OpenCover,但我希望 MSTest 能以类似的方式工作。您可以查看docs.sonarqube.org/display/PLUG/… 以获取完整说明。
    • @Dinesh-SonarSourceTeam 是否可以通过 tfs vnext 构建步骤添加如何执行此操作?
    • @fluf 如果您使用的是 VSTest 任务,那么只需启用代码覆盖率就足够了。如果您正在运行 3rd 方代码覆盖工具,那么您可以使用命令任务运行任何命令。
    【解决方案2】:

    请确保以下事项:

    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)

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

    【讨论】:

      猜你喜欢
      • 2021-07-09
      • 2022-07-01
      • 2018-10-18
      • 2015-03-13
      • 2014-05-04
      • 2016-09-13
      • 2021-03-03
      • 2020-09-22
      • 2021-10-23
      相关资源
      最近更新 更多