1、Jmeter 常见的控制器
其实我们常用的不多,根据例子的使用场景在这里介绍一下if Controller、While Controller、ForEach Controller。
另外加一个配置元件-计数器Counter
2、实例说明
最终结果显示
对应的请求HTTP Request 4请求参数体:
{
"roleId":252,
"dataIds":["20210219112207165-871C-D23EE420E",
"20210112094044646-488E-7D54362C2",
"20210706153746993-4647-71E3CC853",
"20210714110828370-138C-885AC30DC",
"20210714111013600-E61E-DA405E72E","20210714143033277-362C-6283642E1","20210721151901820-C02C-0D9E468E5","20210730102135278-74EA-5D0DE92D6","20210802145322777-6CF1-F268237A6","20210802150242041-56C9-9FFD5C020","20210804104818336-4A0F-2FDE58C0D","20210805161344646-7E80-6D9A4CC2B","20210806101044298-E331-6BE76CD57","20210809103827770-D1BE-8E5D03273"]
}
其中dataIds中的数据是动态由上一个HTTP Request 3请求返回的信息(即应用选择列表里的信息)。
可以用在线json工具线美化了一下,看得会更清楚一些。
其中data列表中的id是我们下一个接口想要获取的信息。
此处用到提示正则表达式
$.data[*].id
详细使用说明参看官网JSON Extractor说明
具体的操作可参看Jmeter --json提取器【提取符合特定条件的表达式】在此不在过多说明。
2.1、先介绍一下使用 if Controller 来实现
我们先看一下结构
逻辑控制器线程组中共有四个简单请求和三个if控制器。分别是当请求1正常时执行请求2,当请求2正常时执行请求3,当请求3正常时执行请求4.
最终我们是看请求4的执行结果
请求4的请求体:
其中“${roleId}”是请求1中的返回结果提取出的值,“${ids}”是请求3返回的列表结果。
如何对请求3里的返回列表进行处理,这里用到了JSR233 PostProcessor具体信息如下:
log.info("-----------------------------HTTP Request 3------------------------------------");
var id = new Array();
for(var i=0;i<vars.get("dataIds_matchNr");i++){
N = i+1
id[i]='"' + vars.get("dataIds_"+N) + '"'
log.info(id[i]);
}
vars.put("ids",id);
//log.info(ids);
log.info("-----------------------------HTTP Request 3------------------------------------");
最终执行的结果:
2.2、使用ForEach Controller来实现
input variable prefix:变量名
Start indes for loop(exclusive):开始索引循环遍历变量,不填写默认为0.自动+1
End index for loop(inclusive):变量循环的结束索引循环,不填写默认为设置变量的“variables_matchNr”的值。
这里每个变量以"_"分隔。
如图中所示,变量名-datalds,其索引形式:
dataIds_1,
dataIds_2,
…
dataIds_“dataIds_matchNr”
请求4的请求体参数信息:
{"roleId":${roleId},"dataIds":["${appId}"]}
会自动根据实际获取参数的个数来决定执行请求4的次数。
2.3、使用Loop Controller来实现
除了自身Loop Controller控制器外,还需要计数器来辅助确定循环体执行次数。
请求4的请求体参数信息:
{"roleId":${roleId},"dataIds":["${__V(dataIds_${N})}"]}
2.4、使用While Controller来实现
这里因while的前提条件是需求初始化并且还要在控制体中重新赋值条件值。
log.info("------------While 条件初始化-------------------");
vars.put("i","1"); //While 条件初始化
log.info("------------While 条件初始化-------------------");vars.put("i","1"); //While 条件初始化
请求4的请求体参数信息:
{
"roleId":${roleId},
"?msg":"此变量里带变量值不能写成${dataIds_${N}},得需要变量函数${__V(变量名+变量)}",
"dataIds":["${__V(dataIds_${N})}"]
}
同Loop Controller一样也是需要计数器来辅助确定循环体执行次数。
还有一种方式就是使用简单控制器JSR223来操控while循环体变量值。
log.info("------------条件变量赋值-------------------");
int i=Integer.valueOf("${i}");
i=i+1;
vars.put("i",i.toString());
//log.info(vars.get("N"))
log.info("------------条件变量赋值-------------------");
注:本人对编程语言不是很好,在jsr223里选择beanshell,选择其他语言时没有报错,但是出现while进入死循环状态。这个等以后研究出了具体原因再加以说明。
综合上面所有操作,可以看出尽管实现相同的功能但是使用ForEach是最简单方便的一种方式。