测试人社区

测试开发实战|电商性能测试实战 | JMeter 插件 Ultimate Thread Group 完成梯度递增场景的压测

电商性能测试实战 | JMeter 插件 Ultimate Thread Group 完成梯度递增场景的压测

原创 月关 3月18日

来自专辑

测试开发实战干货 | 原创合辑

本文为霍格沃兹测试学院优秀学员课程学习系列笔记,想一起系统进阶的同学文末加群交流。

前面几篇文章已经介绍完一个电商从注册登录到购物下单的典型场景的 Jmeter 压测脚本,具体可参考前期文章:基于电商模式的性能测试(五)-基于Jmeter完成一次日常典型电商场景的压测(下单-支付)。

1、场景调整

在实际压测前,我们还需要对场景做适当的调整。

1.1 调整目的

ThreadGroup 中看,我们的 Thread 会在某个时间点同时起多个,而日常场景中我们需要的可能是一个递增的梯度加压的方式。

image

为了实现梯度递增,我们就需要借助于插件 UltimateThreadGroup

1.2 Ultimate Thread Group插件简介

先看下 UltimateThreadGroup 插件的面板信息,如下:

  • 参数解释:

    • StartThreadsCount :当前行启动的线程总数
    • InitialDelay/sec :延时启动当前行的线程,单位:秒
    • StartupTime/sec :启动当前行所有线程达峰值所需时间,单位:秒
    • HoldLoadFor/sec :当前行线程达到峰值后的稳定加载时间,单位:秒
    • ShutdownTime :停止当前行所有线程所需时间,单位:秒
  • 文字的描述还是稍显晦涩, UltimateThreadGroup 插件有个很好的地方就是下方的图表,它会根据你的设定而展示出趋势图,那么现在我们设定如下参数:

    • StartThreadsCount :100
    • InitialDelay/sec :10秒
    • StartupTime/sec :200秒
    • HoldLoadFor/sec :100秒
    • ShutdownTime :10秒

从插件的趋势图我们可以看到在延迟10秒后100个线程在200秒时间内逐步从0递增至100,然后持续100秒的时间,最后在10秒的时间内有逐步从100递减到0。

当然你还可以继续添加 ThreadSchedule ,趋势图会帮你绘制出综合的线程运行趋势:

1.3 调整方式

介绍完 UltimateThreadGroup 插件,要开始实操调整我们的电商压测脚本了。

1) 选择插件 UltimateThreadGroup

2)将写好的Jmeter脚本整体移至 UltimateThreadGroup

3)现在我们需要的场景是:

  • 开始我们需要在60秒的时间内起是10个thread,然后保持运行
  • 接着我们继续在60秒的时间内再起10个thread,然后和开始的10个线程一起保持运行100秒后结束

具体设置如下:

2、实操演示

2.1 运行

1)命令启动,实际运行脚本期间会用命令行的方式,减少客户端自身运行性能造成的测试影响

$ jmeter -n -t RegisterLogin.jmx


2)在grafana中查看运行数据 

![](https://mmbiz.qpic.cn/mmbiz_png/ervTCibwaujEml8oZeQacU2EBaY9Ad72xI7Rxg8oITPuGaN2WiaFD58nqE7MZQ5sRyYhDc9jHvVoTvgcNnGQZo9Q/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

#### 2.2 数据分析

从数据中简单的分析,可以看到:

线程数在设定的120秒时间内均匀的从0递增至20

![](https://mmbiz.qpic.cn/mmbiz_png/ervTCibwaujEml8oZeQacU2EBaY9Ad72xql7nan1krhrthRAWLiagZlJE0CzrB0K7pNPbQRA3kJl2zc0q3AvuKCg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

错误率在38分30秒的时候出现剧增,而这个时候的线程数为5,说明在  `ActiveUser` 达到5的时候系统出现了问题造成错误率陡增。

![](https://mmbiz.qpic.cn/mmbiz_png/ervTCibwaujEml8oZeQacU2EBaY9Ad72xyUofuZaTzg9Aye7WyBv9AQNnoTiaE4eWqIKy2ClBAFoLrecrIqudq7A/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)
![](https://mmbiz.qpic.cn/mmbiz_png/ervTCibwaujEml8oZeQacU2EBaY9Ad72xiaWGia9HIaibYbgqHTHMEE0uQNdUVFm48q3TGyyaBk3K3S2jUeASqSfww/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

从错误率和响应时间来看,结果较差的接口主要集中在下单流程这块,而首页的响应时间也很大,很可能是因为首页相关的表数据是和订单的表数据有关联的,因而订单的响应时间增加也会造成首页的耗时增加。

![](https://mmbiz.qpic.cn/mmbiz_png/ervTCibwaujEml8oZeQacU2EBaY9Ad72xpoONKxTdqOYCv9oCgFz29L8Q2j13LzORUfeHBsPa8ePFV4suiclRUibw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

### 2.3 AutoStop Listener插件

#### 2.3.1 AutoStop Listener简介

> 在实际的测试中,可能还需要设置触发点,假如请求的响应时间过长,错误率过大,已经没有测试的必要了后自动停止测试,这个时候就可以借助另外一个插件—— `AutoStopListener`

* 插件添加后在如下位置选择

> 注:因为本片文章的重点不是介绍Jmeter插件体系,所以省略了插件的安装说明和原理等,可自行查阅资料。

![](https://mmbiz.qpic.cn/mmbiz_png/ervTCibwaujEml8oZeQacU2EBaY9Ad72xmYZ6onEx0rt4TJEic2XAX0M4Q1CUq5yTdV1DPwl15zVZgdLPNzCSBZw/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

打开后的面板如下:

![](https://mmbiz.qpic.cn/mmbiz_png/ervTCibwaujEml8oZeQacU2EBaY9Ad72xCUQDl4aaaD5ibSNysdUKuT51CTWMGHTq5BaYlacNiaNzXtnU7OzKsz5A/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

现在可以设置当平均响应时间大于200ms持续10秒,平均延迟时间大于300ms持续10秒或者错误率大于1%持续5秒时测试停止。

![](https://mmbiz.qpic.cn/mmbiz_png/ervTCibwaujEml8oZeQacU2EBaY9Ad72xxctBbSxfSD1mAnricbjibse1MYHJmDphu1MKh4iah6zcN0ny06HLSLSicg/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)

#### 2.3.2 运行效果

可以看到当我们的响应时间持续10秒超过200ms时,测试自动停止了。
**![](https://mmbiz.qpic.cn/mmbiz_png/ervTCibwaujEml8oZeQacU2EBaY9Ad72xhbnDtXq55WvaxUO6EVe0fV8ZvkNktibJKjDUNFEGsvpXTfD9PT517AA/640?wx_fmt=png&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1)**

**总结**

客户端方面的电商压测实战学习暂时到这里了,后面如果还想继续深入学习就需要关注服务端的指标了,依然可以结合 `docker+grafana+prometheus` 的方式来监控服务端的各项指标进行分析。