版本信息最后核对:2026-10-25
脚本开始被多人使用、要接入 CI、或修改后需要确认没有回归时,就应该写测试。适合验证函数返回值、抛错条件、管道输入、模块导出边界,以及对外部命令的调用次数。
一次性排障脚本不需要完整测试;但任何会被计划任务、发布流水线或其他人复用的逻辑,都值得至少覆盖主路径和一个失败路径。
Describe 描述一个被测对象,Context 划分场景,It 是最小断言。文件名通常以 .Tests.ps1 结尾,便于 Pester 发现。Should -Be、-Throw、-Match、-HaveCount 等操作符;BeforeAll 在每个容器前执行一次,BeforeEach 在每个 It 前执行,AfterAll 负责清理。Mock 替换命令实现,验证代码是否按预期调用外部依赖;Should -Invoke 断言调用次数和参数。模块内部函数要用 InModuleScope 或 -ModuleName 才能 Mock。Invoke-Pester -Output Detailed 输出每个用例;-CI 让失败时返回非零退出码;-CodeCoverage 生成脚本覆盖率,但不等于逻辑覆盖。Get-Module -ListAvailable Pester 确认版本,再安装 5.x。# 1. 确认 Pester 版本;旧版 3.4 的断言语法不能直接套用
PS C:\> Get-Module -ListAvailable Pester | Select-Object Name, Version, Path
PS C:\> Install-Module Pester -Scope CurrentUser -MinimumVersion 5.0 -Force
# 2. 被测函数,保存为 Get-Widget.ps1
function Get-Widget {
param([string] $Name)
if (-not $Name) { throw 'Name required' }
[pscustomobject]@{ Name = $Name; Id = 42 }
}
# 3. 测试文件 Get-Widget.Tests.ps1
BeforeAll { . $PSScriptRoot/Get-Widget.ps1 }
Describe 'Get-Widget' {
It 'returns the requested name' { (Get-Widget -Name 'api').Name | Should -Be 'api' }
It 'throws for an empty name' { { Get-Widget -Name '' } | Should -Throw }
}
# 4. 运行单文件并输出详细结果;CI 中让失败返回非零并收集覆盖率
PS C:\> Invoke-Pester -Path .\Get-Widget.Tests.ps1 -Output Detailed
PS C:\> Invoke-Pester -Path .\tests -CI -CodeCoverage .\Get-Widget.ps1
# 5. Mock 外部依赖,验证调用次数而不是真的发请求
Describe 'Remove-Widget' {
BeforeAll { function Remove-Widget { param($Name) Invoke-RestMethod -Uri "https://api.example.test/widgets/$Name" -Method Delete } }
It 'calls the API once' {
Mock Invoke-RestMethod { @{ ok = $true } }
Remove-Widget -Name 'api'
Should -Invoke Invoke-RestMethod -Times 1 -Exactly
}
}
Should Be、Assert-MockCalled 直接用在 Pester 5 上会报参数错误。先看版本,再统一用 Should -Be 和 Should -Invoke。Describe/It 外、BeforeAll 外的变量赋值在运行阶段可能为 $null。准备逻辑放进 BeforeAll。TestDrive: 放临时文件。-CI 时,测试失败只打印结果,进程退出码可能仍是 0;流水线会误判成功,入口命令要显式加 -CI 或检查结果对象。合上页面,先回答,再展开对照。
Describe 外写 $fixture = Get-Content ... 然后直接在 It 里用?BeforeAll。Mock Invoke-RestMethod 替换实现,再用 Should -Invoke Invoke-RestMethod -Times 1 -Exactly 断言调用次数和参数。-CI 或没有检查 Pester 结果对象;默认失败不保证进程返回非零退出码,要在入口显式设置。
小程序版
微信扫码,随时查命令