Пестер тестирует более продвинутые сценарии PowerShell - PullRequest
0 голосов
/ 16 января 2020

Я уже некоторое время использую Pester для написания (простых) тестов для наших сценариев PowerShell, но, естественно, чем дальше, тем сложнее становятся сценарии. Я не разработчик (просто QA автоматизации) и, следовательно, не могу начать вносить изменения в существующий код, но мне нужно написать для них модульные тесты.

В следующем скрипте я сталкиваюсь с 2 проблемы:

Функция запускается запуском другого файла .ps1 с помощью оператора вызова. Этот другой сценарий может быть запущен только как администратор и выполняет некоторые проверки перед развертыванием. Теперь я не хочу тестировать этот внешний скрипт модульно, поэтому мне нужен способ смоделировать или обойти вызов & $ PSScriptRoot \ PreReqCheck.ps1. Я подумал, просто издеваться, что это было бы неплохо, но & зарезервировано для будущего использования, и я советую заключить его в кавычки в строку, что на самом деле не работает.

Второй (но я думаю, что это может быть Легче решить) следующее:

После запуска PreReqCheck определенные переменные будут заполнены ($ computerName, $ masterNodes, $ dataNodes) и продолжены оператором If / Elseif / Elseif, который в зависимости от набора переменных , получает и запускает сервис. Как этот кусок кода:

If ($computerName = "X")
{
    $masterNodes = @("1","2","3")
    $dataNodes = @("01","02","03")
}
Elseif ($computerName = "Y")
{
    $masterNodes = @("1","2","3")
    $dataNodes = @("01","02","03")

}
Elseif ($computerName = "Z")
{
    $masterNodes = @("1","2","3")
    $dataNodes = @("01","02","03")
}

forEach ($masterNode in $masterNodes)
{
    Does something
}

forEach ($dataNode in $dataNodes)
{
    Does something
}

Мой вопрос по этому поводу. Как лучше всего создать тест, в котором я могу указать, какие переменные использовать? Я пробовал что-то вроде этого:

Describe "ReconfigureMainCluster" {
Context "test" {

        Mock Set-Service
        Mock Get-service
        #Mock Write-Host
        Mock Start-Service
        $computerName = "X"

        It "checks something" {
            ReconfigureMainCluster
            Assert-MockCalled 'Set-Service' -Exactly 12
            Assert-MockCalled 'Write-Host' -Exactly 22
            Assert-MockCalled 'Get-Service' -Exactly 6
        }

            It "checks computername"{
                $computerName | Should be "X" 
   }
}

}

Это проходит, но когда я пишу аналогичный тест для computerName Y, переменная $ computerName остается X (я могу видеть это из-за комментирования Mock Write-Host, и один и тот же текст указывается дважды.

Я думаю, мне нужно будет где-то определить переменные, но не уверен, где и как ...

1 Ответ

0 голосов
/ 16 января 2020

Для первой части (оператор вызова) изменение его на start-process сработало

Для второй части изменение оригинальной части сценария powershell:

$ computerName = "Y" to $ computerName -eq "Y"

Кажется, что также работает.

Не уверен, что это лучший способ сделать это.

...