Pester 5.3.0搭配Start-Job执行测试报错找不到测试文件如何解决
问题根因
- Pester v5.3.0 强化了测试文件路径和命名的校验逻辑,同时Job进程的工作目录与父进程不一致,共同触发了找不到测试文件的报错
- 具体触发点有三个:
- Job进程默认工作目录为当前用户的家目录,你传递的相对路径在Job进程的上下文下无法匹配到真实测试文件
- 测试文件命名不符合Pester默认要求:v5.3.0默认仅识别后缀为
*.Tests.ps1的文件为合法测试文件,你当前使用的.test.ps1后缀不符合校验规则 - 循环语法存在逻辑瑕疵:
foreach ($file in $TestFiles[1])仅会遍历数组的第二个元素,若后续需要扩展测试文件列表会出现异常
修复方案
- 重命名测试文件,将后缀统一调整为
*.Tests.ps1,比如把test_counters.test.ps1改为test_counters.Tests.ps1 - 传递绝对路径给Job进程,避免相对路径的上下文匹配问题
- 可在Job脚本块中增加文件存在性校验,方便后续排查问题
修正后的参考代码
$TestFiles = @( ".\pestertests\test_new_counters.Tests.ps1", ".\pestertests\test_counters.Tests.ps1" ) # 若仅需执行第二个测试文件,直接取$file = $TestFiles[1]即可,无需循环 foreach ($file in $TestFiles) { $mainScript = { Param ( $scriptPath ) # 可选:增加文件存在校验,方便排查路径问题 if (-not (Test-Path $scriptPath -PathType Leaf)) { throw "测试文件不存在:$scriptPath,当前工作目录:$PWD" } $container = New-PesterContainer -Path $scriptPath Invoke-Pester -Container $container -Output Diagnostic -PassThru } # 转换为绝对路径传递给Job $absolutePath = (Resolve-Path $file).Path $job = Start-Job -Name UninstallCounterCheck -ScriptBlock $mainScript -ArgumentList $absolutePath $results = $job | Receive-Job -Wait -AutoRemoveJob }
额外验证步骤
如果修改后仍报错,可以先在Job脚本块中输出$scriptPath和$PWD的值,确认路径和工作目录是否符合预期,排除权限、路径拼写等低级错误。
内容的提问来源于stack exchange,提问作者M Thompson
相关产品推荐
相关产品推荐

