1

我有这个基础设施纠缠测试。用于演示目的的代码:

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

0 回答 0