使用jmeter时,定时器的主要目的是模拟用户的思考时间,定时器会在每个取样器运行之前执行,如果有多个定时器,则在采样器执行之前将运行所有定时器,作用域原则:
1、定时器是在每个sampler(采样器)之前执行的,而不是之后(无论定时器位置在sampler之前还是下面);
2、当执行一个sampler之前时,所有当前作用域内的定时器都会被执行;
3、如果希望定时器仅应用于其中一个sampler,则把定时器作为子节点加入;
笔者在做这篇笔记时,jmeter版本是5.5,主要包括以下定时器:
- 固定定时器(Constant Timer)
- 统一随机定时器(Uniform Random Timer)
- 高斯随机定时器(Gaussian Random Timer)
- 泊松随机定时器(Poisson Random Timer)
- 精准吞吐量定时器(Precise Throughput Timer)
- 固定吞吐量定时器(Constant Throughput Timer)
- 同步定时器(Synchronizing Timer)
- BeanShell定时器(Beanshell Timer)
- JSR223定时器(JSR223 Timer)
固定定时器和统一随机定时器,足以覆盖90%的测试情况,当然如果有更复杂的测试场景,可以再去了解其他的定时器,以下介绍4种定时器
1、固定定时器
如果要让每个线程在请求之间暂停相同的时间,可以使用此计时器,需要注意的是:固定计时器的延时不会计入单个取样器,但会计入事务控制器的时间,如果在事务控制器内使用,需要关注一下。固定定时器放到线程组下其作用域是所有请求都会延迟固定器设置的时间,如果放到请求内,作用域是单个请求延迟时间(常用)。
2、统一随机定时器
它产生的延迟时间是个随机值,而各随机值出现的概率均等。总的延迟时间等于一个随机延迟时间加上一个固定延迟时间,用户可以设置随机延迟时间和固定延迟时间。
总延迟时间=指定范围内的随机时间 + 固定延迟时间。
Random Delay Maximum(in milliseconds):随机延迟最大的时间 单位毫秒,比如我这里设置为1000ms
Constant Delay Offset(in milliseconds):固定延迟时间 单位毫秒,我这里设置为2000ms
那么总的延迟时间范围是2000毫秒~3000毫秒之间的值,这个应该比较好理解
如下,我给第二个请求设置了一个随机定时器,随机时间在2s~2.5s之间
如果给线程组设置一个统一随机定时器,设置1个线程 3次循环, 可以看到每次请求间隔也在2s~2.5s
3、同步定时器
同步定时器(Synchronizing Timer)用来保证我们的取样器在同一时刻向服务器发起负载测试,在抢购/抢红包/秒杀活动业务等某时段集中访问场景,需要模拟多用户集中并发测试,此时需要用到同步定时器。
- 模拟用户组的数量:设置同步的线程数量。当设置为0时,等同于线程组中设置的用户数量,当设置为20时,即当用户达到20时同时释放,当设置的数量大于线程数时,设置无效(数量不可设置为大于线程组中的线程数)。
- 超时时间(ms):超时时间,单位为毫秒。当设置为0时,即当用户数量达到了设置的数量时则释放,否则一直等待,当设置为300毫秒时,则当时间达到300毫秒时,就释放已经集合的线程,不再等待。
如下,比如线程组设置50个线程,5秒内启动,同步定时器中同步的线程数量为10个,超时时间为0,每次生产10个线程时就立刻释放。
查看结果,可以看到每次有10个线程,同一时刻集中发出请求,这中间有点儿误差,可以忽略不计
再举一个简单的例子:
模拟用户组数据设置为10,超时时间设置为5s,运行登录脚本:
用户1第一个到达后,同步定时器开始计时
如果3s到了,10个用户均已到达,就一起释放执行后续的请求,意味着10个线程同一时间完成登录;如果5S到了,只到达了7个用户,那么7个一起释放执行后续的请求,超过设置的最大等待时间5S后还没达到模拟用户组中设置的值,线程组将不再等待,释放已到达的线程
超时时间设置为0,表示到达用户数不能达到模拟用户组的数量,则无限等待
线程数必须大于同步定时器的模拟用户组数量