为Pester V5测试提供测试用例



我正在尝试编写一个纠缠测试(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添加更多服务来修改我的纠缠文件。对我来说,这样做感觉不太对,我希望在这个早期阶段就得到正确的方法。我的直觉告诉我,服务列表应该与纠缠文件分开。然后运行测试将涉及以某种方式导入服务列表。有人知道我是不是走错路了吗?谢谢你的帮助安德鲁。

如果服务器和服务的列表将经常更改,那么从单独的文件中读取它将是一个好主意,特别是如果您将测试置于版本控制之下。通过这种方式,您可以很容易地在历史记录中看到,只有测试数据改变了,但是测试逻辑没有改变。

对于给定的测试数据,一个好的文件格式是CSV:
ComputerName, ServiceName
computer1, serviceA
computer1, serviceB
computer2, serviceB

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


BeforeDiscovery {
$script:testCases = Import-Csv $PSScriptRootTestCases.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" 
}
} 

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

最新更新