前言
在昨天的博文“JMeter案例分享:修改密码-如何在测试中使某变量循环交替使用两个值?”中,因测试场景反复修改密码,为了保证测试结束后给密码复位,不影响别的场景测试,我的方法是在修改密码的线程组后面添加另一个线程组,执行密码复位操作。
但是这样有一个风险:执行测试的人,必须要记得后面的这个线程组是用来复位密码的,要与修改密码的线程组一并启用,且仅循环一次。一旦疏忽,就可能导致后面计划的其他线程组的测试全部因登录失败而出现大量错误。
我们的测试通常在晚间执行,这种风险,还是尽量规避。所以,我想找到一种不需要任何附加条件的执行复位操作的方式。
可能性尝试
一、使用真正的tearDown线程组
如图,我添加了一个其他业务线程组,及tearDown线程组
执行结果如下:
可见,tearDown是在所有的线程组执行完成后,才执行一次。但是,我需要在修改密码线程组执行完成后立即执行密码复位操作,否则其他业务请求就失败了。
所以,如果使用tearDown来执行密码复位,就要求修改密码线程组是最后一个。仍然是由条件的复位方法。并不比我原来使用普通线程组的方法高级。
我要做的事情是:
(1)反复执行修改密码的操作
(2)最后执行一次密码复位的操作
所以,如果我将第(1)步放在循环体内反复执行,第(2)步在循环体外,不就实现了么?基于此,尝试循环类控制器。
二、使用循环类控制器
1、循环控制器Loop Controller
于是,我找到Logic Controller中的Loop Controller来尝试:
但是,不太行,因为Loop Controller只有一个参数Loop Count,无限循环,或者是指定循环次数。
而我们测试执行时,要求设置执行时长,而非执行次数。所以,对我不适用。
2、循环控制器While Controller
它提供了一个可以输入表达式的输入框,看起来灵活性更高一些。查了官网,输入下面的表达式:
${__jexl3(${__time(,)}-${__P(TESTSTART.MS,)}<=10000)}
表达式的意思是:判断“当前时间-测试开始时间<=10秒”是否为真。
当以上判断为false时,将结束循环。开始执行后面的请求。
执行结果如下:
可以看到,修改密码循环一共执行了16次,然后10秒时间到,结束循环,执行密码复位操作。
3、运行时间控制器Runtime Controller
运行时间控制器看起来就简单多了,它直接提供了一个执行时间的设置下,单位是秒,所以这里我直接输入10,控制它运行10秒结束:
执行结果:
修改密码循环结束后,执行一次密码复位操作。
小结
通过循环控制器While Controller和运行时间控制器Runtime Controller,测试执行结束后的tearDown操作就与被测场景在同一个线程组内完成了,不需要执行者做特殊的设置,这样可以减少操作风险。
需要注意的是:
1、这时候线程组的循环次数就只能设置成1次,真正的执行时间是在循环类控制器中设置的:
2、密码复位操作的接口与循环体内被测接口的名称注意修改成不一样的,否则,聚合报告中会统计在一起。
3、密码复位操作的接口中把断言删除,否则登录不成功的错误率会显示在聚合报告中,导致测试数据不达标。
如图,是脚本最终的样子,在接口名称前添加前缀以示区别,且移除其中的断言。
补充
或许还有其他控制器可以达成目标,等我学会了再来补充;
While Controller的使用还有点小复杂,我会专写一篇来介绍。