为什么 CodeCoverage.exe 生成几乎为空的 .coverage 文件?

Why is CodeCoverage.exe producing near empty .coverage Files?

在我们的 Jenkins 管道中,我们使用 SonarQube 来报告我们的代码覆盖率。在 运行 完成所有 unit/integration 测试以生成 .coverage 文件后,我们需要分析此文件以创建“.coverage.coveragexml”,这最终是 SonarQube 用来解释的代码覆盖率。我们通过使用 CodeCoverage.exe:

"C:\Program Files (x86)\Microsoft Visual Studio22\TestAgent\Team Tools\Dynamic Code Coverage Tools\CodeCoverage.exe" analyze /output:"{somePath}\{someName}.coverage.coveragexml" "{somePath}\{someName}.coverage"

此命令似乎有效,但是当您 运行 dir /s *.coveragexml(在目录中)时,它会显示如下内容:

Directory of C:\jenkins\path\to\TestResults\coverageFile
03/22/2022  04:59 PM                64 ContainerAdministrator_DC420D3FA0BA_2022-03-22.16_46_43.coverage.coveragexml
1 File(s)             64 bytes

64 字节几乎算不了什么——我相信这就是我们的 SonarQube 指标显示我们现在覆盖率为 0 的原因。

我添加了相同的 dir 命令,只是这次检查 .coverage 文件,而返回的那些文件只有 10 个字节 - 让我觉得这些文件本质上是空的。我看到 this post 这似乎是一个类似的问题。接受的答案说要将平台类型从 x86 更改为 x64,但这对我来说不起作用。

用于 运行 测试的 vstest.console 命令是:

vstest.console /Parallel /EnableCodeCoverage /Logger:trx /Platform:x86 ".\somePath\Test.dll"

这个问题最初是在我们对 Jenkinsfile 进行更改以在启动 CodeCoverage 可执行文件的命令中使用 Visual Studio 2022 而不是 2019(基础映像已更新)时开始的。

什么可能导致覆盖文件 nearly/completely 为空,我该如何解决?

看来我们使用的基础映像必须有 non-enterprise 版的代码覆盖工具(即 requirement)。我们使用工具的企业版(我的机器上安装了 Visual Studio 2022 Enterprise)在本地测试了我们的 SonarQube 项目命令,生成的覆盖率文件包含正确的数据。但是,当我们使用 Visual Studio Professional 安装时,文件就像我们的 Jenkins 管道一样是空的。

如前所述,这在更新基本映像时开始发生 - 特别是在 November 8th 2021. It seems the base docker image we were using (mcr.microsoft.com/dotnet/framework/sdk:4.8-20220210-windowsservercore-ltsc2019 左右)具有最新的 2022 工具,但它不能是企业版 - 因此是空文件。

我们将管道切换为使用 dotCover 来执行分析,这按预期工作并且我们的 SonarQube 覆盖范围恢复正常。