1.简介

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

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

2.预览定时器

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

 

3.常用定时器详解

3.1固定定时器

固定定时器(Constant Timer),顾名思义是:请求之间的间隔时间为固定值。

作用:通过ThreadDelay设定每个线程请求之前的等待时间(单位为毫秒)。注意:固定定时是有作用域的,放到线程组下其作用域是所有请求都会延迟固定器设置的时间,如果放到请求内,作用域是单个请求延迟时间(常用)。

3、 1.1路径:线程组>添加>定时器>固定定时器,如下图所示:;

 

3、 1.2关键参数说明如下:;

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

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

线程延迟(毫秒):线程等待时间,单位毫秒。

用法(场景),更真实的模拟用户场景,需要设置等待时间,或是等待上一个请求的时间,才执行,给sampler之间的思考时间;

3、 1.3实例;

场景应用:性能测试中,根据用户操作预估时间,或者需要等待一段时间来加载数据。

PS:在实际模拟用户请求的过程中,会失去灵活性,不推荐大量使用

1、 新建测试计划,线程组下添加2个取样器访问csdn首页、访问百度;

2、 然后再添加固定定时器,设置延迟时间5000ms,如下图所示:;

 

3、 配置好以后,运行JMeter,查看表格结果(取样器访问csdn首页和访问百度间隔5s),如下图所示:;

 

3.2统一随机定时器

Uniform Random Timer,也是让线程暂停一个随机时间,只不过力求随机时间能够更均匀,都会出现。它产生的延迟时间是个随机值,而各随机值出现的概率均等。总的延迟时间等于一个随机延迟时间加上一个固定延迟时间,用户可以设置随机延迟时间和固定延迟时间。

作用:它产生的延迟时间是个随机值,而各随机值出现的概率均等。总的延迟时间等于一个随机延迟时间加上一个固定延迟时间,用户可以设置随机延迟时间和固定延迟时间。每个线程的延迟时间是符合标准正态分布的随机时间停顿,那么使用这个定时器,总延迟 = 高斯分布值(平均0.0和标准偏差1.0)* 指定的偏差值+固定延迟偏移(Math.abs((this.random.nextGaussian() * 偏差值) + 固定延迟偏移))

总延迟时间 = 指定范围内的随机时间(在范围内各随机值等概率)+ 固定延迟时间

3、 2.1路径:线程组>添加>定时器>统一随机定时器,如下图所示:;

 

3、 2.2关键参数说明如下:;

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

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

Random Delay Maximum:最大随机延迟时间;

Constant Delay Offset: 固定延迟时间。

3、 2.3实例;

1、 新建测试计划,线程组下添加2个取样器访问csdn首页、访问百度;

2、 然后再添加统一随机定时器,设置延迟时间3s,如下图所示:;

 

3、 配置好以后运行JMeter,查看表格结果(取样器访问csdn首页和访问百度间隔5s=2000ms+3000ms),如下图所示:;

 

3.3Precise Throughput Timer

准确的吞吐量定时器,顾名思义,这个就是控制吞吐量的。和常数吞吐量定时器类似,但是能更精准的控制请求。区别就是常数吞吐量定时器根据时间来做定时器(到了多少秒就发请求);准确的吞吐量定时器是根据吞吐量在做定时器(到了多少量就发请求)。也就是能做到控制请求的速度和个数。

1、 新建:线程组>添加>定时器>准确的吞吐量定时器,如下图所示:;

 

3、 3.2实例;

1、 新建测试计划,线程组(设置线程组,保证有足够的时间)下添加2个取样器访问csdn首页(已禁用)、访问百度,;

2、 然后再添加准确的吞吐量定时器,设置10个吞吐量,设置10s启动完10个请求,设置运行时间20s,如下图所示:;

 

 

3、 配置好以后,运行JMeter,查看表格结果(大约用了20秒启动了20个线程),如下图所示:;

 

4、 在定时器设置集合点为5,其它参数不变,如下图所示:;

 

5、 在线程组中设置线程数为5;

6、 配置好以后,运行JMeter,查看表格结果(可以看到,每10个线程为1组,同时启动),如下图所示:;

 

3.4Constant Throughput Timer

常数吞吐量定时器,这个定时器引入了变量暂停,通过计算使总吞吐量(以每分钟去杨树计)尽可能接近给定的数字。当然,如果服务器不能处理它,或者如果其他定时器或耗时的测试原件阻止它,那么吞吐量将更低。

虽然计时器被称为常数吞吐量定时器,但吞吐量值并不一定是常数。它可以根据变量或函数调用定义,并且可以在测试期间改变该值。通过以下多种方式都可以改变:

  • 使用计数器变量
  • 使用一个 __jexl3, __groovy 函数来提供一个变化的值
  • 使用远程BeeShell服务器更改Jmeter属性

请注意,在测试期间,不应该频繁地更改吞吐量值——新值生效需要一段时间。

常数吞吐量定时器作用:控制吞吐量(线上压测时候,避免一下就上百上千的吞吐量影响线上性能,加上这个之后较安全,可以一点一点往上加); 按指定的吞吐量执行,以每分钟为单位。计算吞吐量依据是最后一次线程的执行时延。

作用域:此定时器放在请求的下级,只对它的上级请求起作用

3、 4.1新建:线程组>添加>定时器>常数吞吐量定时器,如下图所示:;

 

3、 4.2关键参数说明如下:;

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

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

目标吞吐量:注意这里是每分钟发送的请求数,可以选择作用的线程:当前线程、当前线程组、所有线程组等,具体含义如下:

3、 4.3实例;

1、 新建测试计划,线程组下添加1个取样器访问百度,如下图所示:;

2、 然后再添加常数吞吐量定时器,设置目标吞吐量为300,如下图所示:;

3、 配置好以后,运行JMeter,查看结果(常数吞吐量定时器设置300/分钟,也就是5/秒,故tps最大5,这里的tps大约都是5,说明已经超过5,可以往上增加了),如下图所示:;