为PowerShell函数编写测试

时间:2019-05-20 14:55:07

标签: powershell powershell-v3.0 pester

我具有以下功能(该功能是另一个功能的辅助功能,并且可以正常工作):

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 :(得分:0)

我假设您正在使用Pester,它是行为驱动的开发(BDD)框架。也就是说,它旨在帮助您验证代码的行为。

理想情况下,您首先要根据规范设计测试,然后编写代码,但是由于已经有了代码,因此,您需要考虑可以使用它的方式以及预期的行为方式在每种情况下。例如,查看您的代码,如果$searchString为空或传递了无效的凭据,您期望发生什么?您如何测试这种情况是否真的发生?

顺便说一句,代码覆盖率与代码中的执行路径有关,仅仅因为您具有100%的覆盖率,并不意味着您已经完全测试了代码。例如,考虑以下基本功能:

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

    return $Param1 * $Param2
}

调用Get-Product -Param1 12 -Param2 3的单个测试将覆盖100%的代码覆盖率,因为它测试了代码中的所有可能路径,但是没有告诉我代码的处理方式,例如{{1 }}是一个字符串(例如“ 12”)或一个参数为负,等等,所以我还没有真正对其进行全面的测试。

答案 1 :(得分:0)

您的代码目前无法正常运行,我想是因为您减少了代码的使用量,使其可以在StackOverflow上共享,但是省略了一些关键要素。例如,$full_uri$userListObject未填充,但在函数中使用,并且在param块中还有一个逗号。

话虽这么说,您可能想采用模拟方法来模拟脚本的各个部分,以便您可以强制发生不同的行为并访问每条路径,以获取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
        }
    }
}

如果您不是Pester的新手,那么起初,嘲弄可能是一个棘手的话题。我建议先在Pester上进行一些学习。去年我在PSDay上做了a talk on Getting Started with Pester,您可能会发现翔实的信息。