Добавьте результаты покрытия кода в конвейеры Azure для веб-API .NET6 с помощью docker

#docker #azure-devops #azure-pipelines #.net-6.0

Вопрос:

Я пытаюсь добавить результаты покрытия кода в свой конвейер Azure для веб-API .NET 6, который упакован в контейнер docker.

Я использую это: Nuget добавил: «coverlet.msbuild»

Докерфайл:

 RUN dotnet test "WebAPIProject.DataAccessLayer.Tests.csproj" --logger "trx;LogFileName=WebAPIProject.DataAccessLayer.Tests.trx" /p:CollectCoverage=true /p:CoverletOutputFormat=json,Cobertura /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.  

Как и в случае с описанным выше методом, тесты работают как по маслу, я ожидаю, что покрытие также работает, но это не так. В чем ошибка в коде?

Ответ №1:

Нашел ответ. Во-первых, я изменил параметр файла Dockerfile /p:CoverletOutput в проекте

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

Необходимо было добавить еще docker cp один в командную строку, чтобы также скопировать результаты покрытия, поэтому задача 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 не поместил их в папку. Таким образом, с помощью этого небольшого обходного пути, описанного выше, я, наконец, смог добиться копирования результатов тестирования и покрытия.