You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Pester测试无函数的Azure PowerShell脚本并验证输出?

解决Azure PowerShell函数的Pester测试报错问题

你遇到的“the term 'run' is not recognized”错误,核心原因是**run.ps1是脚本文件而非命名函数**:用. sourcing脚本后,脚本会直接执行,并不会定义一个名为run的函数供后续调用。

下面提供两种可行的解决方案:

方案1:将脚本逻辑封装为函数(推荐)

这种方式既不影响Azure函数的正常运行,又能方便地进行单元测试。

修改原run.ps1文件

将原脚本逻辑封装成函数,并保留原入口逻辑,确保生产环境不受影响:

function Invoke-MyFunction {
    param($Request, $TriggerMetadata)
    Write-Host $Request.Param1
    Write-Host $Request.ParamB
    Write-Host $Request.ParamC
    return 200
}

# 保留Azure函数原生执行逻辑
if ($MyInvocation.InvocationName -ne '&') {
    Invoke-MyFunction -Request $Request -TriggerMetadata $TriggerMetadata
}

修改Pester测试脚本

现在可以直接调用封装好的函数,同时修正原测试中ParamA与Param1的拼写不一致问题:

using namespace System.Diagnostics.CodeAnalysis

Describe "Test Run" {
    BeforeAll {
        $FunctionDir = $PSScriptRoot.Replace('Tests', 'myFunction')
        . $FunctionDir\run.ps1 # 加载封装的函数
    }

    It "返回200状态码" {
        $Request = [PSCustomObject]@{
            Param1 = 'A' # 与原脚本参数名保持一致
            ParamB = 'B'
            ParamC = 'C'
        }
        $result = Invoke-MyFunction -Request $Request
        $result | Should -Be 200
    }

    It "输出预期的Host信息" {
        $Request = [PSCustomObject]@{
            Param1 = 'A'
            ParamB = 'B'
            ParamC = 'C'
        }
        # 捕获Write-Host输出(Write-Host写入编号为6的信息流)
        $hostOutput = & { Invoke-MyFunction -Request $Request } 6>&1
        $hostOutput | Should -Contain 'A'
        $hostOutput | Should -Contain 'B'
        $hostOutput | Should -Contain 'C'
    }
}

方案2:直接调用脚本文件(无需修改原脚本)

如果不想改动原函数脚本,可以直接调用脚本文件路径并传递参数:

修改Pester测试脚本

using namespace System.Diagnostics.CodeAnalysis

Describe "Test Run" {
    BeforeAll {
        $FunctionPath = Join-Path ($PSScriptRoot.Replace('Tests', 'myFunction')) 'run.ps1'
    }

    It "返回200状态码" {
        $Request = [PSCustomObject]@{
            Param1 = 'A' # 修正参数名拼写
            ParamB = 'B'
            ParamC = 'C'
        }
        # 直接调用脚本文件并传递参数
        $result = & $FunctionPath -Request $Request
        $result | Should -Be 200
    }

    It "输出预期的Host信息" {
        $Request = [PSCustomObject]@{
            Param1 = 'A'
            ParamB = 'B'
            ParamC = 'C'
        }
        # 捕获脚本的信息流输出
        $hostOutput = & { & $FunctionPath -Request $Request } 6>&1
        $hostOutput | Should -Contain 'A'
        $hostOutput | Should -Contain 'B'
        $hostOutput | Should -Contain 'C'
    }
}

内容的提问来源于stack exchange,提问作者Kamsiinov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 08:31:01