1.简介

  用户实际操作时,并非是连续点击,而是存在很多停顿的情况,例如:用户需要时间阅读文字内容、填表、或者查找正确的链接等。为了模拟用户实际情况,在性能测试中我们需要考虑思考时间。若不认真考虑思考时间很可能会导致测试结果的失真。例如,估计的可支撑用户数偏小。在性能测试中,访问请求之间的停顿时间被称之为思考时间,那么如何模拟这种停顿呢?我们可以借助JMeter的定时器实现。

  JMeter中的定时器一般被我们用来设置延迟与同步。定时器的执行优先级高于Sampler(取样器),在同一作用域(例如控制器下)下有多个定时器存在时,每一个定时器都会执行,如果想让某一定时器仅对某一Sampler有效,则可以把定时器加在此Sampler节点下。

2.预览定时器

首先我们来看一下JMeter的定时器,路径:线程组(用户)->添加->定时器(Timer);我们可以清楚地看到JMeter5中共有9个定时器,如下图所示:

如果上图您看得不是很清楚的话,宏哥总结了一个思维导图,关于JMeter5的逻辑控制器类型,如下图所示:

通过以上的了解,我们对定时器有了一个大致的了解和认识。下面宏哥就给小伙伴或则童鞋们分享讲解一些通常在工作中会用到的定时器。

3.常用定时器详解

这一小节,宏哥就由上而下地详细地讲解一下常用的定时器。

3.1Gaussian Random Timer

高斯定时器,高斯定时器,生成一个呈高斯分布的时间间隔。
如需要每个线程的延迟时间是符合标准正态分布的随机时间停顿,那么使用这个定时器,总延迟 = 高斯分布值(平均0.0和标准偏差1.0)* 指定的偏差值+固定延迟偏移(计算参考:Math.abs((this.random.nextGaussian() * 偏差值) + 固定延迟偏移))。
另一种解释方法,在高斯随机定时器中, 随机时间在固定延迟偏移附近,概率符合高斯曲线分布。

总延迟时间 = 高斯分布值(平均0.0和标准差1.0)* 指定的偏差值 + 固定延迟偏移

1、我们先来看看这个Gaussian Random Timer长得是啥样子,路径:线程组 > 添加 > 定时器 > 高斯随机定时器,如下图所示:

2、关键参数说明如下:

Name:名称,可以随意设置,甚至为空;

Comments:注释,可随意设置,可以为空;

Deviation:忽略子控制器,即子控制器失效,由交替控制器接管。

Constant Delay Offset:

3.1.1实例

1、新建测试计划,线程组下添加2个取样器 访问博客园首页、访问北京宏哥的园子,如下图所示:

2、然后再添加高斯随机定时器,设置高斯随机定时器的偏差为1000ms,固定延迟偏移为3000,如下图所示:

3、配置好以后,点击“保存”,运行JMeter,查看表格结果(取样器访问博客园首页和访问度娘间隔3s),如下图所示:

3.2JSR223 Timer

JSR定时器,在jemter最新的版本中,新增了这个定时器,可以这么理解,这个定时器相当于BeanShell定时器的“父集”,它可以使用java、JavaScript、beanshell等多种语言去实现你希望完成的事情。

1、我们先来看看这个JSR223 Timer长得是啥样子,路径:线程组 > 添加 > 定时器 > JSR233定时器,如下图所示:

2、关键参数说明如下:

Name:名称,可以随意设置,甚至为空;

Comments:注释,可随意设置,可以为空;

Thread Delay:忽略子控制器,即子控制器失效,由交替控制器接管。

3.2.1实例

1、新建测试计划,线程组下添加2个取样器 访问博客园首页、访问度娘,如下图所示:

2、然后再添加JSR223 定时器,编写脚本设置延迟时间5s,如下图所示:

3、配置好以后,点击“保存”,运行JMeter,查看表格结果(取样器访问博客园首页和访问度娘间隔5s),如下图所示:

3.3Poisson Random Timer

泊松随机定时器,这个定时器在每个线程请求之前按随机的时间停顿,总的延迟就是泊松分布值和偏移值之和。这个定时器在每个线程请求之前按随机的时间停顿,总的延迟就是泊松分布值和偏移值之和。

泊松分布:概率学中离散机率分布

1、我们先来看看这个Poisson Random Timer长得是啥样子,路径:线程组 > 添加 > 定时器 > 泊松随机定时器,如下图所示:

2、关键参数说明如下:

Name:名称,可以随意设置,甚至为空;

Comments:注释,可随意设置,可以为空;

Lambda(in milliseconds):兰布达值;

Constant Delay Offset(in milliseconds):暂停的毫秒数减去随机延迟的毫秒数。

3.3.1实例

1、新建测试计划,线程组下添加2个取样器 访问博客园首页、访问度娘,如下图所示:

2、然后再添加泊松定时器,设置暂停时间会分布在100到400毫秒之间,如下图所示:

3、配置好以后,点击“保存”,运行JMeter,查看表格结果(取样器访问博客园首页和访问度娘间隔在100到400毫秒之间),如下图所示:

3.4Synchronizing Timer

同步计时器,用来模拟多用户并发,或者说更严格的并发场景,比如秒杀活动,就要用这个玩意了。

作用:也是用来设置集合点,阻塞线程,同步虚拟用户,直到指定的线程数量到达后,恰好在同一时刻执行任务,再一起释放,可以瞬间产生很大的压力。

注意:敲黑板,敲脑袋!!!

一般情况,并发用户数多少,同步定时器就写多少。(多少并发就要等多少个人到齐一起释放)

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,用户同时并发请求
3.4.1实例

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,查看表格结果,如下图所示:

3.5BeanShell Timer(重要-常用)

Bean Shell定时器,顾名思义是:互相交替,其节点下的取样器交替执行。根据被控制器触发执行次数,去依次执行控制器下的子节点<逻辑控制器、采样器>。被触发执行可以由线程组的线程数、循环次数、逻辑控制器触发。

1、我们先来看看这个 Bean Shell定时器长得是啥样子,路径:线程组 > 添加 > 定时器 > Bean Shell定时器,如下图所示:

2、关键参数说明如下:

Name:名称,可以随意设置,甚至为空;

Comments:注释,可随意设置,可以为空;

Reset Interpreter:每次迭代是否重置解析器,默认为false;在长时间运行的脚本中建议设置为true。

Parameters:BeanShell脚本的入参。入参可以是单个变量;也可以是数组,若是字符串数组,两个元素之间用空格隔开;也可以是常量。

File Name:BeanShell脚本可以从脚本文件中读取。

Script:在Script区直接写BeanShell脚本。

3.5.1实例

1、新建测试计划,线程组下添加2个取样器 访问博客园首页、访问度娘,如下图所示:

2、然后再添加Bean Shell定时器,脚本代码设置延迟时间5s,如下图所示:

3、配置好以后,点击“保存”,运行JMeter,查看结果树(取样器访问博客园首页和访问度娘间隔5s),如下图所示:

4.小结

   好了,今天到这里JMeter的所有定时器就已经介绍完了,感谢你耐心的阅读和学习。

您的肯定就是我进步的动力。如果你感觉还不错,就请鼓励一下吧!记得随手点波  推荐  不要忘记哦!!!

别忘了点 推荐 留下您来过的痕迹

Jmeter(十四) - 从入门到精通 - JMeter定时器 - 下篇(详解教程)的更多相关文章

  1. Jmeter(十六) - 从入门到精通 - JMeter前置处理器(详解教程)

    1.简介 前置处理器是在发出“取样器请求”之前执行一些操作.如果将前置处理器附加到取样器元件,则它将在该取样器元件运行之前执行.前置处理器最常用于在取样器请求运行前修改其设置,或更新未从响应文本中提取 ...

  2. Jmeter(十八) - 从入门到精通 - JMeter后置处理器 -下篇(详解教程)

    1.简介 后置处理器是在发出“取样器请求”之后执行一些操作.取样器用来模拟用户请求,有时候服务器的响应数据在后续请求中需要用到,我们的势必要对这些响应数据进行处理,后置处理器就是来完成这项工作的.例如 ...

  3. Jmeter(十二) - 从入门到精通 - JMeter逻辑控制器 - 终篇(详解教程)

    1.简介 Jmeter官网对逻辑控制器的解释是:“Logic Controllers determine the order in which Samplers are processed.”. 意思 ...

  4. Jmeter(十九) - 从入门到精通 - JMeter监听器 -上篇(详解教程)

    1.简介 监听器用来监听及显示JMeter取样器测试结果,能够以树.表及图形形式显示测试结果,也可以以文件方式保存测试结果,JMeter测试结果文件格式多样,比如XML格式.CSV格式.默认情况下,测 ...

  5. Jmeter(一) - 从入门到精通 - 环境搭建(详解教程)

    1.JMeter 介绍 Apache JMeter是100%纯JAVA桌面应用程序,被设计为用于测试客户端/服务端结构的软件(例如web应用程序).它可以用来测试静态和动态资源的性能,例如:静态文件, ...

  6. Jmeter(二十四) - 从入门到精通 - JMeter函数 - 中篇(详解教程)

    1.简介 在性能测试中为了真实模拟用户请求,往往我们需要让提交的表单内容每次都发生变化,这个过程叫做参数化.JMeter配置元件与前置处理器都能帮助我们进行参数化,但是都有局限性,为了帮助我们能够更好 ...

  7. Jmeter(十五) - 从入门到精通 - JMeter导入自定义的Jar包(详解教程)

    1.简介 原计划这一篇是介绍前置处理器的基础知识的,结果由于许多小伙伴或者童鞋们在微信和博客园的短消息中留言问如何引入自己定义的Jar包呢???我一一回复告诉他们和引入插件的Jar包一样的道理,一通百 ...

  8. 《手把手教你》系列技巧篇(五十)-java+ selenium自动化测试-字符串操作-上篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

  9. Jmeter(四十四) - 从入门到精通高级篇 - Jmeter远程启动(本地运行+远程运行)(详解教程)

    1.简介 这篇文章其实很简单,就是为下一篇文章做一个铺垫,所以宏哥给小伙伴或童鞋们提前热身一下. 2.什么是远程运行? 远程执行,就是脚本放在本地,执行却在另一台电脑上执行,当然,可以是远程多台电脑一 ...

随机推荐

  1. Java实现 LeetCode 141 环形链表

    141. 环形链表 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. ...

  2. java实现输入信用卡号码

    /* 当你输入信用卡号码的时候,有没有担心输错了而造成损失呢?其实可以不必这么担心, 因为并不是一个随便的信用卡号码都是合法的,它必须通过 Luhn 算法来验证通过. 该校验的过程: 1.从卡号最后一 ...

  3. java实现第七届蓝桥杯圆圈舞

    圆圈舞 题目描述 春天温暖的阳光照耀着大地,正是草原上的小动物们最快乐的时候.小动物们在草原上开了一个舞会,欢度这美好的时光. 舞会上最重要的一个环节就是跳圆舞曲,n只小动物手拉手围成一大圈,随着音乐 ...

  4. 震惊!当Python遇到Excel后,将开启你的认知虫洞

    本文主要内容:   1. Excel,你为什么如此强大 2. 软件开发也需要团队作战 3. Excel的集成方案演化 4. macOS特有的集成方案:applescript 5. Python与Exc ...

  5. ReentrantReadWriteLock源码分析及理解

    本文结构 读写锁简介:介绍读写锁.读写锁的特性以及类定义信息 公平策略及Sync同步器:介绍读写锁提供的公平策略以及同步器源码分析 读锁:介绍读锁的一些常用操作和读锁的加锁.解锁的源码分析 写锁:介绍 ...

  6. Python 3.9 beta2 版本发布了,看看这 7 个新的 PEP 都是什么?

    原作:Jake Edge 译者:豌豆花下猫@Python猫 英文:https://lwn.net/Articles/819853/ 随着 Python 3.9.0b1 的发布,即开发周期中计划的四个 ...

  7. MYSQL 实现ROWNO功能

    select tt.rowno  from( select (@rownum:=@rownum+1) as rowno, t.id    from news t ,(select (@rownum : ...

  8. @bzoj - 2595@ 游览计划

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 从未来过绍兴的小D有幸参加了Winter Camp 2008,他 ...

  9. SUBSTRING / CHARINDEX_函数随手练_2

    SUBSTRING / CHARINDEX_函数随手练_2环境:MSSQL 2014(AdventureWorks2008R2附加到2014中的表 Location) /* Learning SQL ...

  10. Flume-0.9.4和Hbase-0.96整合

    这几天由于项目的需要,需要将Flume收集到的日志插入到Hbase中,有人说,这不很简单么?Flume里面自带了Hbase sink,可以直接调用啊,还用说么?是的,我在本博客的<Flume-1 ...