提供测试用例给 Pester V5 测试

Providing test cases to Pester V5 test

我正在尝试编写 pester 测试 (v5) 以查看远程计算机上是否有各种服务 运行。这就是我所拥有的,它有效:

$Hashtable = @(
        @{ ComputerName = "computer1"; ServiceName = "serviceA" }
        @{ ComputerName = "computer1"; ServiceName = "serviceB" }
        @{ ComputerName = "computer2" ; ServiceName = "serviceB" }

    )


Describe "Checking services" {

        It "check <ServiceName> is running on <ComputerName>" -TestCases $Hashtable {
            ( get-service -computername $ComputerName -name $ServiceName ).status | Should -be "Running" 
        }

} 

我的问题是关于向测试提供测试数据(即计算机名称和服务列表)。假设我想向这个列表中添加更多服务。目前,我将通过向 $Hashtable 添加更多服务来修改我的 pester 文件。对我这样做感觉不太对,我想在这个早期阶段就把方法弄对。我的直觉告诉我,服务列表应该与 pester 文件分开。然后 运行 测试将涉及以某种方式导入服务列表。有谁知道我是否以错误的方式解决这个问题? 谢谢你的帮助 安德鲁

如果服务器和服务列表经常变化,最好从单独的文件中读取它,尤其是当您的测试处于版本控制之下时。这样你可以很容易地看到历史中只有测试数据发生了变化,而测试逻辑没有变化。

给定测试数据的良好文件格式为 CSV:

ComputerName, ServiceName
computer1, serviceA
computer1, serviceB
computer2, serviceB

您可以使用 Import-Csv 读取 CSV,但您必须将每一行转换为 hashtable,因为 Pester 需要一个用于 -TestCases 参数的哈希表数组。 Import-Csv 输出 PSCustomObject 的数组。


BeforeDiscovery {
    $script:testCases = Import-Csv $PSScriptRoot\TestCases.csv | ForEach-Object {
        # Convert row (PSCustomObject) to hashtable.
        $hashTable = @{}
        $_.PSObject.Properties | ForEach-Object { $hashTable[ $_.Name ] = $_.Value }
        # Implicit output that will be captured in array $script:testCases
        $hashTable
    }
}

Describe "Checking services" {

    It "check <ServiceName> is running on <ComputerName>" -TestCases $script:testCases {
        ( get-service -computername $ComputerName -name $ServiceName ).status | Should -be "Running" 
    }
} 

注意: 虽然不是绝对必要,但我已按照 docs 的建议将读取测试用例的代码放入 BeforeDiscovery 部分。这使我们的意图很明确。