jmeter教程(十二):流程控制终章

这篇博文要介绍的逻辑控制器有:Runtime Controller(运行时间控制器)、吞吐量控制器、模块控制器、While Controller(条件循环控制器)、ForEach Controller(遍历控制器)。

Rumtime Controller,就是用来控制脚本运行多长时间的。

嗯,运行一下,恭喜,你的jmeter卡死了,这个时候,要把控制台关了,才能关掉jmeter

从本质来说,Runtime Controller,就是一个死循环,设置一个时间(Runtime),就是让这个死循环运行多长时间。为了避免jmeter卡死,我们要给java请求加一个定时器

至于定时器,通常用到的就三个:固定定时器、高斯随机定时器、Synchronizing Timer(同步定时器)。固定定时器,就是每次都等待相同的时间,高斯随机定时器,可以设置每次等待的时间是随机的。同步定时器,在性能测试时会用到,这个以后再讲。固定定时器和高斯随机定时器,用于在发送请求之前,等待一段时间,注意是在发送请求之前,也就是在java请求上加一个定时器,是先执行定时器,然后执行java请求。

Rumtime Controller运行时间改为3秒

运行,看结果

运行3秒,每个等300毫秒,一共执行10次,结果就是这样来的

Rumtime Controller运行时间3秒,在Runtime Controller里面添加7个java请求,每个都是等待1秒,运行之后,结果是什么呢?

只运行了前面三个请求。

吞吐量控制器,不要想多了,这个和性能测试中的吞吐量,没有半毛钱关系。吞吐量控制器的作用,通常是在一个循环体内,对循环次数做一个分配,一些循环做这个事务,一些循环做另一个事务。

吞吐量,有两个选项:Total Executions、Percent Executions。前面一个是指定执行次数,后面一个是指定执行的百分比。我们选择Total Executions,设置吞吐量为5,并添加java请求

运行,结果只执行了一次java请求。线程就循环一次,吞吐量设为5次,肯定只执行一次了,把线程的循环次数设为10

保存,执行,看结果

执行了5次。看下面的脚本 

线程组循环10次,两个循环控制器,都是循环5次,吞吐量执行次数3次,运行结果会是什么?学东西,就是要大胆猜想,小心求证。看结果:

只运行了3次,也就是这个Total Executions,是不管作用域的。我们前面讲的 仅一次控制器,是与它所在的作用域有关的。然后,吞吐量的另一个选项就是Percent Executions,这个是以百分比的形式来分配循环的。

线程组循环10次,吞吐量控制器为Percent Executions模式,占比设为30.0%,运行看结果

10的30%,就是3次,这就是结果,把比例设为130%,再次运行

只执行了10次

模块控制器,这个和编程中的goto语句非常相似,就是程序执行到某一个步骤,跳转到另一个地方去执行,执行完了之后,再回来执行这个步骤之后的步骤。这个跳转,有个限制,也就是只能跳转到逻辑控制器上,不能跳到请求上

这里添加了一个简单控制器,然后模块控制器,跳转到这个简单控制器。那么运行结果会是什么呢

分析一下,为什么结果是这样的。首先执行java请求1,这个没有疑问,然后执行模块控制器。跳转到简单控制器,执行了java请求3,简单控制器执行完了,又返回到模块控制器,执行模块控制器后面的步骤,这就是java请求2了。然后再执行简单控制器,又是java请求3,最后是java请求4。逻辑是不是有点乱乱的。对对对,这种做法是不提倡的,就像编程中不提倡用goto语句是一样的,会使脚本的逻辑,难于理解。

While Controller,就是在条件成立的情况下,一直循环。我们来看一个需求:假如测试一个商城的购物车的功能,我需要不断地往购物车中添加商品,商品是随机的,商品的数量也是随机的。然后,在购物车内商品的总金额达到1000,就下订单。这个要怎么实现?这个,用之前学的知道也能实现。

先在测试计划上添加配置元件——用户定义的变量,在里面添加一个变量total,用于保存购物车上商品的总金额。然后添加一个循环控制器,循环控制器添加一个java请求来模拟添加商品,在循环的后面添加下订单的请求,实际上还是这个java请求,改下名字而已。看添加商品的请求,参数是一个函数,函数里又有函数。这两个函数,都可以在函数助手中找到。外层是intSum函数,用于对int进行求和。前面的参数都是加数,个数不限,最后一个参数是把求和的结果,保存到一个变量里面。在这里,第一个参数是${total},也就是上次购物车中商品的总金额,第二个参数,是一个函数,在20-100之间生成一个随机数,把这两个数求和后,保存到变量total中。现在,主要是的问题是循环多少次,total会达到1000?这个是不确定的,我们只能让循环设置成永远循环,然后在循环里面,添加商品的后面添加一个 如果控制器,来判断total的值。

再接下来的问题,就是如何退出循环的问题,在jmeter里面,没有black的功能。但是在线程组中有配置,当出现错误请求的时候,怎么处理,我们可以利用这个设置,当total达到1000的时候,执行一个错误的请求,从而让线程停止。。。

然后,我们在 如果控制器 里添加一个,一定会出错的请求。

但是,这样,下订单的请求就永远执行不到了。所以要把下订单的请求,添加到http请求的前面,拖上去就可以了。

保存,运行

是不是很麻烦?那是相当地麻烦。现在改用While Controller来做,把循环控制器改为While Controller,条件为${total}<1000,那么就一直循环,添加商品,最后脚本就是这样的

注意While Controller的条件,括号里都说明了,函数或变量,所以不能直接写${total}<1000,如果写成这样,一运行,恭喜你,你的jmeter又卡死了,死循环。所以要把判断表达式,写到javaScript函数中,这个函数在函数助手中可以找到。然后运行

最后就讲讲ForEach Controller,这个就是用来遍历用户设置的变量的。

看ForEach Controller的设置面板,有五个设置项,分别为:变量前缀、循环起点、循环终点、保存值的变量、是否加下划线。这个一般用在遍历JDBC查询数据库查询出来的结果,在JDBC查询出来的数据,格式通过是name_1、name_2这样的,然后就可以遍历name的值。可以看出这些变量,前缀都是name,所以第一行变量前缀,就是填这个的。循环起点,那就是从第几个值开始。不填,则默认从第一个变量开始。终点就是循环到第几个变量,就不再循环了。比如查询出来的结果有10个,那么最后一个就是name_10,但是我循环,不想遍历所有,只想遍历前五个,那第循环终点,就填5。每次循环出来的变量,可以保存在一个变量中,第四行就可以输入一个变量名,来接收值。如果变量的名称是name1、name2这样的,中间没有加下划线,那么最后一个就不要勾选。不过通常不会这样做,一般都是加下划线的。关于JDBC的知识,后面会讲。我们这里,现在模拟一下

在ForEach Controller的前面添加一个循环控制器,循环次数为5,循环上添加java请求,参数就是循环次数。然后在java请求上添加正则表达式提取器,把循环次数提取出来,并赋值给变量

这样,前面的循环就会提取出来5个变量,分别为info_1、info_2...值分别是:第1次请求、第2次请求...那么在ForEach Controller里面,就要遍历这些变量,配置:

然后在ForEach Controller里面,添加java请求,把value的值,打印出来

保存,运行,看结果

关于ForEach Controller的循环起点,需要注意,我前面说了,不填,则默认是从第1个变量开始循环,这是有条件的,也就是变量必须要从_1开始计数,才行,如果不是,则就会出现不是你想要的结果哦

这里定义了5个变量,但序号是从5开始的。ForEach Controller和以前一样,保存运行,结果什么也没有执行,把循环终点改为9,也一样,都不运行。改成如下

然后运行,看结果

可以看到,结果只运行了四次,第一个变量,没有遍历到。所以就可以得出结果,循环的终点,需要比起始变量的序号少1。然后把循环的起点改为4,再次运行:

从这里也可以看到,循环起点不填,默认值是0,不是1。

至此,逻辑控制器,就只剩下两个没讲了,一个是Include Controller,这个就是在一个脚本中,引入另一个脚本的,但我测试过,没用,不知道高版本是怎样的。还有一个Critical Section Controller,这个是解决线程安全问题的,在讲JDBC的时候,我会用一个案例来演示这个,并简单讲解一个线程安全的问题。

 

 

 

猜你喜欢

转载自blog.csdn.net/kingzhsh/article/details/86349894