我一直试图让SonarQube与一个简单的点网应用程序一起工作。我已经成功启动并运行了它,但是代码覆盖率无法正常工作。

当SonarQube停止对许多“转到”覆盖工具(例如,通过GallioDotCover and OpenCover)的支持时,似乎其他人也遇到了此问题。



我已经尝试了一些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>



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

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

最佳答案

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

Gallio并不完全是首选工具:该项目自2013年以来就一直处于闲置状态。SonarQube C#Plugin 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):

  • MSBuild.SonarQube.Runner begin /k:SonarQube_Project_Key /n:SonarQube_Project_Name /v:1.0 /d:sonar.cs.vscoveragexml.reportsPaths=%CD%\VisualStudio.coveragexml
  • msbuild
  • "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"
  • "C:\Program Files (x86)\Microsoft Visual Studio 14.0\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" analyze /output:VisualStudio.coveragexml VisualStudio.coverage
  • MSBuild.SonarQube.Runner end

  • 我不建议使用XSLT转换代码覆盖率报告格式,而应使用CodeCoverage.exe Microsoft工具。

    关于具有MsTest的SonarQube测试覆盖率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31803605/

    10-13 08:00