我一直试图让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时
- MSBuild.SonarQube.Runner.exe开始
- 的MSBuild
- MSBuild.SonarQube.Runner.exe结束
醇>我收到的问题包括:
unknown XML Node
,期望覆盖但是 得到结果
这是因为它不喜欢我的XML结构,但我不确定是什么是期望的以及我需要对coverage文件做多少工作才能将其转换为Sonar喜欢的格式
希望我一直走错路,有一种简单的方法可以将VS Coverage或coveragexml
文件集成到Sonar中而无需太多工作
我的
Sonar plugins
的额外信息
- c#= 4.1
- Generic Coverage = 1.1
醇>
答案 0 :(得分:5)
C#4.1插件支持OpenCover和dotCover报告。为两个工具分别设置sonar.cs.dotcover.reportsPaths
或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)。< / p>
在等待修复故障单时,以下是生成预期.coveragexml
报告的步骤(注意:如果您使用VS,请在各种路径中将14
替换为12
2013年而不是2015年):
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工具。
答案 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)
要生成覆盖率报告,使用正确的版本非常重要,否则它将显示为零或不会生成覆盖率文件本身。