浅谈定时器之常数吞吐量定时器
常数吞吐量定时器的主要目的是在JMeter测试中维持一个恒定的吞吐量(通常是每分钟的请求数或事务数),从而确保测试能够以预期的负载水平运行。这对于模拟特定的用户访问模式、进行稳定性测试、负载测试以及压力测试尤为重要。本文档将详细介绍常数吞吐量定时器的用途、配置方法及应用场景,帮助测试工程师有效地控制测试脚本的执行速率。
使用场景
● 负载测试:需要模拟特定数量的用户在同一时间段内访问系统,保持稳定的请求速率。
● 稳定性测试:长时间运行测试,验证系统在持续负载下的表现。
● 压力测试:逐步增加吞吐量至系统极限,评估系统的最大处理能力。
配置步骤
- 添加定时器:
○ 在JMeter测试计划中,选择你想要控制吞吐量的线程组。
○ 右键点击线程组 > 添加 > 定时器 > 常数吞吐量定时器。 - 设置吞吐量:
○ 目标吞吐量(Target Throughput):输入你希望达到的吞吐量值,单位为请求/分钟。例如,输入60表示希望每分钟发送60个请求。
○ 基于计算吞吐量(Calculate Throughput Based On):选择吞吐量计算的基准,通常选择“所有活跃线程”来基于所有活动线程计算吞吐量。
实例说明:
我们编写如下脚本
BeanShell 取样器:编写如下脚本
log.info("test");
情况1:基于计算吞吐量:只有次线程
线程组:线程数设置为10,循环次数设置为永远,勾选调度器,持续时间设置为30,启动延迟设置为0。
常数吞吐量定时器:目标吞吐量(Target Throughput)(每分钟的样本量)设置为600,基于计算吞吐量设置为只有次线程。
运行脚本,查看聚合报告:
可以看到选择这种模式时,总的吞吐量(TPS)=目标吞吐量 * 线程的数量
情况2:基于计算吞吐量:当前线程组中的所有活动线程
线程组:线程数设置为10,循环次数设置为永远,勾选调度器,持续时间设置为30,启动延迟设置为0。
常数吞吐量定时器:目标吞吐量(Target Throughput)(每分钟的样本量)设置为600,基于计算吞吐量设置为当前线程组中的所有活动线程。
运行脚本,查看聚合报告:
可以看到选择这种模式时,设置的目标吞吐量将分配在当前线程组的每一个活跃线程上,总的吞吐量(TPS)=目标吞吐量 / 1分钟,例如样例中设置的是600,则换算成TPS/秒=600/1分钟=600/60秒=10/秒,其中当前线程组中的所有活动线程(共享)(all active threads in current thread group (shared)):与当前线程组中的所有活动线程基本相同,唯一的区别是,每个活跃线程都会在所有活跃线程的上一次运行结束后等待合理的时间后再次运行
情况3:基于计算吞吐量:所有活动线程
首先那边写脚本如下
线程组1:线程数设置为10,循环次数设置为永远,勾选调度器,持续时间设置为30,启动延迟设置为0。
线程组2:线程数设置为10,循环次数设置为永远,勾选调度器,持续时间设置为30,启动延迟设置为0。
BeanShell 取样器1:编写如下代码
log.info("test1");
BeanShell 取样器2:编写如下代码
log.info("test1");
常数吞吐量定时器:目标吞吐量(Target Throughput)(每分钟的样本量)设置为600,基于计算吞吐量设置为所有活动线程。
运行脚本,查看聚合报告:
可以看到选择这种模式时,设置的目标吞吐量将分配在每个活跃线程上,每个活跃线程在上一次运行结束后等待合理的时间后再次运行。活跃线程指同一时刻同时运行的线程。所有活动线程(共享)(all avtive threads (shared)):与所有活动线程的选项基本相同。唯一区别是,每个活跃线程都会在所有活跃线程上一次运行结束后等待合理的时间后再次运行
注意事项
● 常数吞吐量定时器不能保证绝对精确的吞吐量,尤其是当并发用户数较少或者测试计划中包含其他定时器和逻辑控制器时。
● 使用此定时器可能会影响测试结果的重复性和可预测性,因为它是基于时间间隔调整请求发送速率的。
● 在高并发测试中,建议结合监听器(如“聚合报告”)监控实际吞吐量,以验证是否达到预期的测试目标。
总结
常数吞吐量定时器是JMeter中一个非常实用的组件,它使得测试工程师能够在性能测试中更好地控制和模拟用户流量,确保测试结果更加贴近实际情况。通过合理配置,可以有效地对系统进行负载和压力测试,为系统的优化和扩容提供数据支持。