Sonar vNext:未报告代码覆盖率,但找到了覆盖率文件
Posted
技术标签:
【中文标题】Sonar vNext:未报告代码覆盖率,但找到了覆盖率文件【英文标题】:Sonar vNext: Code Coverage Not Reported, but Coverage File Found 【发布时间】:2017-03-17 18:01:52 【问题描述】:我遇到了一个问题,Sonar 没有报告在 vNext 构建期间正在分析的应用程序的代码覆盖率。 TFS 和 Sonar 都托管在本地,我使用的是 Sonar 6.0。我在这里环顾四周,没有看到任何具有完全相同问题的帖子,所以我想我会发帖看看是否有人有任何想法。
在构建期间,会运行一个单元测试套件,该套件会生成一个 trx 文件、一个覆盖率文件和一个 coveragexml 文件。在声纳属性字段中,我将其指向那些用于分析的文件
/d:sonar.cs.vscoveragexml.reportsPaths="$(Common.TestResultsDirectory)\*.coveragexml" /d:sonar.cs.vstest.reportsPaths="$(Common.TestResultsDirectory)\*.trx"
查看构建日志时,它会在完成分析步骤中获取这两个文件:
2016-10-28T14:31:01.5800405Z 10:31:01.463 Attempting to locate a test results (.trx) file...
2016-10-28T14:31:01.5800405Z 10:31:01.463 Located a test results file: E:\agent\_work\24\TestResults\tfsbuildagent_BUILD1 2016-10-28 10_30_52.trx
和
2016-10-28T14:31:15.7254549Z INFO: Parsing the Visual Studio coverage XML report E:\agent\_work\24\TestResults\tfsbuildagent_BUILD1 2016-10-28 10_30_52\In\BUILD1\tfsbuildagent_BUILD1 2016-10-28 10_30_38.coveragexml
2016-10-28T14:31:15.9254749Z INFO: Adding this code coverage report to the cache for later reuse: E:\agent\_work\24\TestResults\tfsbuildagent_BUILD1 2016-10-28 10_30_52\In\BUILD1\tfsbuildagent_BUILD1 2016-10-28 10_30_38.coveragexml
但是当您在 Sonar 中查看应用程序时,没有显示代码覆盖率。我可以打开coveragexml 文件,看起来里面确实有覆盖数据。我还让应用程序的工程师在他们运行测试套件后向我展示了 Visual Studio 中的覆盖率结果,并且肯定报告了覆盖率。我只是想不通为什么这些数据没有被转换成声纳。
这也提出了一个问题:Sonar 究竟是如何使用在测试结果文件和覆盖 XML 文件中找到的数据的?它是直接从这些文件中获取数据并仅使用这些数字作为其结果的一部分,还是使用这些数字和从分析代码中获得的数据的组合来计算最终统计数据?我从来没有在网上找到明确的答案,甚至在 Sonar 的网站上也没有。我觉得更好地理解这个过程也有助于解决这个问题。
无论如何,如果有人能提供任何关于 Sonar 未获取覆盖文件中数据的可能原因的见解,我将不胜感激。如果您需要任何其他信息,请告诉我。
【问题讨论】:
我也遇到过这个问题。我目前正在寻求自己解决它,所以如果我弄清楚了,我会告诉你的。 你有没有设法解决这个问题?我自己还在为此苦苦挣扎。我确实找到了关于 Sonars Jira 的错误报告,其中提到了覆盖范围的问题,但提到的解决方案对我没有任何影响。我想无论如何我都会与你分享它以防万一它对你有帮助:jira.sonarsource.com/browse/SONARMSBRU-262 感谢您的链接。我会试一试。自从我上次发布以来,我什至没有机会看这个。如果我弄明白了,我会用解决方案更新帖子。 快速更新:我尝试了链接的建议,但我已经在使用路径 $(Common.TestResultsDirectory) 所以没有任何改变。 是的,这也是我发现的——但认为这对你来说可能值得一试:) 【参考方案1】:我能够解决未报告的报道问题,但这可能是针对我的情况的,我仍然不确定为什么这可以解决问题。
作为构建过程的一部分,我必须为此特定应用程序构建 2 个解决方案。其中一个解决方案包含一个测试项目,但另一个没有。似乎这两个项目都在建设中,只有一个项目进行了测试。
我检查以确保一个构建的输出没有覆盖另一个构建,但事实并非如此。
修复是创建一个单独的 vNext 构建,其特定目的是向 Sonar 报告,并且只构建主要解决方案并运行它的测试套件。他们的测试套件只针对与主要解决方案相关的代码,因此在这种情况下,这对开发人员来说效果很好。
【讨论】:
【参考方案2】:我知道这个问题很老了,但我刚刚遇到了类似的问题,也许有人会碰到这个帖子,这可能会有所帮助。
问题不在于声纳,而在于代码覆盖率的 vstest 和 .netcore 问题。覆盖率文件是空的,这就是为什么它没有被拿来进行分析。
要解决此问题,您需要在 sn-p 之后添加到所有 csproj 文件(测试和产品):
<PropertyGroup>
<TargetFramework>netcoreapp1.1</TargetFramework>
<!-- Required in both test/product projects. This is a temporary workaround for https://github.com/microsoft/vstest/issues/800 -->
<DebugType>pdbonly</DebugType>
</PropertyGroup>
根据:https://github.com/microsoft/vstest/issues/800应该是固定的,但是对此有不同意见。
此外,我需要将解决方案中的所有项目设置为 x64,因为在运行设置中我有 <TargetPlatform>x64</TargetPlatform>
。
【讨论】:
以上是关于Sonar vNext:未报告代码覆盖率,但找到了覆盖率文件的主要内容,如果未能解决你的问题,请参考以下文章