如何使用 powershell 一次执行一个单独的 Jmeter 测试计划?
How to execute separate Jmeter test plans one at a time with powershell?
我们收到了 20 个 jmeter 测试计划,每个测试一个端点,我们需要 运行。在测试中我们需要传递参数,而在其他测试中我们不需要。
我的想法是创建一个 powershell 脚本,循环遍历目录并 运行 进行测试,等到完成,然后 运行 进行下一个测试。当我们开发一个新的端点时,我们只需创建一个新的测试计划并将其保存在适当的文件夹中,Powershell 脚本将在我们下次循环测试时包含它。
我需要在开始下一个计划之前完成测试,所以我正在看类似的东西:
Write-Output "Running Test 1"
$proc = 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"
$proc.WaitForExit()
Write-Output "Proc 1 Done"
Write-Output "Running Proc 2"
$proc2 = 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"
$proc2.WaitForExit()
这只会同时启动两个测试。
那么我的问题是如何让Powershell等待之前的测试完成。
您可能遇到 Out-Default cmdlet 执行问题,最简单的方法是用分号分隔命令,例如:
cmd1;cmd2;cmd3;etc;
这样 Powershell 将等待上一个命令完成后再开始下一个命令
演示:
考虑切换到 Maven JMeter Plugin which by default executes all tests it finds under src/test/jmeter
folder relative to the pom.xml file
可能是个更好的主意
您的立即问题是您的Start-Process
call is missing the -PassThru
switch, which is required for the call to return a System.Diagnostics.Process
实例代表新启动的进程。
# ...
# Note the use of -PassThru
$proc = Start-Process -PassThru -FilePath "C:\JmeterLoadTests\apache-jmeter-5.2.1\bin\jmeter" -ArgumentList "-n -t C:\JmeterLoadTests\test\enpointsType1\test-1-1.jmx -Jduration=10"
$proc.WaitForExit()
# ...
或者,如果您不需要检查进程 退出代码(上面命令中的 $proc.ExitCode
会给您),您可以简单地使用 -Wait
开关,这使得 Start-Process
本身等待进程终止:
# ...
# Note the use of -Wait
Start-Process -Wait -FilePath "C:\JmeterLoadTests\apache-jmeter-5.2.1\bin\jmeter" -ArgumentList "-n -t C:\JmeterLoadTests\test\enpointsType1\test-1-1.jmx -Jduration=10"
# ...
退一步:
要同步执行控制台应用程序或批处理文件在当前控制台window,调用它们直接,不使用Start-Process
(或者System.Diagnostics.Process
API基于)。
除了在语法上更简单和更简洁之外,这还有两个主要优点:
你可以直接捕获他们的输出。
它允许您在之后通过 automatic $LASTEXITCODE
variable 检查进程退出代码。
假设 jmeter
是一个控制台应用程序(the docs 建议它在使用参数调用时作为一个控制台应用程序运行):
# ...
# Direct invocation in the current window.
# Stdout and stderr output will print to the console by default,
# but can be captured or redirected.
# Note: &, the call operator, isn't strictly needed here,
# but would be if your executable path were quoted
# or contained variable references.
& C:\JmeterLoadTests\apache-jmeter-5.2.1\bin\jmeter -n -t C:\JmeterLoadTests\test\enpointsType1\test-1-1.jmx -Jduration=10
# Use $LASTEXITCODE to examine the process exit code.
# ...
有关详细信息,请参阅 this answer。
我们收到了 20 个 jmeter 测试计划,每个测试一个端点,我们需要 运行。在测试中我们需要传递参数,而在其他测试中我们不需要。
我的想法是创建一个 powershell 脚本,循环遍历目录并 运行 进行测试,等到完成,然后 运行 进行下一个测试。当我们开发一个新的端点时,我们只需创建一个新的测试计划并将其保存在适当的文件夹中,Powershell 脚本将在我们下次循环测试时包含它。
我需要在开始下一个计划之前完成测试,所以我正在看类似的东西:
Write-Output "Running Test 1"
$proc = 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"
$proc.WaitForExit()
Write-Output "Proc 1 Done"
Write-Output "Running Proc 2"
$proc2 = 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"
$proc2.WaitForExit()
这只会同时启动两个测试。 那么我的问题是如何让Powershell等待之前的测试完成。
您可能遇到 Out-Default cmdlet 执行问题,最简单的方法是用分号分隔命令,例如:
cmd1;cmd2;cmd3;etc;
这样 Powershell 将等待上一个命令完成后再开始下一个命令
演示:
考虑切换到 Maven JMeter Plugin which by default executes all tests it finds under src/test/jmeter
folder relative to the pom.xml file
您的立即问题是您的Start-Process
call is missing the -PassThru
switch, which is required for the call to return a System.Diagnostics.Process
实例代表新启动的进程。
# ...
# Note the use of -PassThru
$proc = Start-Process -PassThru -FilePath "C:\JmeterLoadTests\apache-jmeter-5.2.1\bin\jmeter" -ArgumentList "-n -t C:\JmeterLoadTests\test\enpointsType1\test-1-1.jmx -Jduration=10"
$proc.WaitForExit()
# ...
或者,如果您不需要检查进程 退出代码(上面命令中的 $proc.ExitCode
会给您),您可以简单地使用 -Wait
开关,这使得 Start-Process
本身等待进程终止:
# ...
# Note the use of -Wait
Start-Process -Wait -FilePath "C:\JmeterLoadTests\apache-jmeter-5.2.1\bin\jmeter" -ArgumentList "-n -t C:\JmeterLoadTests\test\enpointsType1\test-1-1.jmx -Jduration=10"
# ...
退一步:
要同步执行控制台应用程序或批处理文件在当前控制台window,调用它们直接,不使用Start-Process
(或者System.Diagnostics.Process
API基于)。
除了在语法上更简单和更简洁之外,这还有两个主要优点:
你可以直接捕获他们的输出。
它允许您在之后通过 automatic
$LASTEXITCODE
variable 检查进程退出代码。
假设 jmeter
是一个控制台应用程序(the docs 建议它在使用参数调用时作为一个控制台应用程序运行):
# ...
# Direct invocation in the current window.
# Stdout and stderr output will print to the console by default,
# but can be captured or redirected.
# Note: &, the call operator, isn't strictly needed here,
# but would be if your executable path were quoted
# or contained variable references.
& C:\JmeterLoadTests\apache-jmeter-5.2.1\bin\jmeter -n -t C:\JmeterLoadTests\test\enpointsType1\test-1-1.jmx -Jduration=10
# Use $LASTEXITCODE to examine the process exit code.
# ...
有关详细信息,请参阅 this answer。