发布管道 Azure Devops 代码覆盖率报告
Publish a pipeline Azure Devops code coverage report
我正尝试在我的 Azure DevOps Pipeline 中在线发布详细报告,但我得到的只是 link 下载此 Coverage 文件。 (自 Visual Studio 2019 年以来,社区版本无法再阅读)
这是我的管道:
trigger:
branches:
include:
- '*'
pool:
vmImage: 'windows-2019'
steps:
- task: NuGetToolInstaller@0
displayName: Instal Nuget
inputs:
checkLatest: true
- task: NuGetCommand@2
displayName: Restore Nuget Packages
inputs:
restoreSolution: '**/*.sln'
- task: UseDotNet@2
displayName: 'Install .NET Core SDK'
inputs:
version: 3.1.x
performMultiLevelLookup: true
- task: DotNetCoreCLI@2
displayName: Build Tests
inputs:
command: 'build'
projects: '**/OneTienditaUnitTests/*.csproj'
arguments: '--configuration Release'
- script: dotnet test OneTienditaUnitTests --logger trx --collect "Code coverage"
- task: PublishTestResults@2
inputs:
testRunner: VSTest
testResultsFiles: '**/*.trx'
- task: XamarinAndroid@1
displayName: Build Android App
inputs:
projectFile: '**/*Android*.csproj'
outputDirectory: '$(build.binariesDirectory)/Release'
configuration: 'Release'
如果我这样使用 Cobertura,则不起作用:
- task: DotNetCoreCLI@2
displayName: Run Tests
inputs:
command: 'test'
projects: '**/OneTienditaUnitTests/*.csproj'
arguments: '--configuration Release /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=../reports/coverage/'
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage results'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(build.sourcesdirectory)\reports\coverage\coverage.cobertura.xml'
reportDirectory: '$(build.sourcesdirectory)\reports\coverage'
请帮忙?我不是专业的 DevOps
要在那里发布报告,您需要使用 Cobertura。对于 TRX,您将只能获得 link 来下载文件。要创建 Cobertura 报告,您需要在测试项目中安装 coverlet.collector
nuget 包。这里有可以解决问题的代码:
# You just added coverlet.collector to use 'XPlat Code Coverage'
- task: DotNetCoreCLI@2
displayName: Test
inputs:
command: test
projects: '**/*Tests/*.csproj'
arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage" -- RunConfiguration.DisableAppDomain=true'
workingDirectory: $(Build.SourcesDirectory)
- task: DotNetCoreCLI@2
inputs:
command: custom
custom: tool
arguments: install --tool-path . dotnet-reportgenerator-globaltool
displayName: Install ReportGenerator tool
- script: ./reportgenerator -reports:$(Agent.TempDirectory)/**/coverage.cobertura.xml -targetdir:$(Build.SourcesDirectory)/coverlet/reports -reporttypes:"Cobertura"
displayName: Create reports
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: $(Build.SourcesDirectory)/coverlet/reports/Cobertura.xml
[2021 年更新]
您不需要额外的任务来 install/run 自定义 ReportGenerator 工具:它现在是读取 coverage.cobertura.xml
文件的默认工具,并且包含在 dotnet
CLI 中。
默认情况下,它会将 cobertura xml 文件保存到代理的临时目录中。因此,您只需更新 PublishCodeCoverageResults
任务的 summaryFileLocation
以指向临时目录并跳过“中间人”步骤:
# You just added coverlet.collector to use 'XPlat Code Coverage'
- task: DotNetCoreCLI@2
displayName: Test
inputs:
command: test
projects: '**/*Tests/*.csproj'
arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage"'
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'
如果您有多个生成多个覆盖率文件的测试项目,请在测试命令后使用这些步骤。它将在发布文件之前合并文件:
- task: reportgenerator@4
displayName: "Merge code coverage reports"
inputs:
reports: "**/coverage.cobertura.xml"
targetdir: "$(Build.ArtifactStagingDirectory)/coverlet"
reporttypes: "Cobertura"
verbosity: "Verbose"
- task: PublishCodeCoverageResults@1
displayName: "Publish code coverage results"
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: "$(Build.ArtifactStagingDirectory)/coverlet/Cobertura.xml"
我已经尝试了很多来解决他的问题...
所以首先,问题是管道的测试任务(在我的例子中是 DotNetCoreCLI@2 任务)。如果此任务收集代码覆盖率,它会自动以 .coverage 格式与测试一起发布。出于某种原因,此 .coverage 文件的推送位于管道(或作业 - 我不知道)的末尾,因此覆盖了所有先前上传的文件。
解决方案
使用像 OpenCover 这样的覆盖工具并使用它收集代码覆盖率,而不是通过启用 CodeCoverage 收集的测试任务收集。
示例:
OpenCover.Console.exe -target:"dotnet.exe" -targetArgs:"test {solution.sln}" -output:"{outputDir}\OpenCover.xml" {-oldstyle}
然后通过 ReportGenerator 任务将 OpenCover 文件转换为 Cobertura 格式。
之后您可以通过 PublishCodeCoverageResult 任务照常发布它。
您可能需要稍微尝试一下,但考虑到该解决方案它会起作用。
我在 Azure DevOps 和代码覆盖率报告呈现方面遇到了同样的问题。我在阳光下尝试了一切,但无济于事。有支持投票的解决方案,但 none 似乎对我有用。我总是只得到那个愚蠢的下载 link。
看了@h0p3zZ的回答,给了我一个新的提示。出于某种原因,我的 dotnet test
命令同时生成了 coverage.cobertura.xml
和 *.coverage
文件,并且由于某些奇怪的原因,该文件优先于 coverage.cobertura.xml 文件(这使得 devops 渲染下载 link).
在我的例子中,我将一个 .runsettings
文件传递给 dontnet test
命令,如下所示,这使得它吐出一个额外的 .coverage
文件。
- task: DotNetCoreCLI@2
displayName: Test
inputs:
command: test
projects: '**/*Tests/*.csproj'
arguments: --configuration $(buildConfiguration) --collect:"XPlat Code Coverage" --settings CodeCoverage.runsettings
一旦我摆脱了 --settings CodeCoverage.runsettings
开关,一切就开始正常工作了。
我正尝试在我的 Azure DevOps Pipeline 中在线发布详细报告,但我得到的只是 link 下载此 Coverage 文件。 (自 Visual Studio 2019 年以来,社区版本无法再阅读)
这是我的管道:
trigger:
branches:
include:
- '*'
pool:
vmImage: 'windows-2019'
steps:
- task: NuGetToolInstaller@0
displayName: Instal Nuget
inputs:
checkLatest: true
- task: NuGetCommand@2
displayName: Restore Nuget Packages
inputs:
restoreSolution: '**/*.sln'
- task: UseDotNet@2
displayName: 'Install .NET Core SDK'
inputs:
version: 3.1.x
performMultiLevelLookup: true
- task: DotNetCoreCLI@2
displayName: Build Tests
inputs:
command: 'build'
projects: '**/OneTienditaUnitTests/*.csproj'
arguments: '--configuration Release'
- script: dotnet test OneTienditaUnitTests --logger trx --collect "Code coverage"
- task: PublishTestResults@2
inputs:
testRunner: VSTest
testResultsFiles: '**/*.trx'
- task: XamarinAndroid@1
displayName: Build Android App
inputs:
projectFile: '**/*Android*.csproj'
outputDirectory: '$(build.binariesDirectory)/Release'
configuration: 'Release'
如果我这样使用 Cobertura,则不起作用:
- task: DotNetCoreCLI@2
displayName: Run Tests
inputs:
command: 'test'
projects: '**/OneTienditaUnitTests/*.csproj'
arguments: '--configuration Release /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput=../reports/coverage/'
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage results'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(build.sourcesdirectory)\reports\coverage\coverage.cobertura.xml'
reportDirectory: '$(build.sourcesdirectory)\reports\coverage'
请帮忙?我不是专业的 DevOps
要在那里发布报告,您需要使用 Cobertura。对于 TRX,您将只能获得 link 来下载文件。要创建 Cobertura 报告,您需要在测试项目中安装 coverlet.collector
nuget 包。这里有可以解决问题的代码:
# You just added coverlet.collector to use 'XPlat Code Coverage'
- task: DotNetCoreCLI@2
displayName: Test
inputs:
command: test
projects: '**/*Tests/*.csproj'
arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage" -- RunConfiguration.DisableAppDomain=true'
workingDirectory: $(Build.SourcesDirectory)
- task: DotNetCoreCLI@2
inputs:
command: custom
custom: tool
arguments: install --tool-path . dotnet-reportgenerator-globaltool
displayName: Install ReportGenerator tool
- script: ./reportgenerator -reports:$(Agent.TempDirectory)/**/coverage.cobertura.xml -targetdir:$(Build.SourcesDirectory)/coverlet/reports -reporttypes:"Cobertura"
displayName: Create reports
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: $(Build.SourcesDirectory)/coverlet/reports/Cobertura.xml
[2021 年更新]
您不需要额外的任务来 install/run 自定义 ReportGenerator 工具:它现在是读取 coverage.cobertura.xml
文件的默认工具,并且包含在 dotnet
CLI 中。
默认情况下,它会将 cobertura xml 文件保存到代理的临时目录中。因此,您只需更新 PublishCodeCoverageResults
任务的 summaryFileLocation
以指向临时目录并跳过“中间人”步骤:
# You just added coverlet.collector to use 'XPlat Code Coverage'
- task: DotNetCoreCLI@2
displayName: Test
inputs:
command: test
projects: '**/*Tests/*.csproj'
arguments: '--configuration $(buildConfiguration) --collect:"XPlat Code Coverage"'
- task: PublishCodeCoverageResults@1
displayName: 'Publish code coverage'
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'
如果您有多个生成多个覆盖率文件的测试项目,请在测试命令后使用这些步骤。它将在发布文件之前合并文件:
- task: reportgenerator@4
displayName: "Merge code coverage reports"
inputs:
reports: "**/coverage.cobertura.xml"
targetdir: "$(Build.ArtifactStagingDirectory)/coverlet"
reporttypes: "Cobertura"
verbosity: "Verbose"
- task: PublishCodeCoverageResults@1
displayName: "Publish code coverage results"
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: "$(Build.ArtifactStagingDirectory)/coverlet/Cobertura.xml"
我已经尝试了很多来解决他的问题...
所以首先,问题是管道的测试任务(在我的例子中是 DotNetCoreCLI@2 任务)。如果此任务收集代码覆盖率,它会自动以 .coverage 格式与测试一起发布。出于某种原因,此 .coverage 文件的推送位于管道(或作业 - 我不知道)的末尾,因此覆盖了所有先前上传的文件。
解决方案 使用像 OpenCover 这样的覆盖工具并使用它收集代码覆盖率,而不是通过启用 CodeCoverage 收集的测试任务收集。
示例:
OpenCover.Console.exe -target:"dotnet.exe" -targetArgs:"test {solution.sln}" -output:"{outputDir}\OpenCover.xml" {-oldstyle}
然后通过 ReportGenerator 任务将 OpenCover 文件转换为 Cobertura 格式。
之后您可以通过 PublishCodeCoverageResult 任务照常发布它。
您可能需要稍微尝试一下,但考虑到该解决方案它会起作用。
我在 Azure DevOps 和代码覆盖率报告呈现方面遇到了同样的问题。我在阳光下尝试了一切,但无济于事。有支持投票的解决方案,但 none 似乎对我有用。我总是只得到那个愚蠢的下载 link。
看了@h0p3zZ的回答,给了我一个新的提示。出于某种原因,我的 dotnet test
命令同时生成了 coverage.cobertura.xml
和 *.coverage
文件,并且由于某些奇怪的原因,该文件优先于 coverage.cobertura.xml 文件(这使得 devops 渲染下载 link).
在我的例子中,我将一个 .runsettings
文件传递给 dontnet test
命令,如下所示,这使得它吐出一个额外的 .coverage
文件。
- task: DotNetCoreCLI@2
displayName: Test
inputs:
command: test
projects: '**/*Tests/*.csproj'
arguments: --configuration $(buildConfiguration) --collect:"XPlat Code Coverage" --settings CodeCoverage.runsettings
一旦我摆脱了 --settings CodeCoverage.runsettings
开关,一切就开始正常工作了。