.net core 如何从dotnet test生成的VS coverage发布Cobertura coverage报告--collect";代码覆盖率;?

.net core 如何从dotnet test生成的VS coverage发布Cobertura coverage报告--collect";代码覆盖率;?,.net-core,azure-devops,code-coverage,.net Core,Azure Devops,Code Coverage,因此,该过程可从以下步骤中推导并包含以下步骤: 运行覆盖率的测试,而不发布测试结果,因为我们需要控制生成的二进制覆盖率报告的位置(请参阅) 将VS二进制覆盖率结果转换为XML 安装报表生成器工具 使用reportgenerator工具将VS XML覆盖率转换为Cobertura 使用发布代码覆盖率Azure DevOps任务发布Cobertura报告 公布测试结果 可以使用以下YAML模板实现这些步骤: parameters: BuildConfiguration: Debug steps

因此,该过程可从以下步骤中推导并包含以下步骤:

  • 运行覆盖率的测试,而不发布测试结果,因为我们需要控制生成的二进制覆盖率报告的位置(请参阅)
  • 将VS二进制覆盖率结果转换为XML
  • 安装报表生成器工具
  • 使用reportgenerator工具将VS XML覆盖率转换为Cobertura
  • 使用发布代码覆盖率Azure DevOps任务发布Cobertura报告
  • 公布测试结果
  • 可以使用以下YAML模板实现这些步骤:

    parameters:
      BuildConfiguration: Debug
    
    steps:
    - task: DotNetCoreCLI@2
      name: Test
      displayName: Test
      inputs:
        command: 'test'
        publishTestResults: false
        arguments: '-c ${{ parameters.BuildConfiguration }} --no-build -l trx -r $(Common.TestResultsDirectory)\tests --collect "Code coverage"'
    
    - task: PublishTestResults@2
      displayName: Publish Test Results
      inputs:
        testResultsFormat: VSTest
        testResultsFiles: '*.trx'
        searchFolder: $(Common.TestResultsDirectory)\tests
        testRunTitle: $(Build.DefinitionName)-$(Build.BuildNumber)
      condition: succeededOrFailed()
    
    - powershell: |
        $cc = "$(Get-ToolFolderFromNuGet Microsoft.CodeCoverage)\..\build\netstandard1.0\CodeCoverage\CodeCoverage.exe"
        $BinaryCoverageFile = (Get-Item "$(Common.TestResultsDirectory)\tests\*\*.coverage").FullName
        & $cc analyze /output:$(Common.TestResultsDirectory)\vstest-coverage.xml $BinaryCoverageFile
      displayName: Convert Coverage Result To Xml
    
    - task: DotNetCoreCLI@2
      inputs:
        command: custom
        custom: tool
        arguments: install --tool-path . dotnet-reportgenerator-globaltool
      displayName: Install ReportGenerator tool
    
    - script: .\reportgenerator.exe -reports:$(Common.TestResultsDirectory)\vstest-coverage.xml -targetdir:$(Common.TestResultsDirectory)\coverage\report -reporttypes:"Cobertura"
      displayName: Create Cobertura Coverage Report
    
    - task: PublishCodeCoverageResults@1
      displayName: Publish Coverage Results
      inputs:
        codeCoverageTool: 'Cobertura'
        summaryFileLocation: '$(Common.TestResultsDirectory)/coverage/report/Cobertura.xml'
        failIfCoverageEmpty: true
    
    它使用my powershell函数
    Get ToolFolderFromNuGet
    从NuGet下载包,但除此之外,不使用自定义代码

    无论如何,问题在于“发布测试结果”任务将二进制覆盖率结果作为超链接发布在覆盖率结果应该位于的同一选项卡中:

    这是没有用的。如果我注释掉发布测试结果,覆盖率页面将显示预期结果:

    但是现在我丢失了测试页面,当然:

    有人知道如何解决这个难题吗

    附言

    我在这里打开了一个bug-

    编辑1


    我试图在最后发布测试结果,甚至删除二进制覆盖率结果文件。没有任何帮助。

    通过检查发布测试结果任务的diag日志,我设法找到了解决方法。事实上,从日志中可以看出:

    2020-04-10T15:48:12.1799774Z ##[debug]pattern: '*.trx'
    2020-04-10T15:48:12.1839752Z ##[debug]findPath: 'd:\_wf\06\13\TestResults\tests'
    2020-04-10T15:48:12.1840795Z ##[debug]statOnly: 'false'
    2020-04-10T15:48:12.1843783Z ##[debug]findPath: 'd:\_wf\06\13\TestResults\tests'
    2020-04-10T15:48:12.1844681Z ##[debug]findOptions.allowBrokenSymbolicLinks: 'true'
    2020-04-10T15:48:12.1845119Z ##[debug]findOptions.followSpecifiedSymbolicLink: 'true'
    2020-04-10T15:48:12.1845244Z ##[debug]findOptions.followSymbolicLinks: 'true'
    2020-04-10T15:48:12.1850467Z ##[debug]  d:\_wf\06\13\TestResults\tests (directory)
    2020-04-10T15:48:12.1858807Z ##[debug]  d:\_wf\06\13\TestResults\tests\1f627391-dd45-48b3-af92-5213c471eb04 (directory)
    2020-04-10T15:48:12.1864156Z ##[debug]  d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29 (directory)
    2020-04-10T15:48:12.1868508Z ##[debug]  d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29\In (directory)
    2020-04-10T15:48:12.1873069Z ##[debug]  d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29\In\TDC5DFC1BLD24 (directory)
    2020-04-10T15:48:12.1880777Z ##[debug]  d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29\In\TDC5DFC1BLD24\tfsbuild_TDC5DFC1BLD24_2020-04-10.11_47_23.coverage (file)
    2020-04-10T15:48:12.1884045Z ##[debug]  d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29.trx (file)
    2020-04-10T15:48:12.1885576Z ##[debug]7 results
    
    所以二进制覆盖率文件就在那里。但是它的原始位置不同,我们可以从测试任务本身的常规构建日志中看到:

    2020-04-10T15:47:54.0912521Z M i c r o s o f t   ( R )   C o v e r a g e   C o l l e c t i o n   T o o l   V e r s i o n   1 6 . 0 . 3 0 3 1 9 . 3 0 0 2 
    2020-04-10T15:47:54.0913009Z  
    2020-04-10T15:47:54.0913107Z  
    2020-04-10T15:47:54.0913209Z  C o p y r i g h t   ( c )   M i c r o s o f t   C o r p o r a t i o n .     A l l   r i g h t s   r e s e r v e d . 
    2020-04-10T15:47:54.0913270Z  
    2020-04-10T15:47:54.0913307Z  
    2020-04-10T15:47:54.0913340Z  
    2020-04-10T15:47:54.0913400Z  
    2020-04-10T15:47:54.3182888Z  Results File: d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29.trx
    2020-04-10T15:47:54.3183717Z 
    2020-04-10T15:47:54.3184201Z Attachments:
    2020-04-10T15:47:54.3184419Z   d:\_wf\06\13\TestResults\tests\1f627391-dd45-48b3-af92-5213c471eb04\tfsbuild_TDC5DFC1BLD24_2020-04-10.11_47_23.coverage
    2020-04-10T15:47:54.3196805Z Test Run Successful.
    2020-04-10T15:47:54.3197219Z Total tests: 445
    2020-04-10T15:47:54.3197713Z      Passed: 445
    2020-04-10T15:47:54.3199584Z  Total time: 30.1160 Seconds
    
    因此,原始二进制覆盖率文件位于
    d:\\u wf\06\13\TestResults\tests\1f627391-dd45-48b3-af92-5213c471eb04\tfsbuild\u TDC5DFC1BLD24\u 2020-04-10.11\u 47\u 23.覆盖率
    ,但它被复制到了
    d:\\u wf\06\13\TestResults\tests\tfsbuild\u TDC5DFC1BLD24\u 2020-04-10\u 11\u 47\u 29\In\TDC5DFC1BLD24\tfsbuild\u TDC5DFC1BLD24\u 2020-04-10.11\u 47\u 23.覆盖范围

    我的错误是只删除了原始位置。当在这两个地方被删除时,代码覆盖率页面就如预期的那样——不再有无用的超链接,而是实际覆盖率

    YAML中已更正的powershell任务如下所示:

    - powershell: |
        $cc = "$(Get-NuGetPackageBaseFolder Microsoft.CodeCoverage)\build\netstandard1.0\CodeCoverage\CodeCoverage.exe"
        $BinaryCoverageFile = Get-Item "$(Common.TestResultsDirectory)\tests\*\*.coverage"
        & $cc analyze /output:$(Common.TestResultsDirectory)\vstest-coverage.xml $BinaryCoverageFile.FullName
        Remove-Item (Get-ChildItem -Path "$(Common.TestResultsDirectory)\tests" -Recurse -Filter $BinaryCoverageFile.Name).FullName
      displayName: Convert Coverage Result To Xml
    

    当然,发布测试结果任务必须移动到此任务之后。

    通过检查发布测试结果任务的diag日志,我设法找到了解决方法。事实上,从日志中可以看出:

    2020-04-10T15:48:12.1799774Z ##[debug]pattern: '*.trx'
    2020-04-10T15:48:12.1839752Z ##[debug]findPath: 'd:\_wf\06\13\TestResults\tests'
    2020-04-10T15:48:12.1840795Z ##[debug]statOnly: 'false'
    2020-04-10T15:48:12.1843783Z ##[debug]findPath: 'd:\_wf\06\13\TestResults\tests'
    2020-04-10T15:48:12.1844681Z ##[debug]findOptions.allowBrokenSymbolicLinks: 'true'
    2020-04-10T15:48:12.1845119Z ##[debug]findOptions.followSpecifiedSymbolicLink: 'true'
    2020-04-10T15:48:12.1845244Z ##[debug]findOptions.followSymbolicLinks: 'true'
    2020-04-10T15:48:12.1850467Z ##[debug]  d:\_wf\06\13\TestResults\tests (directory)
    2020-04-10T15:48:12.1858807Z ##[debug]  d:\_wf\06\13\TestResults\tests\1f627391-dd45-48b3-af92-5213c471eb04 (directory)
    2020-04-10T15:48:12.1864156Z ##[debug]  d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29 (directory)
    2020-04-10T15:48:12.1868508Z ##[debug]  d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29\In (directory)
    2020-04-10T15:48:12.1873069Z ##[debug]  d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29\In\TDC5DFC1BLD24 (directory)
    2020-04-10T15:48:12.1880777Z ##[debug]  d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29\In\TDC5DFC1BLD24\tfsbuild_TDC5DFC1BLD24_2020-04-10.11_47_23.coverage (file)
    2020-04-10T15:48:12.1884045Z ##[debug]  d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29.trx (file)
    2020-04-10T15:48:12.1885576Z ##[debug]7 results
    
    所以二进制覆盖率文件就在那里。但是它的原始位置不同,我们可以从测试任务本身的常规构建日志中看到:

    2020-04-10T15:47:54.0912521Z M i c r o s o f t   ( R )   C o v e r a g e   C o l l e c t i o n   T o o l   V e r s i o n   1 6 . 0 . 3 0 3 1 9 . 3 0 0 2 
    2020-04-10T15:47:54.0913009Z  
    2020-04-10T15:47:54.0913107Z  
    2020-04-10T15:47:54.0913209Z  C o p y r i g h t   ( c )   M i c r o s o f t   C o r p o r a t i o n .     A l l   r i g h t s   r e s e r v e d . 
    2020-04-10T15:47:54.0913270Z  
    2020-04-10T15:47:54.0913307Z  
    2020-04-10T15:47:54.0913340Z  
    2020-04-10T15:47:54.0913400Z  
    2020-04-10T15:47:54.3182888Z  Results File: d:\_wf\06\13\TestResults\tests\tfsbuild_TDC5DFC1BLD24_2020-04-10_11_47_29.trx
    2020-04-10T15:47:54.3183717Z 
    2020-04-10T15:47:54.3184201Z Attachments:
    2020-04-10T15:47:54.3184419Z   d:\_wf\06\13\TestResults\tests\1f627391-dd45-48b3-af92-5213c471eb04\tfsbuild_TDC5DFC1BLD24_2020-04-10.11_47_23.coverage
    2020-04-10T15:47:54.3196805Z Test Run Successful.
    2020-04-10T15:47:54.3197219Z Total tests: 445
    2020-04-10T15:47:54.3197713Z      Passed: 445
    2020-04-10T15:47:54.3199584Z  Total time: 30.1160 Seconds
    
    因此,原始二进制覆盖率文件位于
    d:\\u wf\06\13\TestResults\tests\1f627391-dd45-48b3-af92-5213c471eb04\tfsbuild\u TDC5DFC1BLD24\u 2020-04-10.11\u 47\u 23.覆盖率
    ,但它被复制到了
    d:\\u wf\06\13\TestResults\tests\tfsbuild\u TDC5DFC1BLD24\u 2020-04-10\u 11\u 47\u 29\In\TDC5DFC1BLD24\tfsbuild\u TDC5DFC1BLD24\u 2020-04-10.11\u 47\u 23.覆盖范围

    我的错误是只删除了原始位置。当在这两个地方被删除时,代码覆盖率页面就如预期的那样——不再有无用的超链接,而是实际覆盖率

    YAML中已更正的powershell任务如下所示:

    - powershell: |
        $cc = "$(Get-NuGetPackageBaseFolder Microsoft.CodeCoverage)\build\netstandard1.0\CodeCoverage\CodeCoverage.exe"
        $BinaryCoverageFile = Get-Item "$(Common.TestResultsDirectory)\tests\*\*.coverage"
        & $cc analyze /output:$(Common.TestResultsDirectory)\vstest-coverage.xml $BinaryCoverageFile.FullName
        Remove-Item (Get-ChildItem -Path "$(Common.TestResultsDirectory)\tests" -Recurse -Filter $BinaryCoverageFile.Name).FullName
      displayName: Convert Coverage Result To Xml
    
    当然,发布测试结果任务必须移动到此任务之后