【问题标题】:How can I properly generate both TRX files and code coverage results with one call to "dotnet test"?如何通过一次调用“dotnet test”正确生成 TRX 文件和代码覆盖率结果?
【发布时间】:2021-11-20 21:30:29
【问题描述】:

首先,一些上下文:我有一个包含多个生产类库和九个单元测试项目的 Visual Studio 解决方案。所有项目都针对 .NET 5。我正在运行 .NET 5.0.401。所有单元测试项目都引用了coverlet.collector。我不使用旧的coverlet.msbuild 包。根据我的阅读,使用 XPlat Code Coverage 现在是 .NET Core 的惯用语。

我有一个用于 CI 构建的 Azure Pipelines 管道。作为该管道的一部分,我想运行所有单元测试,生成单元测试结果以上传到管道,并生成代码覆盖结果以上传到管道。我已经阅读了几篇博客文章和文档,这些文章和文档似乎可以让这一切变得简单;但是,我发现它什么都不是。

让我们从在我的本地工作站上运行一些命令开始。出于本练习的目的,我们假设我已经使用以下命令成功构建了解决方案:

dotnet build Solution.sln --configuration Debug

如果我运行这样的测试:

dotnet test Solution.sln --configuration Debug --no-build --no-restore --collect:"XPlat Code Coverage" --results-directory artifacts/test-results

然后我看到代码覆盖结果存储在以 GUID 命名的子目录中。为什么微软决定这样做我不知道,但那是我无法控制的。

(运行此命令并截图后,我删除了test-results目录。)

请记住,我还想生成单元测试结果。为此,我将--logger trx 参数添加到同一命令行。这一次,创建了许多其他文件夹,其中包含看似重复的代码覆盖结果。此外,我得到了我正在寻找的 .trx 文件。

您会注意到,除了我想要的九个.trx 文件之外,还有另外九个代码覆盖率报告。

在我的自托管管道构建代理上生成了类似的重复文件。在管道中,如果我尝试执行以下任务:

- task: 'PublishCodeCoverageResults@1'
  displayName: 'Publish code coverage results'
  inputs:
    codeCoverageTool: 'Cobertura'
    summaryFileLocation: 'artifacts/test-results/**/coverage.cobertura.xml'

我收到一个错误:

##[warning]Multiple file or directory matches were found. Using the first match: C:\agent\_work\38\s\artifacts\test-results\$redacted\In\redacted\coverage.cobertura.xml
##[error]No code coverage results were found to publish.

这里报告的目录不是我省略 --logger trx 时生成的 GUID 目录之一,而是重复目录之一。

This answer 似乎表明我做的一切都正确。我还对该答案发表了评论,希望得到一些帮助。

我有几个问题:

  1. 我是否正确调用dotnet test 以同时生成代码覆盖结果和.trx 文件?
  2. dotnet test 是否支持这种情况?
  3. Azure Pipelines 市场中ReportGenerator 扩展的功能现在真的内置在dotnet 中了吗?
  4. 哪些代码覆盖率结果是“真实”的?在发布代码覆盖率结果之前,是否需要将 GUID 文件夹复制到其他位置?
  5. 我想指定一个 RunSettings 文件,以便执行诸如将具有某些属性的成员排除在代码覆盖引擎考虑之外的操作。 RunSettings 是否与我的工作流程兼容?

【问题讨论】:

  • 我不确定我是否解决了所有问题,但请查看我的回复。

标签: azure-pipelines code-coverage dotnet-cli dotnet-test


【解决方案1】:

如果您有多个覆盖文件,您需要先合并它们,然后再发布。您可以通过以下方式实现:

  - task: DotNetCoreCLI@2
    displayName: "dotnet test"
    inputs:
      command: test
      projects: "*.sln"
      publishTestResults: true
      arguments: -c Release --no-restore --no-build /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura

  - task: reportgenerator@4
    displayName: "Merge code coverage reports"
    inputs:
      reports: "**/coverage.cobertura.xml"
      targetdir: "$(Build.ArtifactStagingDirectory)/coverlet"
      reporttypes: "Cobertura"
      verbosity: "Verbose"

  - task: PublishCodeCoverageResults@1
    displayName: "Publish code coverage results"
    inputs:
      codeCoverageTool: Cobertura
      summaryFileLocation: "$(Build.ArtifactStagingDirectory)/coverlet/Cobertura.xml"

注意:可能需要根据您的项目调整一些参数(例如您希望有 cobertura 文件的目录)。

我的代码中没有 trx 的规范记录器,我在日志中看到它们是生成的。

如果您想通过运行设置,请查看此doc - Configure a test run。

【讨论】:

  • 如果您查看我在问题中链接到的答案,微软似乎据称将 ReportGenerator 函数内置到 dotnet 本身中。不过,我没有任何来自 MS 的权威消息来源。
  • 另外,您的示例使用旧的 coverlet.msbuild 方法来执行此操作,对于更高版本的 .NET Core,基本上不推荐使用 coverlet.collector。
  • 我还应该声明,我曾经使用 ReportGenerator 扩展来组合 Cobertura 代码覆盖率结果,但仍然无法使其正常工作。
  • 这里最重要的部分是合并。您在发布之前尝试过吗?
  • 不是我更新了答案。我没有验证这一点。但我想我必须这样做。感谢您提出这个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 1970-01-01
  • 2018-10-26
  • 2020-02-26
  • 2014-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多