在某些情况下,能够在不停止测试的情况下更改性能测试产生的负载是有用的或必要的。这可以通过使用Apache JMeter™的恒定吞吐量计时器和Beanshell服务器来完成。在这篇文章中,我们将介绍如何实现这一点,同时提供示例。
在性能测试场景中,负载主要由访问正在测试的应用程序的虚拟用户数量来定义。在JMeter中,虚拟用户实现为线程。其他可以定义测试负载的参数或变量是测试持续时间,思考时间和上升周期。在这篇文章中,我们将要改变的load参数是吞吐量,通过Constant Throughput Timer。
通过使用Constant Throughput Timer元素,JMeter允许通过在请求之间引入暂停来定义每分钟发送的请求数,同时线程数保持不变。有关更多信息,请参阅恒定吞吐量定时器组件参考。
1.此配置的第一步是将提到的元素添加到JMeter。恒定吞吐量计时器将通过设置“目标吞吐量”值来控制在测试中每分钟执行的请求数。由于我们将通过命令行更新此值,因此必须将其定义为参数(示例中为“hits”)。通过编写$ {__ P(hits,100)},默认值将设置为100。
此配置显示在以下屏幕截图中:
将此元素置于线程组级别是有意义的,因此将控制其中的所有线程,从而在该组上生成所需的目标负载。此外,吞吐量将基于每个线程进行调整,因为值“基于计算吞吐量”反映。
重要的是要注意调整负载以匹配每分钟请求值,因此请给测试一些时间来注意吞吐量的变化。
2.下一步是使用JMeter Beanshell作为服务器,以便您可以发出Beanshell命令。出于此示例的目的,我们将通过调用beanshell函数来更新先前定义的“hits”参数。Beanshell是一个内置于JMeter的Java源代码解释器,允许您执行Java代码并使用脚本功能扩展它。可以在BeanShell的主页上找到更多信息。
执行此操作的必要步骤将在以下行中描述:
3.在JMeter启动时启用Beanshell服务器:
- 首先配置服务器将侦听的TCP端口。我们在这个例子中使用了9000。
- 其次,指定将启动它的.bsh服务器文件。此文件已随JMeter一起提供,无需编辑。
为此,应在jmeter.properties上取消注释以下行:
beanshell.server.port=9000 beanshell.server.file=../extras/startup.bsh
4. JMeter启动后,我们可以通过检查其TCP端口状态来验证Beanshell服务器是否已启动并运行。在Windows上,这可以通过以下命令在DOS命令窗口上完成:
netstat -an | find “9000”
5.创建.bsh文件以修改/更新“hits”参数。我们在JMeter主目录下创建了文件夹bsh 以保持目录的顺序,并添加了一个名为update_parameter.bsh的.bsh文件,其中包含以下内容:
setprop (“hits” , args [ 0 ]);
基本上,此文件调用setprop函数以使用提供的第一个参数(args [0])中的值更新“hits”。
6.我们现在能够在测试运行时调用创建的.bsh来更新“命中”。通过以下命令(当前路径是JMeter主目录),我们将参数更新为每分钟“10”个请求:
java -jar .libshclient.jar localhost 9000 .shupdate_parameter.bsh 10
该命令首先通过bshclient.jar调用beanshell客户端,该客户端将连接到9000 TCP端口上的localhost,这是我们的beanshell服务器正在侦听的地址。接下来,该命令调用update_parameter.bsh,其中“10”作为其第一个参数。这将调用setprop函数设置“hits”为10,从而减慢我们的测试负载。
接下来,显示示例调用DOS窗口:
7.在测试运行时,可以随时调用此命令,因此可以更新每分钟的JMeter请求。当通过命令行或GUI运行JMeter时,可以执行此操作。
将这些全部放在一起,我们将展示JMeter GUI上的负载变化情况。我们创建了一个简单的Test,它对openCart Test页面执行请求。在其线程组内,我们还放置了恒定吞吐量计时器,以控制生成的吞吐量。
默认情况下,“hits”参数设置为每分钟100个请求,测试将由5个线程运行。
测试计划结构如下所示:
此外,添加了一个Graph Results元素(右键单击Test plan - > Add - > Listener - > Graph Results)以图形方式显示测试结果。
让测试运行几分钟后,为了在图表上生成足够的样本,我们将“命中”更新为1:
生成的图中的绿色虚线表示在每分钟请求保持稳定的一段时间后吞吐量减少。