如何通过PowerShell按顺序逐个执行独立的JMeter测试计划
问题原因
现有脚本中两个测试同时启动的核心原因是调用Start-Process时未添加-PassThru参数,默认情况下该命令不会返回启动的进程对象,导致$proc.WaitForExit()实际是对空值调用,等待逻辑完全失效,脚本会直接执行后续的测试启动代码。
修正方案
最小改动修复现有示例
只需要给每个Start-Process添加-PassThru参数即可正常获取进程对象,执行等待逻辑,或者直接用更简洁的-Wait参数省略手动调用等待方法的步骤,同时可以添加-NoNewWindow参数避免每次弹出新窗口,所有日志在当前PowerShell窗口展示:
Write-Output "Running Test 1" Start-Process -FilePath "C:\JmeterLoadTests\apache-jmeter-5.2.1\bin\jmeter" -ArgumentList "-n -t C:\JmeterLoadTests\test\enpointsType1\test-1-1.jmx -Jduration=10" -Wait -NoNewWindow Write-Output "Proc 1 Done" Write-Output "Running Proc 2" Start-Process -FilePath "C:\JmeterLoadTests\apache-jmeter-5.2.1\bin\jmeter" -ArgumentList "-n -t C:\JmeterLoadTests\test\enpointsType1\test-1-1.jmx -Jduration=10" -Wait -NoNewWindow Write-Output "Proc 2 Done"
自动遍历目录的完整版脚本
符合你后续新增测试无需修改脚本的需求,支持自定义参数配置:
# 配置项 $jmeterPath = "C:\JmeterLoadTests\apache-jmeter-5.2.1\bin\jmeter.exe" $testPlanDir = "C:\JmeterLoadTests\test\" # 获取目录下所有jmx测试计划 $testPlans = Get-ChildItem -Path $testPlanDir -Filter "*.jmx" -Recurse if ($testPlans.Count -eq 0) { Write-Output "未找到任何测试计划文件,请检查目录配置" exit 1 } Write-Output "共找到$($testPlans.Count)个测试计划,即将串行执行" # 遍历逐个执行 foreach ($plan in $testPlans) { Write-Output "`n开始执行测试计划:$($plan.Name)" # 读取同目录下同名称的参数文件,不存在则用空参数 $argFile = Join-Path -Path $plan.DirectoryName -ChildPath ($plan.BaseName + ".txt") $customArgs = "" if (Test-Path -Path $argFile) { $customArgs = Get-Content -Path $argFile -Raw } $arguments = "-n -t `"$($plan.FullName)`" $customArgs" # 执行测试并等待结束 Start-Process -FilePath $jmeterPath -ArgumentList $arguments -Wait -NoNewWindow Write-Output "测试计划$($plan.Name)执行完成" } Write-Output "`n所有测试计划全部执行完毕"
使用说明:
- 需要传参的测试,在同目录下新建和测试计划同名的txt文件,写入需要的JMeter参数即可,比如
-Jduration=10 -Jthreads=50 - 不需要传参的测试不用做额外配置,直接放jmx文件即可
- 新增测试时只要把对应文件放到
$testPlanDir指定的目录下,下次执行脚本就会自动纳入执行队列
内容的提问来源于stack exchange,提问作者OrigamiEye
相关产品推荐
相关产品推荐

