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

如何在PowerShell脚本中启停Stoplight Prism Mock服务?

在PowerShell中控制Prism Mock Server的启停流程

核心思路

直接执行npx prism mock会阻塞当前PowerShell会话,因此需要将Prism作为后台进程启动,记录进程ID,完成测试后再强制终止进程,以此实现自动化的启停控制。

完整脚本示例

单文件测试流程

# 配置参数
$openapiFile = "./your-api-spec.yaml"  # 替换为你的OpenAPI文件路径
$prismPort = 4010                     # 指定Prism监听端口
$logFile = "./prism-run.log"          # 日志输出文件
$maxWaitTime = 30                     # 服务启动最大等待时间(秒)

# 1. 启动Prism后台进程
Write-Host "启动Prism服务,监听端口$prismPort..."
$prismProcess = Start-Process -FilePath "npx" `
    -ArgumentList "prism mock $openapiFile --port $prismPort" `
    -NoNewWindow -PassThru `
    -RedirectStandardOutput $logFile `
    -RedirectStandardError $logFile
$prismPID = $prismProcess.Id

# 2. 等待服务就绪
Write-Host "等待服务启动..."
$startTime = Get-Date
$serviceReady = $false

while (-not $serviceReady -and ((Get-Date) - $startTime).TotalSeconds -lt $maxWaitTime) {
    try {
        # 访问Prism根路径验证服务是否启动
        Invoke-RestMethod -Uri "http://localhost:$prismPort" -Method Get -ErrorAction Stop
        $serviceReady = $true
        Write-Host "Prism服务已就绪"
    }
    catch {
        Start-Sleep -Seconds 2
    }
}

if (-not $serviceReady) {
    Write-Error "Prism服务启动超时,终止流程"
    Stop-Process -Id $prismPID -Force
    exit 1
}

# 3. 执行API测试(替换为你的实际测试逻辑)
Write-Host "开始执行API测试..."
try {
    # 示例:调用GET /users接口
    $response = Invoke-RestMethod -Uri "http://localhost:$prismPort/api/users" -Method Get
    Write-Host "测试通过:GET /users 响应状态正常"
    # 可添加更多测试用例...
}
catch {
    Write-Warning "测试失败:$($_.Exception.Message)"
}

# 4. 关闭Prism服务
Write-Host "关闭Prism服务..."
Stop-Process -Id $prismPID -Force
Write-Host "Prism服务已终止,进程ID:$prismPID"

多文件循环测试流程

如果需要批量处理多个OpenAPI文件,可遍历文件列表,为每个实例分配独立端口避免冲突:

# 配置参数
$specDir = "./api-specs"               # OpenAPI文件所在目录
$basePort = 4010                       # 基础端口,每个文件递增
$maxWaitTime = 30

# 获取所有OpenAPI文件(支持yaml/yml/json)
$openapiFiles = Get-ChildItem -Path $specDir -Include "*.yaml", "*.yml", "*.json" -File

foreach ($file in $openapiFiles) {
    Write-Host "`n=== 开始处理文件:$($file.Name) ==="
    $currentPort = $basePort + [array]::IndexOf($openapiFiles, $file)
    $logFile = "./prism-$($file.BaseName).log"

    # 启动Prism服务
    $prismProcess = Start-Process -FilePath "npx" `
        -ArgumentList "prism mock $($file.FullName) --port $currentPort" `
        -NoNewWindow -PassThru `
        -RedirectStandardOutput $logFile `
        -RedirectStandardError $logFile
    $prismPID = $prismProcess.Id

    # 等待服务就绪
    $startTime = Get-Date
    $serviceReady = $false
    while (-not $serviceReady -and ((Get-Date) - $startTime).TotalSeconds -lt $maxWaitTime) {
        try {
            Invoke-RestMethod -Uri "http://localhost:$currentPort" -Method Get -ErrorAction Stop
            $serviceReady = $true
            Write-Host "Prism服务已就绪(端口$currentPort)"
        }
        catch {
            Start-Sleep -Seconds 2
        }
    }

    if (-not $serviceReady) {
        Write-Error "$($file.Name) 服务启动超时,跳过测试"
        Stop-Process -Id $prismPID -Force
        continue
    }

    # 执行针对当前文件的测试逻辑
    Write-Host "执行$($file.Name)的API测试..."
    # 示例:根据当前API规范编写对应测试
    # $testData = @{name="test"; email="test@example.com"} | ConvertTo-Json
    # $response = Invoke-RestMethod -Uri "http://localhost:$currentPort/api/users" -Method Post -Body $testData -ContentType "application/json"
    # ...

    # 关闭服务
    Stop-Process -Id $prismPID -Force
    Write-Host "=== 完成处理文件:$($file.Name) ==="
}

关键注意事项

  • 端口冲突:为每个Prism实例分配独立端口,避免同时启动时端口占用问题。
  • 启动等待:必须添加等待逻辑,确保Prism完全启动后再执行测试,否则会出现请求失败。
  • 日志排查:通过RedirectStandardOutput将Prism日志写入文件,方便排查启动或API模拟中的问题。
  • 异常处理:如果服务启动超时或测试失败,及时终止Prism进程,避免残留后台进程。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 15:47:38