目的
今天做压力测试时,涉及到一个场景,需要先执行A场景,在执行到status=2时,在执行B场景,然后停止运行。
遇到的困难
status开始为1,需要一段时间后变为2,且不确定需要等待多久才会变为2。
最初想到的是,通过“Runtime Controller”+“如果(if)控制器”控制HTTP请求执行一段时间,当status=2时,执行if控制器的HTTP请求。但是Runtime Controller中时间写长了后就算执行了if控制器里的HTTP请求,Runtime Controller下的HTTP请求也一直运行到runtime设置的时间结束,会造成多余的HTTP请求执行,占用资源。
解决方法
通过查看jmeter的逻辑控制器,发现While Controller(While Controller官网地址)适合用于控制,当到达指定条件时,会自动停止运行。
使用说明
条件可以是任何变量或函数,最终等于字符串” 假 ”。需要注意的是:条件是评估两次,一次取样前,一次随机取样!
案例实现
在Runtime Controller下一直运行A HTTP请求,直到status=2,执行While Controller下的B HTTP请求且执行一次,然后退出循环,如下:
(1)当While Controller的条件为false时,While Controller下的sampler仍然会继续运行直到Runtime Controller中的时间结束,所以在这里用了“仅一次控制器”,可做参考。
(2)当orderStatus}的值为2时,将循环运行While Controller下的http(即test7)请求,当http请求中取样器得到的orderStatus值不为2时退出循环。
官网中的While Controller翻译
While Controller运行其子项,直到条件为“ false ”。
Condition可能的条件值:
- 空白 - 当循环中的最后一个样本失败时退出循环
- LAST - 当循环中的最后一个样本失败时退出循环。如果循环之前的最后一个样本失败,请不要进入循环。
- 其他 - 当条件等于字符串“ false ” 时退出(或不输入)循环
条件可以是最终计算为“ false ”任何变量或函数。这允许根据需要使用jexl3, groovy函数,属性或变量。
请注意,条件被评估两次,一次是在开始采样子项之前,一次是在子项采样结束时,因此将非幂等函数放入条件(如__counter)可能会引入问题。
例子:
${VAR} - 当VAR 值为false时退出循环 where VAR is set to false by some other test element
{__jexl3({__jexl3({C}==10)}
{__jexl3("{__jexl3("{VAR2}”==”abcd”)}
${_P(property)} -property值为false时退出循环