![b2e2f5eb8620840d273a7d93f2c91875.png](https://img-blog.csdnimg.cn/img_convert/b2e2f5eb8620840d273a7d93f2c91875.png)
![2fa25e9537d20759599bd0ad8b375648.png](https://img-blog.csdnimg.cn/img_convert/2fa25e9537d20759599bd0ad8b375648.png)
引子
Apache JMeter不仅在性能测试、功能测试、接口测试上应用广泛,本人在数据准备、批量获取上也多次使用它,本文讲述其ForEach控制器在数据批量获取方面的应用,着重演示双重参数如何ForEach。
![2fa25e9537d20759599bd0ad8b375648.png](https://img-blog.csdnimg.cn/img_convert/2fa25e9537d20759599bd0ad8b375648.png)
需求
根据目标应用名称去获取对应的镜像名称。
![2fa25e9537d20759599bd0ad8b375648.png](https://img-blog.csdnimg.cn/img_convert/2fa25e9537d20759599bd0ad8b375648.png)
ForEach控制器
#用户手册https://jmeter.apache.org/usermanual/component_reference.html#ForEach_Controller
ForEach控制器是jmeter众多逻辑控制器中的一种,用于一个参数变量在关联到多个值时,对多个值进行顺序遍历引用于下一次请求(sampler)中。
![2fa25e9537d20759599bd0ad8b375648.png](https://img-blog.csdnimg.cn/img_convert/2fa25e9537d20759599bd0ad8b375648.png)
ForEach控制器基本用法
平时使用该控制器最多的是结合正则表达式提取器(关联)一起使用,只关联一个参数的多个值进行变量引用,这个也是ForEach控制器最常见用法。
举个例子:一个测试计划中,包括两个java请求,java请求1和java请求2。java请求1只执行一次,返回结果可关联到两个img参数值,因此java请求2会ForEach请求1中的img参数值进行输出两次。
#java请求1的响应结果:
#下面通过关联获取到img值harbor1和harbor2
通过ForEach控制器进行img值引用到java请求2中:
结果输出:在整个线程组设置只迭代一次的情况下,java请求2执行了两次,该次数取决于关联到img参数值的个数,ForEach控制器基本用法就介绍到这里。
双重参数ForEach
同样的增加一个关联,获取到app参数的值以便java请求2引用:
结果输出:
可以看出java2请求中并没有取到app参数的值,img的值还是取到了,这是因为img值在ForEach控制器中做了一个变量名转换,从img转换至imgReturn,那是不是app也可以进行转换,比如app--->appReturn呢,在app值关联到的情况下验证仍然是失败的:
解决方案步骤:
删掉上述截图中有狗头的那里的设置,ForEach控制器那里只保留基本用法中的img取值设置:img---->imgReturn
app参数使用数字下标引用:${app_1},${app_2}
参数的数字下标需要用计数器实现,不然写死一个下标会出现问题,如下图1
计数器实现是不能设置整个线程组中线程共享的,需要勾选如下两个选项保证线程内部自己计数以及回滚,具体说明如下图2
Track Counter Independently for each UseReset counter on each Thread Group Iteration
两个参数变量需要借助__V函数实现嵌套:${__V(${num},)}不能直接用:${app_${num}},具体设置如下图3图4图5
图1
图2
图3
图4
图5
目标需求数据获取
实际应用ForEach控制器来获取数据有如下几种情况
关联到上个请求响应内容中一个参数变量的所有值,通过ForEach单个使用所有的参数值
关联到上个请求响应内容中两个参数变量的所有值,通过ForEach成对的使用所有的参数值
关联到上个请求响应内容中一个参数变量的所有值,通过ForEach单个使用某个固定参数下标的值,比如只使用上述app_1的值,对于app_2的值丢弃。
关联到上个请求响应内容中两个参数变量的所有值,通过ForEach成对的使用某个固定参数下标的值,比如只使用上述img_1,app_1的值,对于img_2,app_2的值丢弃。
关联到上个请求响应内容中两个参数变量的所有值,通过ForEach成对的使用某个随机参数下标的值,比如通过随机输入不同app去查询对应的img的值
对于上述前4种需求上文已经讲解,对于最后一种需求,只需要在ForEach控制器里加一个if控制器去做一下条件判断即可实现:
${__jexl3("${appname}" == "${__V(${num},)}")}
其中appname变量值是通过参数化文件输入的,因为需求就是要获取大量的应用(appname)对应的镜像(img)名称是什么。在这里面因为响应报文中img结果下标是随机的,所以我们需要知道if控制器在遍历了多少次的时候匹配到了目标app,这个多少次仍然是通过彼此独立的计数器(counter)实现的,最终脚本实现如下:
#为了模拟随机效果,简单更改了java请求1的响应结果集:
#只想获取到应用名称为cc-cc-app ff-ff-app对应的img名称,增加if控制器进行判断
#结果输出:(因为要获取到两个结果,所以线程组设置迭代次数为2次,这样做的前提是结果集每次都变化,本例中的实际需求也是结果集每次都不同,此次模拟请假装每次结果都是不一样)
![b2e2f5eb8620840d273a7d93f2c91875.png](https://img-blog.csdnimg.cn/img_convert/b2e2f5eb8620840d273a7d93f2c91875.png)
总结
本文介绍了ForEach控制器的基本用法,结合
Regular Expression ExtractorIf ControllerCounterCSV Data Set Config__V函数
等组件演示了双重参数变量ForEach获取和引用。在大批量数据获取的情况下,可以自己写一些java请求将目标数据写入各种格式的文件中做进一步处理。
如有需要脚本请在公众号对话框输入 脚本 来获取