Files
BakNRet/tests/Run-Pester.ps1
T
Shuery 2937eb6652 chore: 记录改造前基线
改造开始前的完整状态,作为可回退的基点。此提交之后:Pester 175 项、零依赖套件 101 项全绿;PowerShell 5.1 尚不可用(源文件无 BOM)。

包含此前未提交的在制品:安全描述符套件、Hyper-V 实验环境(tools/lab)、agent 约定(AGENTS.md 与 docs/agents)。

.gitignore 增加 *.key / *.pfx:BackupConfig.psd1 的 PasswordFile 此前默认指向仓库内的 baknret.key,一次 git add -A 就会把口令提交进版本库。默认值在后续提交中改为空。
2026-09-26 21:46:55 +08:00

102 lines
4.3 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<#
.SYNOPSIS
跑 BakNRet 的 Pester 测试套件(tests/BakNRet.Tests.ps1)。
.DESCRIPTION
Pester 从哪儿来,按优先级:
1. 仓库内的 .tools\modules(由 tools/Install-TestDependencies.ps1 放的本地副本,已 gitignore);
2. 机器上已安装的 Pester 5+。
两者都没有时给出一条明确的安装命令并以退出码 2 结束,而不是抛一堆看不懂的错。
为什么显式要求 Pester 5.0+:3.4.0 没有 `Should -Be`,本套件会直接语法错误。
本脚本只把 .tools\modules 临时加进 PSModulePath,**不会**去改机器上的全局模块。
.EXAMPLE
pwsh -File .\tests\Run-Pester.ps1
.EXAMPLE
pwsh -File .\tests\Run-Pester.ps1 -Verbosity Minimal
#>
[CmdletBinding()]
param(
[ValidateSet('Detailed', 'Normal', 'Minimal', 'None')]
[string]$Verbosity = 'Detailed',
[string[]]$Tag,
# 默认跑 tests/ 下所有 *.Tests.ps1(Pester 按这个命名约定发现)
[string]$TestPath = $PSScriptRoot
)
$ErrorActionPreference = 'Stop'
$projectRoot = Split-Path -Parent $PSScriptRoot
$localModules = Join-Path $projectRoot '.tools\modules'
if (Test-Path -LiteralPath $localModules) {
$env:PSModulePath = $localModules + [System.IO.Path]::PathSeparator + $env:PSModulePath
}
$pester = Get-Module -ListAvailable Pester |
Where-Object { [version]$_.Version -ge [version]'5.0.0' } |
Sort-Object { [version]$_.Version } -Descending |
Select-Object -First 1
if (-not $pester) {
$installed = @(Get-Module -ListAvailable Pester | ForEach-Object { $_.Version.ToString() })
Write-Host ''
Write-Host '找不到 Pester 5.0+,无法运行 Pester 套件。' -ForegroundColor Red
if ($installed.Count -gt 0) {
Write-Host ("已安装的版本:{0}(3.x 没有 Should -Be,本套件会语法错误)" -f ($installed -join '、')) -ForegroundColor Yellow
}
Write-Host ''
Write-Host '两种拿到 Pester 5+ 的方式(任选其一):' -ForegroundColor Cyan
Write-Host ' A. 只装到仓库里(推荐,不动机器上的全局模块):' -ForegroundColor Cyan
Write-Host ' .\tools\Install-TestDependencies.ps1' -ForegroundColor Gray
Write-Host ' B. 装到当前用户:' -ForegroundColor Cyan
Write-Host ' Install-Module Pester -Scope CurrentUser -MinimumVersion 5.0.0' -ForegroundColor Gray
Write-Host ''
Write-Host '零依赖的替代方案:.\tests\Run-Tests.ps1(不需要 Pester)' -ForegroundColor Cyan
Write-Host ''
exit 2
}
Import-Module $pester.Path -Force
Write-Host ("Pester {0} ({1})" -f $pester.Version, $pester.ModuleBase) -ForegroundColor DarkGray
Write-Host ("测试文件:{0}" -f $TestPath) -ForegroundColor DarkGray
$configuration = New-PesterConfiguration
$configuration.Run.Path = $TestPath
$configuration.Run.PassThru = $true
$configuration.Run.Exit = $false
$configuration.Output.Verbosity = $Verbosity
if ($Tag) { $configuration.Filter.Tag = $Tag }
# 关掉 Pester 的 TestRegistry:它会去写注册表(HKCU 下的测试键),
# 在受限环境 / 沙箱里会被拒绝,于是**所有**容器都以
# "Was not able to registry key for TestRegistry" 失败。
# 本套件不用 TestRegistry(只用临时目录),关掉它不影响任何用例。
$configuration.TestRegistry.Enabled = $false
$result = Invoke-Pester -Configuration $configuration
# 容器级失败(发现阶段的语法错误、Describe 外的异常)不会进 FailedCount,
# 只会在输出里出现一行 "Container failed" —— 不显式检查就会把"根本没跑起来"
# 报成"全部通过"。这里把它也当成失败。
$failedContainers = @($result.Containers | Where-Object { $_.Result -eq 'Failed' })
Write-Host ''
if ($result.FailedCount -gt 0 -or $failedContainers.Count -gt 0) {
Write-Host ("Pester 测试通过 {0} 项,失败 {1} 项,跳过 {2} 项,容器级失败 {3} 个" -f `
$result.PassedCount, $result.FailedCount, $result.SkippedCount, $failedContainers.Count) -ForegroundColor Red
foreach ($container in $failedContainers) {
Write-Host (" 容器失败:{0}" -f $container.Item) -ForegroundColor Red
}
exit 1
}
Write-Host ("Pester 测试全部通过:{0} 项(跳过 {1} 项)" -f $result.PassedCount, $result.SkippedCount) -ForegroundColor Green
exit 0