使用MsTest进行SonarQube测试覆盖

use*_*699 9 mstest code-coverage sonarqube vstest

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

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

我遵循的例子是:

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

vstest.console.exe .\UnitTestProject1\bin\Debug\UnitTestProject1.dll /EnableCodeCoverage
Run Code Online (Sandbox Code Playgroud)

和

CodeCoverage.exe collect /output:DynamicCodeCoverage.coverage .\UnitTestProject1\bin\Debug\UnitTestProject1.dll
Run Code Online (Sandbox Code Playgroud)

并写了一些代码,想把它.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>
Run Code Online (Sandbox Code Playgroud)

甚至可以使用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>
Run Code Online (Sandbox Code Playgroud)

当我运行声纳时

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

我得到错误,如引起:unknown XML Node,期望覆盖,但得到结果

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

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

我的额外信息Sonar pluginsARE

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

Din*_*eyn 5

C#4.1插件都支持OpenCover和dotCover报告.分别为两个工具设置sonar.cs.dotcover.reportsPathsor sonar.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) .

在等待被固定的票,这里是产生预期的步骤.coveragexml报告(注:更换14的12,如果您使用的是2015年而不是2013 VS在不同的路径):

  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工具.