Error on running Pester test using foreach-object -parallel

695 Views Asked by At

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"
            }        
        }
    }
}
0

There are 0 best solutions below