Работа с массивами в Powershell (тестирование с помощью Pester)
У меня есть небольшие проблемы с пониманием того, как реализовать этот процесс. Я хочу получить общее количество баллов, чтобы в случае успешного прохождения теста его можно было добавить в массив. Этот массив будет учитываться по длине.
Это мой код в качестве примера:
#This stores the array of the number of passed and failed test
$passed = @()
$failed = @()
Describe "Template Syntax" {
It "Has a JSON template" {
$fileLocation = "$here\azuredeploy.json"
$fileCheck = $fileLocation | Test-Path
if ($fileCheck -eq $true) { $passed = $passed + 1
Write-Host "1st file exist " }
if ($fileCheck -eq $false) { $failed = $failed + 1
Write-Host "1st file does exist" }
}
It "Has a parameters file" {
$fileLocation ="$here\azuredeploy.parameters*.json"
$fileCheck = $fileLocation | Test-Path
if ($fileCheck -eq $true) { $passed = $passed + 1;
Write-Host "2nd file exist "}
if ($fileCheck -eq $false) { $failed = $failed + 1
Write-Host "2nd file does exist" }
}
PrintArgs
}
function PrintArgs(){
Write-Host -ForegroundColor yellow "Passed: $($passed.Length) Failed: $($failed.Length)"
}
Есть ли другой способ или другой подход, который я могу сделать, чтобы достичь этого? Я знаю, что pester делает это автоматически, однако я хочу использовать скрипт Powershell для тестирования.
2 ответа
Ваши тесты Пестера на самом деле не являются тестами Пестера, если вы не включите Should
утверждение. Я думаю, что вы должны переписать свои тесты следующим образом:
Describe "Template Syntax" {
$fileLocation = "$here\azuredeploy.json"
$fileCheck = $fileLocation | Test-Path
It "Has a JSON template" {
$fileCheck | Should -Be $true
}
$fileLocation ="$here\azuredeploy.parameters*.json"
$fileCheck = $fileLocation | Test-Path
It "Has a parameters file" {
$fileCheck | Should -Be $true
}
}
Если вы затем запустите это с Invoke-Pester
в конце вы автоматически получаете итоги пройденных и неудачных испытаний. Если вам нужен доступ к этим значениям, вы можете использовать -PassThru
вернуть их в переменную. Например:
$Results = Invoke-Pester .\your.tests.ps1 -PassThru
Затем вы можете получить количество пройденных и неудачных испытаний следующим образом:
$Results.PassedCount
$Results.FailedCount
Если вы действительно хотите использовать свои собственные счетчики (что будет означать сохранение большого количества ненужной логики), вы можете сделать следующее:
$Passed = 0
$Failed = 0
Describe "Template Syntax" {
$fileLocation = "$here\azuredeploy.json"
$fileCheck = $fileLocation | Test-Path
It "Has a JSON template" {
$fileCheck | Should -Be $true
}
if ($fileCheck -eq $true) { $Passed++ } else { $Failed++ }
$fileLocation ="$here\azuredeploy.parameters*.json"
$fileCheck = $fileLocation | Test-Path
It "Has a parameters file" {
$fileCheck | Should -Be $true
}
if ($fileCheck -eq $true) { $Passed++ } else { $Failed++ }
Write-Host -ForegroundColor yellow "Passed: $Passed Failed: $Failed"
}
Обратите внимание, что Describe
Блок действует как вид сценария, поэтому вы должны напечатать значения $Passed
а также $Failed
в пределах Describe
чтобы получить значения.
Глядя на ваш код, вам не нужны массивы для подсчета очков. Вместо определения $passed
а также $failed
как массивы, просто установите их как целочисленные счетчики с начальным значением 0
$passed = $failed = 0
Тогда вместо вызова функции PrintArgs() вы просто делаете
Write-Host -ForegroundColor yellow "Passed: $passed Failed: $failed"
Кстати, для увеличения счетчика вы можете просто сделать $passed++
вместо $passed = $passed + 1
Если вы действительно настаиваете на использовании массивов, вы можете изменить $passed = $passed + 1
что-то вроде $passed += $true
, Делая это, вы добавляете в массив новый элемент со значением $true (или с тем, что вы считаете более подходящим).