首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将nUnit/OpenCover结果导入SonarQube

如何将nUnit/OpenCover结果导入SonarQube
EN

Stack Overflow用户
提问于 2019-09-06 09:06:11
回答 2查看 2.3K关注 0票数 1

我们正在运行SonarQube社区版7.9.1版本(构建27448) (当前最新的码头映像)

我有一些nUnit测试,但是我很难获得导入到SonarQube的代码覆盖率数据。

我已经成功地使用SonarScanner.MSBuild (声纳-扫描器-MSBuil-4.6.2.2108-net46)使用以下命令将nUnit测试的代码分析和数量导入SonarQube:

代码语言:javascript
复制
SonarScanner.MSBuild.exe begin /k:"ProjectName" /d:sonar.host.url="..." /d:sonar.login="..." /d:sonar.cs.nunit.reportsPaths="NUnitResults.xml" 
MSBuild.exe ....sln /t:Rebuild
nunit3-console.exe --result=NUnitResults.xml path\to\tests.dll
SonarScanner.MSBuild.exe end /d:sonar.login="..."

现在我想使用OpenCover将代码覆盖率信息传递给SonarQube,所以我使用了以下命令

代码语言:javascript
复制
SonarScanner.MSBuild.exe begin /k:"ProjectName" /d:sonar.host.url="..." /d:sonar.login="..." /d:sonar.cs.nunit.reportsPaths="NUnitResults.xml" /d:sonar.cs.opencover.reportsPaths="opencover.xml"
MSBuild.exe ....sln /t:Rebuild
nunit3-console.exe --result=NUnitResults.xml path\to\tests.dll
OpenCover.Console.exe -output:opencover.xml -register:user -target:"nunit3-console.exe" -targetargs:"path\to\tests.dll --result=NUnitResults.xml"
SonarScanner.MSBuild.exe end /d:sonar.login="..."

我想我可能不必要地运行了两次nUnit测试,但是一旦我解决了以下问题,我就会解决这个问题。

问题是我没有得到任何关于SonarQube的代码覆盖细节。

检查SonarScanner日志--我可以看到来自OpenCover的以下输出:

代码语言:javascript
复制
Executing: nunit3-console.exe
NUnit Console Runner 3.10.0 (.NET 2.0)
Copyright (c) 2019 Charlie Poole, Rob Prouse
06 September 2019 09:24:53

Runtime Environment
   OS Version: Microsoft Windows NT 10.0.14393.0
  CLR Version: 4.0.30319.42000

Test Files
    path\to\UnitTests.dll


Run Settings
    DisposeRunners: True
    WorkDirectory: ...
    ImageRuntimeVersion: 4.0.30319
    ImageTargetFrameworkName: .NETFramework,Version=v4.6.1
    ImageRequiresX86: False
    ImageRequiresDefaultAppDomainAssemblyResolver: False
    NumberOfTestWorkers: 8

Test Run Summary
  Overall result: Passed
  Test Count: 35, Passed: 35, Failed: 0, Warnings: 0, Inconclusive: 0, Skipped: 0
  Start time: 2019-09-06 08:24:54Z
    End time: 2019-09-06 08:24:57Z
    Duration: 3.111 seconds

Results (nunit3) saved as NUnitResults.xml
Committing...
Visited Classes 12 of 12 (100)
Visited Methods 41 of 41 (100)
Visited Points 240 of 240 (100)
Visited Branches 41 of 41 (100)

==== Alternative Results (includes all methods including those without corresponding source) ====
Alternative Visited Classes 12 of 12 (100)
Alternative Visited Methods 41 of 53 (77.36)

现在检查一下我可以看到的dir,我已经创建和填充了NUnitResults.xmlopencover.xml。(我不知道如何读取OpenCover结果,但它有我的单元测试的数据)

SonarScanner.MSBuild.exe end日志有以下提示:

信息:传感器C#测试覆盖范围报告导入csharp INFO:解析OpenCover报表path.\opencover.xml 信息:将此代码覆盖率报告添加到缓存以供以后重用: path.\opencover.xml 警告:代码覆盖率报告不包含包含的文件的任何覆盖率数据。有关疑难解答提示,请参阅https://docs.sonarqube.org/x/CoBh 信息:传感器C#测试覆盖范围报告导入csharp / time=14ms 信息:传感器C#单元测试结果导入 信息:解析NUnit测试结果文件path.\NUnitResults.xml 信息:传感器C#单元测试结果导入csharp / time=34ms

现在包含了单元测试所涵盖的类(我可以在SonarQube中看到它们被标记为未发现),所以我猜OpenCover不是没有收集正确的信息,就是有些东西与解决方案中的文件匹配错误。

n.b.检查这些测试应该涵盖的项目,在project > Build > Advanced下,Debug信息设置为full,用于调试配置,这似乎需要一些资源。

知道我错过了什么/哪里出错了吗?

更新

检查opencode.xml的底部,它有以下内容:

代码语言:javascript
复制
<Module skippedDueTo="MissingPdb" hash="DD-83-09-69-9F-A7-11-FF-F5-BC-43-7C-87-B2-54-99-0D-A5-D5-61">
  <ModulePath>C:\Windows\Microsoft.Net\assembly\GAC_MSIL\MyCompany.Common.Utility\v4.0_1.0.0.0__bf95fa7f15863c9f\MyCompany.Common.Utility.dll</ModulePath>
  <ModuleTime>2019-09-05T16:07:28.6111533Z</ModuleTime>
  <ModuleName>MyCompany.Common.Utility</ModuleName>
  <Classes />
</Module>

这个解决方案的最初作者似乎喜欢把所有的东西都推到GAC中,所以我猜想OpenCover是在GAC中查找,而不是在本地查找dll,而且GAC不包含pdbs。

我尝试按照手册中的建议设置OpenCover -targetdir设置:

目标目录的路径;如果目标参数已经包含一个路径,那么这个参数可以用来提供一个备用路径,在其中可以找到PDB文件。

我还尝试使用-searchdirs (寻找PDBs的替代位置)。

但他们都没有解决这个问题。

我可以告诉OpenCover使用bin\Debug pdbs吗?

EN

回答 2

Stack Overflow用户

发布于 2020-08-11 02:46:31

https://github.com/OpenCover/opencover/wiki/Usage#notes-on-spaces-in-arguments

在targetargs中使用\“表示nunit3 3-控制台的引号

代码语言:javascript
复制
SonarScanner.MSBuild.exe begin /k:"ProjectName" /d:sonar.host.url="..." /d:sonar.login="..." /d:sonar.cs.nunit.reportsPaths="NUnitResults.xml" /d:sonar.cs.opencover.reportsPaths="opencover.xml"
MSBuild.exe ....sln /t:Rebuild
OpenCover.Console.exe -output:opencover.xml -register:user -target:"nunit3-console.exe" -targetargs:"\"path\to\tests.dll\" --result=NUnitResults.xml"
SonarScanner.MSBuild.exe end /d:sonar.login="..."
票数 0
EN

Stack Overflow用户

发布于 2021-10-11 04:23:19

代码语言:javascript
复制
Step1 : SonarScanner.MSBuild.exe begin /k:"Project-Name" /d:sonar.cs.opencover.reportsPaths=%cd%\TestCoverResult.xml /d:sonar.exclusions="**/*.css,**/*.js,**/*.cshtml" /d:sonar.verbose="true" /d:sonar.host.url="https://host-url.com/" /d:sonar.login="Login-Token"

Step2 :  "C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\MSBuild\Current\Bin\MSBuild.exe" /t:Rebuild  

Step3 : ".\packages\OpenCover.4.7.1221\tools\OpenCover.Console.exe" "-target:.\packages\NUnit.ConsoleRunner.3.12.0\tools\nunit3-console.exe"  "-targetargs:.\Test-Project\bin\Debug\Test-Project.dll" "-output:.\TestCoverResult.xml" -register:user

Step4 :  SonarScanner.MSBuild.exe end   

解释:

1:reportsPath:指定代码覆盖结果文件的路径。

2:".\packages\OpenCover.4.7.1221\tools\OpenCover.Console.exe":这是"OpenCover.Console.exe“的系统路径

3:".\packages\NUnit.ConsoleRunner.3.12.0\tools\nunit3-console.exe":它是“nunit3-控制台”的系统路径。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57818944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档