使用MsTest进行SonarQube测试覆盖

时间:2015-08-04 07:52:11

标签: sonarqube code-coverage mstest vstest

我一直试图让SonarQube使用简单的点网应用。我已经取得了一些成功,但是代码覆盖率无法正常运行。

当SonarQube停止支持许多“转到”覆盖工具(例如DotCover and OpenCover来自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>
  

当我运行Sonar时

     
      
  1. MSBuild.SonarQube.Runner.exe开始
  2.   
  3. 的MSBuild
  4.   
  5. MSBuild.SonarQube.Runner.exe结束
  6.         

    我收到的问题包括:unknown XML Node,期望覆盖但是   得到结果

这是因为它不喜欢我的XML结构,但我不确定是什么是期望的以及我需要对coverage文件做多少工作才能将其转换为Sonar喜欢的格式

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

  

我的Sonar plugins的额外信息

     
      
  1. c#= 4.1
  2.   
  3. Generic Coverage = 1.1
  4.   

2 个答案:

答案 0 :(得分:5)

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选项一样。

现在,微软有两种不同的.coveragexml格式是非常不幸和令人困惑的,而且SonarQube C#插件只支持其中一种(即现在。请参阅http://jira.sonarsource.com/browse/SONARNTEST-3)。< / p>

在等待修复故障单时,以下是生成预期.coveragexml报告的步骤(注意:如果您使用VS,请在各种路径中将14替换为12 2013年而不是2015年):

  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
  6. 我不建议使用XSLT转换代码覆盖率报告格式,而是使用CodeCoverage.exe Microsoft工具。

答案 1 :(得分:0)

请确保以下内容:

1)?构​​建过程中是否生成了Coverage文件?

如果未生成,则可能需要更新构建脚本以生成一个脚本,否则需要在构建自动化工具中添加一个显式步骤来生成它。

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)

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