Jmeter常用控制器使用实例说明

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是最简单方便的一种方式。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值