如何在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
相关产品推荐
相关产品推荐

