用户实际操作时,并非是连续点击,而是存在很多停顿的情况,例如:用户需要时间阅读文字内容、填表、或者查找正确的链接等。为了模拟用户实际情况,在性能测试中我们需要考虑思考时间。若不认真考虑思考时间很可能会导致测试结果的失真。例如,估计的可支撑用户数偏小。在性能测试中,访问请求之间的停顿时间被称之为思考时间,那么如何模拟这种停顿呢?我们可以借助 JMeter 的定时器实现。
JMeter 中的定时器一般被我们用来设置延迟与同步。定时器的执行优先级高于 Sampler(取样器),在同一作用域(例如控制器下)下有多个定时器存在时,每一个定时器都会执行,如果想让某一定时器仅对某一 Sampler 有效,则可以把定时器加在此 Sampler 节点下。
首先我们来看一下 JMeter 的定时器,路径:线程组(用户)->添加->定时器(Timer);我们可以清楚地看到 JMeter5 中共有 9 个定时器,如下图所示:
如果上图您看得不是很清楚的话,宏哥总结了一个思维导图,关于 JMeter5 的逻辑控制器类型,如下图所示:
通过以上的了解,我们对定时器有了一个大致的了解和认识。下面宏哥就给小伙伴或则童鞋们分享讲解一些通常在工作中会用到的定时器。
这一小节,宏哥就由上而下地详细地讲解一下常用的定时器。
高斯定时器,高斯定时器,生成一个呈高斯分布的时间间隔。
如需要每个线程的延迟时间是符合标准正态分布的随机时间停顿,那么使用这个定时器,总延迟 = 高斯分布值(平均 0.0 和标准偏差 1.0)* 指定的偏差值 + 固定延迟偏移 (计算参考:Math.abs((this.random.nextGaussian() * 偏差值) + 固定延迟偏移))。
另一种解释方法,在高斯随机定时器中, 随机时间在固定延迟偏移附近,概率符合高斯曲线分布。
总延迟时间 = 高斯分布值(平均 0.0 和标准差 1.0)* 指定的偏差值 + 固定延迟偏移
1、我们先来看看这个Gaussian Random Timer长得是啥样子,路径: 线程组 > 添加 > ** 定时器 > 高斯随机定时器 ** ,如下图所示:
2、关键参数说明如下:
Name: 名称,可以随意设置,甚至为空;
Comments: 注释,可随意设置,可以为空;
Deviation: 忽略子控制器,即子控制器失效,由交替控制器接管。
Constant Delay Offset:
1、新建测试计划,线程组下添加 2 个取样器 访问博客园首页、访问北京宏哥的园子,如下图所示:
2、然后再添加高斯随机定时器,设置高斯随机定时器的偏差为 1000ms,固定延迟偏移为 3000,如下图所示:
3、配置好以后,点击 “保存”,运行 JMeter,查看表格结果(取样器访问博客园首页和访问度娘间隔 3s),如下图所示:
JSR 定时器,在 jemter 最新的版本中,新增了这个定时器,可以这么理解,这个定时器相当于 BeanShell 定时器的 “父集”,它可以使用 java、JavaScript、beanshell 等多种语言去实现你希望完成的事情。
1、我们先来看看这个JSR223 Timer长得是啥样子,路径: 线程组 > 添加 > ** 定时器 > JSR233 定时器 ** ,如下图所示:
2、关键参数说明如下:
Name: 名称,可以随意设置,甚至为空;
Comments: 注释,可随意设置,可以为空;
Thread Delay: 忽略子控制器,即子控制器失效,由交替控制器接管。
1、新建测试计划,线程组下添加 2 个取样器 访问博客园首页、访问度娘,如下图所示:
2、然后再添加 JSR223 定时器,编写脚本设置延迟时间 5s,如下图所示:
3、配置好以后,点击 “保存”,运行 JMeter,查看表格结果(取样器访问博客园首页和访问度娘间隔 5s),如下图所示:
泊松随机定时器,这个定时器在每个线程请求之前按随机的时间停顿,总的延迟就是泊松分布值和偏移值之和。这个定时器在每个线程请求之前按随机的时间停顿,总的延迟就是泊松分布值和偏移值之和。
泊松分布:概率学中离散机率分布
1、我们先来看看这个Poisson Random Timer长得是啥样子,路径: 线程组 > 添加 > ** 定时器 > 泊松随机定时器 ** ,如下图所示:
2、关键参数说明如下:
Name: 名称,可以随意设置,甚至为空;
Comments: 注释,可随意设置,可以为空;
Lambda(in milliseconds): 兰布达值;
Constant Delay Offset(in milliseconds): 暂停的毫秒数减去随机延迟的毫秒数。
1、新建测试计划,线程组下添加 2 个取样器 访问博客园首页、访问度娘,如下图所示:
2、然后再添加泊松定时器,设置暂停时间会分布在 100 到 400 毫秒之间,如下图所示:
3、配置好以后,点击 “保存”,运行 JMeter,查看表格结果(取样器访问博客园首页和访问度娘间隔在 100 到 400 毫秒之间),如下图所示:
同步计时器,用来模拟多用户并发,或者说更严格的并发场景,比如秒杀活动,就要用这个玩意了。
作用:也是用来设置集合点,阻塞线程,同步虚拟用户,直到指定的线程数量到达后,恰好在同一时刻执行任务,再一起释放,可以瞬间产生很大的压力。
注意:敲黑板,敲脑袋!!!
一般情况,并发用户数多少,同步定时器就写多少。(多少并发就要等多少个人到齐一起释放)
1、我们先来看看这个Synchronizing Timer长得是啥样子,路径: 线程组 > 添加 > ** 定时器 > 同步定时器 ** ,如下图所示:
2、关键参数说明如下:
Name: 名称,可以随意设置,甚至为空;
Comments: 注释,可随意设置,可以为空;
Number of Simulated Users to Group by: 集合点个数(执行的线程数),如果设置为 0,等于设置为线程租中的线程数量。
Timeout in milliseconds: 指定线程数多少秒没集合到算超时(以毫秒为单位)。如果设置为 0,该定时器将会等待线程数达到了"Number of Simultaneous Users toGroup"中设置的值才释放,不够的话就死等。如果大于 0,那么如果超过 Timeout inmilliseconds 中设置的最大等待时间后还没达到"Number of Simultaneous Users toGroup"中设置的值,Timer 将不再等待,释放已到达的线程。默认为 0
注意:敲黑板,敲脑袋!!!
(1)上面两个参数如果都设置了值,则在实际中是哪个条件先达到,定时器先执行哪个,如第一个参数释放线程数量先达到,则不会管超时时间的值,timer 会释放;如果第二个参数超时时间先达到,则不会再等线程数量,按照目前超时的时间点集合的线程数,timer 释放。
(2)同步定时器(Synchronizing Timer)的超时时间设置要求: 超时时间 > 请求集合数量 * 1000 / (线程数 / 线程加载时间)
线程组用户数 100,添加同步定时器
线程数 (100) | 定时器等待线程数 (视情况而定) | 超时设置 (默认为 0,单位毫秒) | 设置效果 (脚本运行达到的效果) |
---|---|---|---|
100 | 100 | 0 | 用户等待达到 100 个用户,同时并发请求 |
100 | 90 | 100 | 1、刚好超时 100ms,且等到 90 个用户并发请求;2、等到 90 个用户,未超时,继续等到结束,再并发,这时用户数将大于 90;3、等到小于 90 和用户,又超过了设置 100ms,那么以等到的用户并发请求,可能小于 90; |
100 | 110 | 0 | 用户无法达到 110 个用户,线程将一直等待,不会停止; |
100 | 100 | 100 | 1、刚好超时 100ms,等到 100 个用户并发请求;2、超时 100ms 后,定时器以等到的最大用户数并发请求;3、如果超时 100ms,用户数没有到达 100,将以等到的用户数并发请求,这是用户数可能小于 100; |
100 | 0 | 0 | 定时器设置的用户数等效于线程的用户数,超时默认设置为 0,用户同时并发请求 |
a. 若某个请求需要并发测试,则可在该请求下添加同步定时器。
1、新建测试计划,线程组(设置线程组 10 个,加载时间 1s)下添加 2 个取样器 访问博客园首页(已禁用)、访问度娘,如下图所示:
2、然后再添加同步定时器,设置模拟用户组数量:10,超时时间:5000,如下图所示:
3、配置好以后,点击 “保存”,运行 JMeter,查看表格结果(几乎是在同一时间,10 个用户同时并发访问度娘),如下图所示:
b. 若某几个请求需要同时进行并发,则可在请求的同一级添加同步定时器。
1、新建测试计划,线程组下添加 2 个取样器 访问博客园首页、访问度娘,如下图所示:
2、然后再添加同步定时器,设置模拟用户组数量:10,超时时间:5000,如下图所示:
3、配置好以后,点击 “保存”,运行 JMeter,查看表格结果(取样器访问博客园首页和访问度娘间隔 3s),如下图所示:
c. 若某几个线程需要同步并发,则可在测试计划下(线程组同一级)添加同步定时器(适用于多业务混合并发测试)。
1、新建测试计划,添加同步定时器,设置模拟用户组数量:10,超时时间:5000,如下图所示:
2、然后再添加两个线程组,一个线程组下添加 2 个取样器 访问博客园首页、访问度娘,另一个线程组下添加 1 个取样器 访问度娘 1,如下图所示:
3、配置好以后,点击 “保存”,运行 JMeter,查看表格结果,如下图所示:
Bean Shell 定时器,顾名思义是:互相交替,其节点下的取样器交替执行。根据被控制器触发执行次数,去依次执行控制器下的子节点<逻辑控制器、采样器>。被触发执行可以由线程组的线程数、循环次数、逻辑控制器触发。
1、我们先来看看这个 ** Bean Shell 定时器长得是啥样子,路径: *线程组 > 添加 > *定时器 > Bean Shell 定时器 ** ,如下图所示:
2、关键参数说明如下:
Name: 名称,可以随意设置,甚至为空;
Comments: 注释,可随意设置,可以为空;
Reset Interpreter: 每次迭代是否重置解析器,默认为 false;在长时间运行的脚本中建议设置为 true。
Parameters: BeanShell 脚本的入参。入参可以是单个变量;也可以是数组,若是字符串数组,两个元素之间用空格隔开;也可以是常量。
File Name: BeanShell 脚本可以从脚本文件中读取。
Script: 在 Script 区直接写 BeanShell 脚本。
1、新建测试计划,线程组下添加 2 个取样器 访问博客园首页、访问度娘,如下图所示:
2、然后再添加 Bean Shell 定时器,脚本代码设置延迟时间 5s,如下图所示:
3、配置好以后,点击 “保存”,运行 JMeter,查看结果树(取样器访问博客园首页和访问度娘间隔 5s),如下图所示:
好了,今天到这里 JMeter 的所有定时器就已经介绍完了,感谢你耐心的阅读和学习。