Azure DevOps中未显示代码覆盖率选项卡。

4

我在Azure DevOps中有一个相对简单的测试项目,想要生成代码覆盖率。

这似乎可以实现。我得到了下面这个结果:

Azure DevOps Code coverage

我已经获得了所需的文件(至少我认为如此),但选项卡缺失了。

我执行了以下三个步骤:

1. 执行 .NET 测试任务 2. 安装报告生成器 3. 运行报告生成器进行转换(-reporttypes:HtmlInline_AzurePipelines; Cobertura) 4. 发布结果

但选项卡没有显示?有什么建议吗?

    - stage: Run_Unit_tests 
  jobs:
  - job: 'Tests'
    pool: 
      vmImage: 'windows-latest'
    variables:
      buildConfiguration: 'Release'
    continueOnError: true
    steps:
    - task: DotNetCoreCLI@2
      inputs:
        command: custom
        custom: tool
        arguments: install --tool-path . dotnet-reportgenerator-globaltool
      displayName: Install ReportGenerator tool

    - task: DotNetCoreCLI@2
      displayName: Test .NET
      inputs:
        command: test
        projects: '**/*Test/*.csproj'
        arguments: '--configuration $(buildConfiguration) --logger trx --collect:"XPlat Code Coverage"'
      condition: succeededOrFailed()

    - task: reportgenerator@4
      inputs:
        reports: '$(Agent.TempDirectory)\**\coverage.cobertura.xml'
        targetdir: '$(Build.SourcesDirectory)\coverlet\reports'
        verbosity: 'Verbose'
    - task: PublishCodeCoverageResults@1
      displayName: 'Publish code coverage'
      inputs:
        codeCoverageTool: Cobertura
        summaryFileLocation: $(Build.SourcesDirectory)\coverlet\reports\Cobertura.xml
        failIfCoverageEmpty: false
        reportDirectory: $(Build.SourcesDirectory)\coverlet\reports\

我尝试过使用代码生成器,也尝试过不用,开启代码覆盖变量或禁用,还尝试过使用报告生成器和不使用...


除非您提供更多的细节,否则回答您的问题将会很困难。理想情况下,需要您的pipeline.yml步骤。请参考这个问题https://dev59.com/i1QJ5IYBdhLWcg3wERuZ。 - Eric Smith
嗨@Unomagan,你有检查下面的yml吗?如果有任何问题,请告诉我。 - Levi Lu-MSFT
不,我没有,而且现在我放弃了...也许以后吧。 - Unomagan
嗨@Unomagan,如果你有机会,请查看以下步骤,它并不是很复杂。我成功地通过以下步骤在我的流水线上显示了代码覆盖率。 - Levi Lu-MSFT
1
我已经点赞了... 我有一个覆盖选项卡的截图。当我回到 DevOps 中的 同一次运行 时,就不再有选项卡了! - Ian Grainger
3
我有很多包含多个阶段的管道,代码覆盖率选项卡只会在所有阶段完成后才出现(即使构建和测试发生在第一个阶段)。我花了很多时间运行测试阶段,没有看到该选项卡并认为它不起作用! - theduck
3个回答

6

我曾经遇到了相同的问题,只需按F5刷新页面即可!

虽然很疯狂,但这实际上是一种一致的解决方法。

看起来devops前端代码偶尔会出现错误?


3
最苦涩的答案。 - cBlaine

0
我也遇到了这个问题,并追踪到我的管道中混合使用了VS测试和dotnet测试任务。一旦我删除了VS测试任务,一切都正常工作了。
看起来,VS测试任务上传了自己的代码覆盖率结果,发布cobertura结果与此VS测试任务的组合使Azure Devops感到困惑。

0

您可以尝试以下 YAML 来发布代码覆盖率。

首先,您需要确保您的项目引用了 nuget 包 coverlet.msbuild

<PackageReference Include="coverlet.msbuild" Version="2.5.1">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>

然后在你的dotnet测试任务中启用CollectCoverage

arguments: '/p:CollectCoverage=true /p:CoverletOutput=$(Build.SourcesDirectory)\TestResult\ /p:CoverletOutputFormat=cobertura'

然后在reportgenerator任务中将reports文件夹指定为CoverletOutput文件夹 reports: '$(Build.SourcesDirectory)\TestResult\**\coverage.cobertura.xml'

请参考下面的YAML:

steps:
  - task: UseDotNet@2
    inputs:
      version: 2.2.x 

  - task: DotNetCoreCLI@2
    inputs:
      command: restore
      projects: '**\*.csproj'

  - task: DotNetCoreCLI@2
    inputs:
      command: custom
      custom: tool
      arguments: install --tool-path . dotnet-reportgenerator-globaltool
    displayName: Install ReportGenerator tool

  - task: DotNetCoreCLI@2
    displayName: Test .NET
    inputs:
      command: test
      projects: '**\*Test*.csproj'
      publishTestResults: false
      arguments: '--configuration $(buildConfiguration) /p:CollectCoverage=true /p:CoverletOutput=$(Build.SourcesDirectory)\TestResult\ /p:CoverletOutputFormat=cobertura'
    condition: succeededOrFailed()

  - task: reportgenerator@4
    inputs:
      reports: '$(Build.SourcesDirectory)\TestResult\**\coverage.cobertura.xml'
      targetdir: '$(Build.SourcesDirectory)\coverlet\reports'
      verbosity: 'Verbose'

    condition: succeededOrFailed()
  - task: PublishCodeCoverageResults@1
    displayName: 'Publish code coverage'
    inputs:
      codeCoverageTool: Cobertura
      summaryFileLocation: $(Build.SourcesDirectory)\coverlet\reports\Cobertura.xml
      failIfCoverageEmpty: false
      reportDirectory: $(Build.SourcesDirectory)\coverlet\reports\
    condition: succeededOrFailed()

您也可以参考这个博客


嘿@levi-lu-msft - 这似乎又不起作用了 :/报告已生成但不可见。 也不清楚如何让它与多个测试程序集一起工作 - 每个都会生成一个TestResults\Coverage\coverage.cobertura.xml文件,因此dotnet test似乎正在覆盖它们。 - Karpik
你可以通过以下步骤将其制作成单个 XML 文件:将输出格式设置为 Cobertura、JSON,然后将 MergeWith=OutputDir\coverage.json 设置好,它会合并所有 JSON 文件,并在此过程中重新生成已合并内容的 XML 文件。你可能需要微调一些设置,但通常是这样做的。 - pinkfloydx33

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接