1-性能测试 - JMeter逻辑控制器

about

来自JMeter官网对逻辑控制器的解释:

Logic Controllers determine the order in which Samplers are processed.

大致意思是逻辑控制器决定了采样器的执行顺序。

也就是说,逻辑控制器通常和采样器一起使用。

另外,JMeter中的逻辑控制器大体分为两类:

  • 控制测试计划执行过程中线程执行的顺序,如循环控制器、if控制器等。
  • 对测试计划中的脚本进行分组,方便jmeter统计执行结果以及进行脚本的运行控制等,如简单控制器、吞吐量控制器、事务控制器等。

JMeter提供了如下这么多的逻辑控制器,以应对各种场景:

简单控制器

正如它的名字一样,"简单控制器"是最基础的逻辑控制器,非常的简单!它本身对测试计划没什么影响!那它能干嘛呢?我们常用来使用"简单控制器"对线程组的取样器做分组,或者打个标签,如联系人分组一样,本身并没有什么实际的意义!

来看:

"察看结果树"中也没啥大变化:

循环控制器

现在,有这么个需求,在线程组内,get请求执行一次,post请求就要执行2次。怎么实现呢?

上URL:

http://www.neeo.cc:6001/get   # get 无参数
http://www.neeo.cc:6001/post  # post 无参数

在线程组内创建两个"HTTP请求"取样器:

那怎么才能让get请求执行一次,就让post请求执行2次呢?这就要用到了循环控制器了,来看如何添加和配置:

如上图,所示,将取样器移动到"循环控制器"中,这样,"循环控制器"中的"循环次数"就决定了其内的取样器的执行次数。

来看"察看结果树"中的执行结果:

完美!

if控制器

http://www.neeo.cc:6001/get   # get
http://www.neeo.cc:6001/post  # post

如果有些取样器的执行需要满足一定的条件才执行,这里就用到了if控制器:

"if控制器"的配置中,需要添加简单的表达式来完成条件判断,比如当port是8080时条件成立,当用户名是xxx时条件成立等等。

# 语法
${__jexl3(条件表达式)}

# 示例
${__jexl3("${ip}" == "localhost" && ${port} == 8231)}    // 会执行
${__jexl3(${user} == "zhangkai" && ${pwd} == 666)}  // 会执行

来个需求,当user == “zhangsan" && pwd == 111时,取样器才执行,来看怎么配置吧!

为线程组的线程数设置为2;在"用户参数"这个前置控制器内,有两个用户信息:

然后,两个"HTTP请求"取样器参数都从"用户参数中"取值:

那"if控制器"的表达式怎么写呢?

就这么写,一定要按照格式要求来!来看是否生效吧:

生效了!

仅一次控制器

http://www.neeo.cc:6001/get?user=zhangkai&pwd=123   # get 无参数
http://www.neeo.cc:6001/post  # post 
# 参数
{"buy": 1}

这个仅一次控制器一般用来某个接口只执行一次,后续接口可以执行多次的结果,比如用户登录一次,后续请求执行多次都是基于登录成功的结果的。

来个需求,参照如上URL,我们设置get请求仅执行一次;post请求执行10次。这个需求就要借助"仅一次控制器"来实现了:

"仅一次控制器"没啥好配置的。来看其他的配置吧!

首先,为线程组的线程数为1,循环10次,表示1个用户登录一次后,购买10次,然后添加两个"HTTP请求"取样器:

经过这么设置后,我们来观察结果:

完美!

foreach控制器

http://www.neeo.cc:6001/get   # get

foreach控制器可以遍历变量,比如从数据库中查询出用户信息,然后在别的接口中循环使用查询出来的每个用户。

来个需求:从数据库查询出用户记录,然后循环获取记录中的用户名当成请求的参数,发请求。

关于jdbc的配置:

结果:

现在创建一个"foreach控制器"来循环使用上面的user变量:

在"调试取样器"中,user变量都是以user_数字来保存的,想要循环读取这些变量,就要按照规则来读取,如上图这么配置。然后在"foreach控制器内"的取样器中,直接使用即可:

"察看结果树"中,就会发现,有三个请求,并且这三个请求携带的user参数都是从数据库中提取出来的。

哦了!

事务控制器

"事务控制器"可以用来检测一个功能整体的测试结果,如果多个接口组成的一个功能,可以检测多个接口执行的总时间,如果其中一个接口执行失败,那么该事物就失败了。

http://www.neeo.cc:6001/get?user=zhangkai&pwd=123   # get
http://www.neeo.cc:6001/post  # post 
# 参数
{"buy":1}

来看怎么用的,首先为线程组的线程数设置为100,然后在线程组内添加一个"事务控制器":

在事务中建立两个"HTTP请求"取样器:

再来看"事务控制器"的配置:

想要了解上图中的Generate parent sample选项,勾选与否,在最终的结果中有啥区别,我们还需要一个使用一个新的监听器"聚合报告",该监听器常用于压测中,这里我们先来看看:

添加之后,它跟"察看结果树"一样收集测试计划执行的结果,但是这里我们首先禁用"察看结果树"监听器,因为"察看结果树"监听器会收集展示每一个请求的详细信息,但如果是高并发的请求中,会导致jmeter编码,一卡一卡的,而"聚合报告"则只统计所有请求的执行情况,以表格的形式展示出来,比较方便,首先展示没有勾选"事务控制器"的Generate parent sample选项,测试计划执行的结果:

如上图,"聚合报告"展示了本次执行的所有的接口请求信息,并且还展示事务的执行情况,细心如你一定发现了,事务的结果在某些选项上来自于其内的接口的值的和。各参数的意思如下:

  • label展示了被压测的接口。
  • 样本(Samples):表示总请求数,也就是在单位时间内,一共发出了多少个请求。
  • 平均响应时间(Average):平均响应时间。
  • 中位数,表示响应时间取中间值。
  • 90%百分位:表示90%的接口响应时间低于某个值。
  • 95%百分位:表示95%的接口响应时间低于某个值。
  • 99%百分位:表示99%的接口响应时间低于某个值。
  • 最小值(Min):最小响应时间。
  • 最大值(Max):最大响应时间。
  • 异常(error):错误率,计算公式是错误的请求数量 / 请求总数
  • 吞吐量(throughput):默认情况下,表示每秒完成的请求数(request per second),在jmeter中吞吐量等于tps。
  • 接收KB/sec:每秒从服务端接收的数据量。
  • 发送KB/sec:每秒向服务端发送的数据量。
  • 保存表格数据:将数据以csv形式保存到本地。

百分位数:统计学术语,如果将一组数据从大到小排序,并计算相应的累计百分位,则某一百分位所对应数据的值就称为这一百分位的百分位数。可表示为:一组n个观测值按数值大小排列;如处于p%位置的值称第p百分位数。如90%百分位,表示一组数由小到大进行排列,找到它的第90%个数(假如是12),那么这个数组中有90%的数将小于等于12,这用在性能测试的响应时间也将非常有意义,也就是90%请求响应时间不会超过12 秒。

接下来,展示勾选"事务控制器"的Generate parent sample选项后的,测试计划执行的结果:

可以看到,事务内的请求不再展示具体信息了,而是只展示事务的信息。

再次强调:处于事务中的所有接口,如果其中一个接口执行失败,那么该事物就失败了。


欢迎斧正,that's all,see also:

Jmeter之事务控制器

posted @ 2020-06-10 12:00  听雨危楼  阅读(299)  评论(0编辑  收藏  举报