使用foreach-object -parallel运行Pester测试时出错

问题描述

我已经进行了基础设施瘟疫测试。用于演示的代码:

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

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)