使用 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 项目
工作服:错误 - 在我的使用 Docker 容器的应用程序中没有来源