使用 docker 将代码覆盖率结果添加到 Azure Pipelines for .NET6 Web API

Posted

技术标签:

【中文标题】使用 docker 将代码覆盖率结果添加到 Azure Pipelines for .NET6 Web API【英文标题】:Add Code Coverage results to Azure Pipelines for .NET6 web API with docker 【发布时间】:2021-11-30 19:52:30 【问题描述】:

我正在尝试将代码覆盖率结果添加到我的 Azure 管道中,用于 .NET 6 Web API,它被包装到一个 docker 容器中。

我使用这些: Nuget 添加:“coverlet.msbuild”

Dockerfile:

RUN dotnet test "WebAPIProject.DataAccessLayer.Tests.csproj" --logger "trx;LogFileName=WebAPIProject.DataAccessLayer.Tests.trx" /p:CollectCoverage=true /p:CoverletOutputFormat=json%2cCobertura /p:CoverletOutput=/src/WebAPIProject.DataAccessLayer.Tests/TestResults/Coverage/

我的管道的相应行:

      - task: Docker@2
    displayName: Build image for testing
    inputs:
      containerRegistry: '$(dockerRegistryServiceConnection)'
      repository: '$(imageRepository)'
      command: 'build'
      Dockerfile: '**/Dockerfile'
      buildContext: '$(Build.Repository.LocalPath)'
      tags: '$(tag)'
  - task: CmdLine@2
    displayName: 'Copy test and Code coverage results files out of the image'
    inputs:
      script: |
        docker build -f ./WebAPIProject.Core/Dockerfile --target build -t $(imageRepository):$(tag) . 
        docker create -ti --name testcontainer $(imageRepository):$(tag) 
        docker cp testcontainer:/src/WebAPIProject.DataAccessLayer.Tests/TestResults/ $(Build.ArtifactStagingDirectory)/TestResults
        docker rm -fv testcontainer
  - task: PublishTestResults@2
    displayName: 'Publish test results'
    inputs:
      testResultsFormat: 'VSTest'
      testResultsFiles: '*.trx'
      searchFolder: '$(Build.ArtifactStagingDirectory)/TestResults'
  - task: PublishCodeCoverageResults@1
    displayName: 'Publish code coverage results'
    inputs:
      codeCoverageTool: 'Cobertura'
      summaryFileLocation: $(Build.ArtifactStagingDirectory)/TestResults/Coverage/coverage.cobertura.xml'
      pathToSources: '$(Build.ArtifactStagingDirectory)/TestResults/Coverage'

我得到的是运行管道:

Calculating coverage result...
Generating report '/src/WebAPIProject.DataAccessLayer.Tests/TestResults/Coverage/coverage.json'
Generating report 
'/src/WebAPIProject.DataAccessLayer.Tests/TestResults/Coverage/coverage.cobertura.xml'

但是代码覆盖率结果任务放弃了这个:

##[warning]No code coverage results were found to publish.

与上面的方法一样,测试就像一个魅力,我希望 Coverage 也能正常工作,但事实并非如此。代码有什么bug?

【问题讨论】:

【参考方案1】:

找到了答案。 首先,我在项目中修改了Dockerfile的/p:CoverletOutput参数

RUN dotnet test "WebAPIProject.DataAccessLayer.Tests.csproj" --logger "trx;LogFileName=WebAPIProject.DataAccessLayer.Tests.trx" /p:CollectCoverage=true /p:CoverletOutputFormat=json%2cCobertura /p:CoverletOutput=/TestResults/Coverage/

还需要在命令行中添加另一个 docker cp 以复制 Coverage 结果,因此 cmdline 任务现在如下所示:

- task: CmdLine@2
    displayName: 'Copy test and Code coverage results files out of the image'
    inputs:
      script: |
        docker build -f ./WebAPIProject.Core/Dockerfile --target build -t $(imageRepository):$(tag) . 
        docker create -ti --name testcontainer $(imageRepository):$(tag) 
        docker cp testcontainer:/src/WebAPIProject.DataAccessLayer.Tests/TestResults/ $(Build.ArtifactStagingDirectory)/TestResults
        docker cp testcontainer:/TestResults/Coverage/ $(Build.ArtifactStagingDirectory)/coverage
        docker rm -fv testcontainer

其中还涉及修改发布代码覆盖结果任务,例如:

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

对我来说,即使我设置了 Testresult 的文件夹来发布覆盖结果,出于某种原因,docker 也没有将这些放入文件夹中。所以通过上面这个小变通方法,我终于可以同时复制测试和覆盖结果了。

【讨论】:

以上是关于使用 docker 将代码覆盖率结果添加到 Azure Pipelines for .NET6 Web API的主要内容,如果未能解决你的问题,请参考以下文章

执行分析后如何将测试结果和代码覆盖率结果发送到 SonarQube 项目

如何将文件添加到 EC2 实例下的容器中?

工作服:错误 - 在我的使用 Docker 容器的应用程序中没有来源

代码覆盖率结果:导出到 Excel

在 Gitlab CI 上更改 Xdebug 模式 PHP Docker

SwiftUI 将覆盖添加到整个屏幕