Написание тестов для функций PowerShell - PullRequest
0 голосов
/ 20 мая 2019

У меня есть следующая функция (функция является вспомогательной функцией другой функции, и она работает правильно):

function Get-UserManager {
[CmdletBinding()]
param (
    [pscredential] $credential,
    [ValidateSet('ID')][string]$searchType,
    [string]$searchString,
)    

try {
    $reply = Invoke-RestMethod -Method Get -Uri $full_uri -Credentia $cred
} catch {
    Write-Verbose "Couldn't connect to the End Point"
    Write-Debug "$($_.Exception)"
    return $userListObject
}

$reply.elements | ForEach-Object {

    return $_    

  }

}

Мне необходимо написать тест PowerShell для следующей функции (тест должен включать все возможные выходные данные, поскольку мне нужно, чтобы охват кода составлял 100%).

Может кто-нибудь помочь мне, как написать тест PowerShell, который может проверить все возможные выходы этой функции?

Тест должен быть таким:

$moduleRoot = Resolve-Path "$PSScriptRoot\.."
$moduleName = Split-Path $moduleRoot -Leaf
$cred = Get-Credential

Describe "Demonstarting Code Coverage of: $moduleName" {

 It "Calls Function: get-UserManager" {
    {Get-UserManager -credential $cred -searchType ID -searchString 
    '12345' -delimiter} | Should Be $userListObject
}

}

Ответы [ 2 ]

0 голосов
/ 20 мая 2019

Ваш код в настоящее время не функционирует, я полагаю, потому что вы сократили его для совместного использования в StackOverflow, но пропустили некоторые ключевые элементы. Например, $full_uri и $userListObject не заполнены, но используются в функции, и у вас есть лишняя запятая в блоке параметров.

При этом, вы, вероятно, захотите использовать подход Mocking для имитации частей вашего скрипта, чтобы вы могли вызвать различное поведение и посещать каждый путь, чтобы получить 100% покрытие кода. Например, вам нужен тест, в котором API возвращает исключение и входит в ваш блок Catch. Это может выглядеть так:

Describe "Demonstarting Code Coverage of: $moduleName" {

    Context 'Unable to connect to the endpoint' {

        Mock Invoke-RestMethod { Throw 'Endpoint unavailable' }
        Mock Write-Verbose
        Mock Write-Debug

        It 'Should enter the catch block when the endpoint returns an error' {
            Get-UserManager -Verbose -Debug
            Assert-MockCalled Write-Verbose -Times 1 -Exactly
            Assert-MockCalled Write-Debug -Times 1 -Exactly
        }
    }
}

Если вы совершенно не знакомы с Пестером, насмешка может быть сложной темой, чтобы сначала разобраться. Я рекомендую сначала изучить Пестер. В прошлом году я выступил с докладом о начале работы с Пестером на PSDay, который может показаться вам информативным.

0 голосов
/ 20 мая 2019

Я предполагаю, что вы используете Pester, который является средой разработки, управляемой поведением (BDD).То есть он предназначен для того, чтобы помочь вам проверить поведение вашего кода.

В идеале вы должны сначала разработать тесты в соответствии со спецификацией, а затем написать код, но, поскольку у вас уже есть код, выВам нужно будет подумать о возможных способах его использования и о том, как вы ожидаете, что он будет вести себя в каждом конкретном случае.Например, глядя на ваш код, что вы ожидаете, если $searchString пусто или неверные учетные данные переданы?Как вы можете проверить, происходит ли это на самом деле?

Между прочим, покрытие кода связано с путями выполнения в вашем коде и то, что у вас есть 100% покрытие, не означает, что вы полностью протестировали код.Например, рассмотрим следующую базовую функцию:

function Get-Product {
    Param (
        $Param1,
        $Param2
    )

    return $Param1 * $Param2
}

Один тест, который вызывает, скажем, Get-Product -Param1 12 -Param2 3, будет иметь 100% покрытие кода, поскольку он проверяет все возможные пути в коде, но не говоритмне, как мой код обрабатывает, например, $Param1, являющийся строкой (например, «12») или один параметр является отрицательным, и т. д., так что я на самом деле не проверил это полностью.

...