如何使用 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.ProcessAPI基于)。

除了在语法上更简单和更简洁之外,这还有两个主要优点:

假设 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