Работа с массивами в 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 (или с тем, что вы считаете более подходящим).

Другие вопросы по тегам