I have this infrastructure pester test. Code for demonstration purpose:
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"
}
}
}
}
This works fine. If I replace the $sessions|foreach-object with $sessions|foreach-object -Parallel, i get this error -
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.
Please suggest on how to achieve parallelism here as there are hundreds of servers.
RESOLVED-I figured out a workaround by using jobs and it serves the purpose.
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"
}
}
}
}