You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Pester(V5.3.3)测试用例参数化数据库实例以减少重复代码?

Pester V5.3.3 数据库登录检查的参数化优化方案

针对你需要在多个数据库实例上批量检查登录名存在性的场景,以下是几种可行的参数化方案,彻底消除代码重复:

方案一:Describe块级参数化(Pester 5+特性)

利用Describe的-ForEach参数,为每个数据库实例生成独立的测试上下文,自动关联对应的标签:

# 定义测试环境:数据库实例+对应标签
$dbEnvironments = @(
    @{ DbInstance = 'dev01'; Tag = 'DEV' }
    @{ DbInstance = 'sit01'; Tag = 'SIT' }
)

# 需要检查的登录名列表
$requiredLogins = @('login1', 'login2', 'login3')

Describe 'Check that logins exist' -ForEach $dbEnvironments {
    It "Check that <login> exists on $DbInstance" -Tag $Tag -TestCases ($requiredLogins | ForEach-Object { @{ login = $_ } }) {
        $login = Get-DbaLogin -SqlInstance $DbInstance -SqlCredential $cred -Login $login
        $login | Should -Not -BeNullOrEmpty
    }
}

说明

  • -ForEach会遍历$dbEnvironments中的每个对象,每个对象对应一个独立的Describe执行上下文,自动注入DbInstance和Tag变量
  • 登录名列表通过管道转成哈希表数组,作为It块的测试用例,每个登录名生成一条测试

方案二:动态生成全量测试用例

通过嵌套循环生成数据库实例+登录名的笛卡尔积测试用例,用单个It块处理所有场景:

# 数据库实例列表
$dbInstances = @('dev01', 'sit01')
# 需要检查的登录名列表
$requiredLogins = @('login1', 'login2', 'login3')

# 生成所有组合的测试用例,自动匹配标签
$testCases = foreach ($instance in $dbInstances) {
    $tag = if ($instance -like 'dev*') { 'DEV' } else { 'SIT' }
    foreach ($login in $requiredLogins) {
        @{
            DbInstance = $instance
            LoginName  = $login
            Tag        = $tag
        }
    }
}

Describe 'Check that logins exist' {
    It "Check that <LoginName> exists on <DbInstance>" -Tag <Tag> -TestCases $testCases {
        $login = Get-DbaLogin -SqlInstance $DbInstance -SqlCredential $cred -Login $LoginName
        $login | Should -Not -BeNullOrEmpty
    }
}

说明

  • 所有测试场景提前生成在$testCases数组中,It块会自动遍历执行每个用例
  • 标签通过实例名称规则自动匹配,无需手动重复编写

方案三:运行时传入测试实例(灵活扩展)

允许在运行测试时动态指定要检查的数据库实例,适合按需测试不同环境:

# 定义参数,支持运行时传入数据库实例,默认包含DEV和SIT
param(
    [string[]]$DbInstances = @('dev01', 'sit01')
)

$requiredLogins = @('login1', 'login2', 'login3')

# 生成对应测试用例
$testCases = foreach ($instance in $DbInstances) {
    $tag = switch -Wildcard ($instance) {
        'dev*' { 'DEV' }
        'sit*' { 'SIT' }
        default { 'OTHER' }
    }
    $requiredLogins | ForEach-Object {
        @{
            DbInstance = $instance
            LoginName  = $_
            Tag        = $tag
        }
    }
}

Describe 'Check that logins exist' {
    It "Check that <LoginName> exists on <DbInstance>" -Tag <Tag> -TestCases $testCases {
        $login = Get-DbaLogin -SqlInstance $DbInstance -SqlCredential $cred -Login $LoginName
        $login | Should -Not -BeNullOrEmpty
    }
}

运行方式

执行测试时可以指定实例:

Invoke-Pester -Script .\LoginCheck.Tests.ps1 -Parameters @{ DbInstances = 'prod01', 'prod02' }

内容的提问来源于stack exchange,提问作者Andy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 20:26:07