我有这个基础设施纠缠测试。用于演示目的的代码:
Describe 'WEB-Tests' {
$servers = 'ServerA','ServerB'
$sessions = @()
foreach ($server in $servers) {
$sessions += New-PSSession -ComputerName $server
}
$sessions | foreach-object {
Context " Service is Running on $($_.ComputerName)" {
$service = invoke-command -session $_ -scriptblock { get-service 'some service' }
It "Service $($service.Name) should be Running" {
$service.Status | Should be "Running"
}
}
}
}
这工作正常。如果我将 $sessions|foreach-object 替换为 $sessions|foreach-object -Parallel,我会收到此错误 -
New-PesterState: C:\Program Files\WindowsPowerShell\Modules\Pester\4.9.0\Functions\Context.ps1:77:128
Line |
77 | … '] .) -TestNameFilter $null -TagFilter @() -SessionState SessionState
| ~~~~~~~~~~~~
| Cannot process argument transformation on parameter 'SessionState'. Cannot convert the "SessionState" value of type "System.String" to type
| "System.Management.Automation.SessionState".
Exception: The Context command may only be used from a Pester test script.
由于有数百台服务器,请在此处建议如何实现并行性。
已解决-我通过使用作业找到了一种解决方法,它达到了目的。
Describe 'WEB-Tests' {
$servers = 'ServerA','ServerB'
$sessions = @()
foreach ($server in $servers) {
$sessions += New-PSSession -ComputerName $server
}
Get-Job | Remove-Job
invoke-command -session $sessions -scriptblock { get-service W3SVC,WAS } -AsJob
$j = Get-Job | wait-job
($results = $j | Receive-Job) | out-null
Context "IIS Services are Running" {
foreach ($result in $results) {
It "Service $($result.Name) should be Running on $($result.PSComputerName)" {
$result.Status | Should be "Running"
}
}
}
}