Azure DevOps 中的 Pester 5 代码覆盖率 - 文件不存在(不再存在)

Pester 5 code coverage in Azure DevOps - File does not exist (any more)

自从 Pester 5 以来,建议使用 Pester 配置来生成测试和代码覆盖率输出。老派的 Pester 4 方法仍然有效,但我们想摆脱遗留警告。 由于我们开始使用 Pester Configuration,Azure DevOps 不再显示突出显示的预览文件。

错误看起来像这样;

我的 PowerShell 代码:

$pesterConfiguration = @{
    Run = @{
        Path = '.\Interfaces'
    }
    Should = @{
        ErrorAction = 'Continue'
    }
    CodeCoverage = @{
        CodeCoveragePath = $codeCoveragePath
        OutputFormat = 'JaCoCo'
        OutputEncoding = 'UTF8'
        OutputPath = ".\Pester-Coverage.xml"
        Enabled = $true
    }
    TestResult = @{
        OutputPath = ".\Pester-Test.xml"
        OutputFormat = 'NUnitXml'
        OutputEncoding = 'UTF8'
        Enabled = $true
    }
}

#Invoke pester with the configuration hashtable
$config = New-PesterConfiguration -Hashtable $pesterConfiguration
Invoke-Pester -Configuration $config

Azure DevOps yaml 上传代码覆盖率

- task: PublishCodeCoverageResults@1
  inputs:
    codeCoverageTool: 'JaCoCo'
    summaryFileLocation: '**/Pester-Coverage.xml'
    pathToSources: $(System.DefaultWorkingDirectory)
    failIfCoverageEmpty: true

使用老派的 Pester 4 方法,代码覆盖效果很好。

Invoke-Pester -Script $TestFiles -CodeCoverage $NotTestFiles -OutputFile $OutFile -OutputFormat NUnitXml -CodeCoverageOutputFile $OutCoverageFile

我正在结合使用 Pester 5.3.1Powershell Core 7.2.2

有没有人破解这个案例并设法解决这个烦恼?

我们通过在创建后更改 Pester-Coverage.xml 文件设法解决了这个问题。直接在Invoke-Pester -Configuration $config命令下添加这段代码。

[xml]$pesterCoverageOut = get-content -path ".\Pester-Coverage.xml"
foreach ($classNode in $pesterCoverageOut.SelectNodes("//class")) {
    $classNode.sourcefilename = "Interfaces/$($classNode.sourcefilename)"
}
foreach ($sourceFileNode in $pesterCoverageOut.SelectNodes("//sourcefile")) {
    $sourceFileNode.name = "Interfaces/$($sourceFileNode.name)"
}
$pesterCoverageOut.Save(".\Pester-Coverage.xml")

在 Pester github 上创建了关于此解决方案的错误报告。 https://github.com/pester/Pester/issues/2149