jmeter使用if控制器_ForEach控制器在数据获取方面的应用

b2e2f5eb8620840d273a7d93f2c91875.png 2fa25e9537d20759599bd0ad8b375648.png

引子

Apache JMeter不仅在性能测试、功能测试、接口测试上应用广泛,本人在数据准备、批量获取上也多次使用它,本文讲述其ForEach控制器在数据批量获取方面的应用,着重演示双重参数如何ForEach。

2fa25e9537d20759599bd0ad8b375648.png

需求

根据目标应用名称去获取对应的镜像名称。

2fa25e9537d20759599bd0ad8b375648.png

ForEach控制器

#用户手册https://jmeter.apache.org/usermanual/component_reference.html#ForEach_Controller

ForEach控制器是jmeter众多逻辑控制器中的一种,用于一个参数变量在关联到多个值时,对多个值进行顺序遍历引用于下一次请求(sampler)中。

dc7a36ddba2f16e4bd9bc9e9dc3b858e.png

2fa25e9537d20759599bd0ad8b375648.png

ForEach控制器基本用法

平时使用该控制器最多的是结合正则表达式提取器(关联)一起使用,只关联一个参数的多个值进行变量引用,这个也是ForEach控制器最常见用法。

举个例子:一个测试计划中,包括两个java请求,java请求1和java请求2。java请求1只执行一次,返回结果可关联到两个img参数值,因此java请求2会ForEach请求1中的img参数值进行输出两次。

#java请求1的响应结果:

23626977f393f3c59eef8753b1fa8d0f.png

#下面通过关联获取到img值harbor1和harbor2

39bd77d125f69f5b05a0e9df456bac0a.png

通过ForEach控制器进行img值引用到java请求2中:

1a16d8cef697841c6463c993ab2fc602.png

结果输出:在整个线程组设置只迭代一次的情况下,java请求2执行了两次,该次数取决于关联到img参数值的个数,ForEach控制器基本用法就介绍到这里。

db86ef6be621da9d579f941e3fc7b47d.png

2fa25e9537d20759599bd0ad8b375648.png双重参数ForEach

ForEach控制器升级用法体现在具体需求超过一个变量关联输出多组关联值时候的用法。承接上述基本用法中的例子,现在java请求1中需要关联到img和app两个参数的值用于java请求2中。

1a74e42e5678dac5620bd64ffb7b5b68.png

同样的增加一个关联,获取到app参数的值以便java请求2引用:

e2a7e1a5a755b2061d82028bfd522f35.png

结果输出:

a3429c39b1988bcb9e15cdb38d7bec78.png

可以看出java2请求中并没有取到app参数的值,img的值还是取到了,这是因为img值在ForEach控制器中做了一个变量名转换,从img转换至imgReturn,那是不是app也可以进行转换,比如app--->appReturn呢,在app值关联到的情况下验证仍然是失败的:

7fefbc9141e227714ab99c2a696bd5d9.png

4dd27f58ea331ff79e4b7172f92d82c4.png

解决方案步骤:

  • 删掉上述截图中有狗头的那里的设置,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

191da71929c96d2a995e4a3262cf0815.png

图1

34ac1f7489477d3f2fa3c0b883ca5597.png

图2

291d7fd437efde2eb14008150f5e6928.png

图3

e038c17be4137d27a8543c3c60b60bf1.png

图4

0e68a0b68719f5cfbe8e5fd187eb407a.png

图5

2fa25e9537d20759599bd0ad8b375648.png

目标需求数据获取

实际应用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的响应结果集:

bfa527dd4883c3acf0b8bc7dacf0f67d.png

#只想获取到应用名称为cc-cc-app ff-ff-app对应的img名称,增加if控制器进行判断

bdee0c9496658428afc6a148c900d517.png

#结果输出:(因为要获取到两个结果,所以线程组设置迭代次数为2次,这样做的前提是结果集每次都变化,本例中的实际需求也是结果集每次都不同,此次模拟请假装每次结果都是不一样)

41ae3ee91f936c79a53349e6d93a991b.png

b2e2f5eb8620840d273a7d93f2c91875.png

2fa25e9537d20759599bd0ad8b375648.png总结

本文介绍了ForEach控制器的基本用法,结合

Regular Expression ExtractorIf ControllerCounterCSV Data Set Config__V函数

等组件演示了双重参数变量ForEach获取和引用。在大批量数据获取的情况下,可以自己写一些java请求将目标数据写入各种格式的文件中做进一步处理。

如有需要脚本请在公众号对话框输入 脚本 来获取

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值