【问题标题】:Optimizing C# code coverage collection and publishing in Azure DevOps Server 2020在 Azure DevOps Server 2020 中优化 C# 代码覆盖率收集和发布
【发布时间】:2021-08-10 03:40:10
【问题描述】:

我们使用以下命令行(或多或少)收集管道中的 C# 代码覆盖率:

dotnet test --no-build -l trx -r TheResultsDir --collect "Code coverage" -s  CodeCoverage.runsettings

(我们实际上为此使用了内置的DotNetCoreCLI@2 任务)

这会产生一堆.coverage 文件。我们想和他们做两件事:

  1. 发送到我们的 SonarQube 服务器
  2. 使用PublishCodeCoverageResults@1 任务在构建本身上发布。

事实证明(惊喜,惊喜),生成的 .coverage 文件只有 VS IDE 才能理解。

像往常一样 - 互联网来救援。我们发现:

  1. 使用Microsoft.CodeCoverage 工具,我们可以将.coverage 文件转换为SonarQube 可以理解的.xml,而不是PublishCodeCoverageResults@1 任务。
  2. 使用reportgenerator 工具,我们可以将.xml 文件从(1) 转换为PublishCodeCoverageResults@1 任务可以理解的Cobertura 格式

这就是我们所做的,它适用于小型项目。但是,现在我们将代码覆盖率引入我们的大型单体应用程序(叹气,helas - 一切都是真的),而且时间很糟糕。对于一种解决方案(多种解决方案):

  1. .coverage 转换为.xml 大约需要20 分钟。
  2. .xml 转换为 Cobertura - 2h 33m。

所以,这真的很糟糕。

如果我想同时发送到 SQ 并发布到构建,是否有更好的解决方案?

这是我们使用的实际代码:

.coverage.xml

CodeCoverage.exe analyze /output:CoverageResult.xml CoverageResult.coverage

.coverage文件有好几个,所以对每个都应用命令)

.xml 到 Cobertura

reportgenerator.exe -reports:CoverageResults\*.xml -targetdir:CoberturaReport -reporttypes:Cobertura

发布构建

  - task: PublishCodeCoverageResults@1
    displayName: Publish Coverage Results
    inputs:
      codeCoverageTool: Cobertura
      summaryFileLocation: CoberturaReport/Cobertura.xml
      failIfCoverageEmpty: true

通过标准 SQ 任务发布到 SonarQube:

  1. 准备 SQ 分析
  2. 运行 SQ 分析
  3. 发布 SQ 分析

准备任务是:

  - task: SonarQubePrepare@4
    displayName: Prepare CI SQ Analysis
    inputs:
      SonarQube: SonarQube
      scannerMode: MSBuild
      projectKey: $(SonarQubeProjectKey)
      projectName: $(SonarQubeProjectName)
      projectVersion: $(SonarQubeProjectVersion)
      extraProperties: |
        sonar.cs.vscoveragexml.reportsPaths=$(Common.TestResultsDirectory)\vstest-coverage\*.xml
        sonar.cs.nunit.reportsPaths=$(Common.TestResultsDirectory)\tests\*.TestResult.xml
        sonar.inclusions=**/*.cs
        sonar.branch.name=$(SonarQubeSourceBranch)
        sonar.scm.disabled=true

【问题讨论】:

  • 所以你现在关心的是让这两个转换任务并行,对吧?还是要优化两个转换任务的执行时间?
  • 并行没用。与 2h 33m 并行运行的 20 分钟仍然是 2h 33m。如果最终结果 - 由于从一种格式转换为另一种格式而导致发布到 SQ 和构建不需要数小时,我不在乎我是如何做到的。
  • 我可以将所有与 SQ 相关的任务并行转换为 Cobertura - SQ 分析和 SQ 发布一起也需要很多时间,但这会使构建变得相当复杂。您现在需要两个构建代理,并且资源被大量使用。理想情况下,我想找到一种完全消除 Cobertura 转换的方法。如果可以直接发布 .coverage 文件,那就太理想了。
  • 我明白了。这更接近我的猜测。但是好像没有更好的办法直接将.coverage类型的测试结果发布到build中

标签: c# .net-core azure-devops sonarqube code-coverage


【解决方案1】:

理想情况下,我想找到一种完全消除 Cobertura 转换的方法。如果可以直接发布 .coverage 文件就好了。

这是 Azure devops 上的 known issue。现在,AFAIK,没有这样的开箱即用方式来消除 Cobertura 转换。目前唯一的办法是使用reportgenerator工具将测试结果转换为Cobertura格式。

那是因为发布代码覆盖结果任务仅支持覆盖结果格式,例如 CoberturaJaCoCo。并且目前只支持.coverage文件的下载链接。

此外,此问题已在此链接的早期建议票中提交:

support vstest .coverage "code coverage" build results tab

此功能请求在路线图上,相信很快就会发布,您可以关注此线程以了解其最新反馈。

【讨论】:

  • TBH,这个线程不是很令人鼓舞,因为据说它在路线图上坐了一年多。你有什么具体的信息吗?
  • 另一种选择是不使用标准的代码覆盖率收集器。也许您可以建议立即生产 Cobertura 的替代收藏家?或者也许可以在 .coverage 文件而不是 XML 上调用 reportgenerator?因为从 .coverage 转换需要合理的时间,但从 XML 到 Cobertura 则不需要。
猜你喜欢
  • 2022-01-12
  • 2021-05-25
  • 2021-08-13
  • 2021-02-11
  • 1970-01-01
  • 2016-08-24
  • 1970-01-01
  • 2020-07-08
  • 1970-01-01
相关资源
最近更新 更多