先给一个简单的目录,需要的时候可以看一下,是在不懂可以给我留言,我会及时回复。最后还写了点彩蛋,JM做接口测试的一点小技巧!!!
名称 | 作用 |
---|---|
While控制器 | 根据条件循环,当天健不满足时停止循环 |
ForEach控制器 | 循环一个数组,或者,提取器中返回的数据 |
如果(If)控制器 | 在这个控制器下边的组件,只有当满足控制器条件的时候才会运行 |
循环控制器 | 就是增加循环次数 |
仅一次控制器 | 不论如何,每个线程,或者循环,只执行一次 |
简单控制器 | 没有逻辑,里面的组件全部执行 |
随机控制器 | 里边的组件随机执行一个 |
模块控制器 | 调用其他逻辑控制器,被调用的控制器根据自己规则执行 |
${__groovy("${skuId}"!="")} 这一句话,表示这是否还有下一行,如果遇到文件结束符,就不在循环。
拆分解释一下
不过这样写会有一个警告,就是当 csv数据控制器没执行的时候回有一个警告,提示你${skuId}没有获取到数据,不过不影响程序运行。
其中 第一列是 ID 必填项,他如果是空的,其他数据就不能用。
其他的没什么,都一样的吗,遇到文件结束符时,再次循环,一定要选False,不然就会无限循环了。
${__groovy("${skuId}"!="")} 判断数据是否有效,如果有效就执行下边的组件
先 看一下目录结构,顺道看一下http请求
http请求,可以访问请求接口,也可以请求一个文件吗,我这是味了方便,我把接口的返回数据,保存到了文件里,然后直接请求这个文件。(调试脚本的时候可以这样写,其他时间还是要以接口数据的返回值为准。)
{
"msg": "处理成功",
"code": 0,
"body": {
"currPage": 1,
"totalPage": 1,
"pageSize": 10,
"totalCount": 4,
"list": [
{
"amount": 2,
"combinationId": "1",
"id": "1",
"skuId": "035c61d1677129fff006c4b27c1739c6"
},
{
"amount": 1,
"combinationId": "1",
"id": "2",
"skuId": "0e0799cc94d727e5f45c884d783ac3f0"
},
{
"amount": 3,
"combinationId": "1",
"id": "3",
"skuId": "0e0799cc94d727e5f45c884d783a0001"
},
{
"amount": 3,
"combinationId": "1",
"id": "4",
"skuId": "0e0799cc94d727e5f45c884d783a0002"
}
]
}
}
这里边的其实是 BeanShell 脚本,但是最后的返回值一定是一个返回True,或者 False 。
想要判断上一个请求是否是成功的,可以使用${JMeterThread.last_sample_ok}来判断上一个采集器是否运行成功!
写判断的使用,不能直接写 [1 == 1 ] 这类的逻辑表达式,要用上 ${__groovy(1==1)} 或者 ${__jexl3(1==1)} 通过这两个函数,将逻辑表达式的结果返回给控制器。
循环次数,你给他一个数字(可以是变量)他就能自己去循环去了。
对,没错,什么都不需要。你只需要知道这里的组件只执行一次,不管后续调用,还是循环调用,他就执行一次(一个线程执行一次)
对,没错,什么都不需要。你只需要知道这里的组件全部执行,就是给《模块控制器》准备的控制器
对,没错,什么都不需要。你只需要知道这里的组件随机执行一个(如果是其他组件的话,那会执行一个组件下的所有组件)。
在红色的地方,选择一个模块,就可以调用他了,不过需要注意的是,小心递归调用。
使用 BeanShell 遍历一个请求返回的所有参数!!!
虽然是遍历的所有,但是用起来却是很麻烦,正在想办法升级,哪位大神,有思路希望可以指点一下。
/*BeanShell PostProcessor*/
// 导包,导入JSONObject 对象
import org.json.JSONObject;
// 获取请求的返回值,转换成 json对象
response_data = prev.getResponseDataAsString();
data_obj = new JSONObject(response_data);
// 获取请求json 的 body (body是一个list对象)
list = data_obj.get("body");
// 把他的长度保存在一个变量中,用来给循环控制器使用
vars.put("list_length",list.length().toString());
// 遍历这个数组
for(i = 0 ; i < list.length() ; i++){
JSONObject dat = list.get(i);
Iterator keys = dat.keySet().iterator();
// 第一次循环的时候,把所有key保存起来,后面取值前会用到
if(i == 0 ){vars.put("keySet",dat.keySet().toString());}
// 循环一个 map 吧里面虽有的值保存起来
while (keys.hasNext()){
key = keys.next();
put_key = key +"_"+i.toString() ;
put_key = put_key.replace(" ","");
vars.put( put_key , dat.get(key).toString());
// log.error(put_key +"\t\t== "+vars.get(put_key));
}
}
/*BeanShell 取样器*/
// 导入 JSONArray 对象
import org.json.JSONArray;
// 将上面保存的keySet转换成JSONArray对象
JSONArray keySets= new JSONArray(vars.get("keySet"));
// 遍历他,将数据数据的值保存为正常的。从 id_${index} 转换为 id
for(int i = 0 ; i < keySets.length();i++){
key = keySets.get(i);
vars.put(key,vars.get(key+"_"+vars.get("index")));
}
上面的组件,我都放在百度盘上了,有兴趣,可以去看看!!
链接:https://pan.baidu.com/s/1pMyW-kxiM7uuE4EF2SOPCQ
提取码:z6u6
写是写了,大家能不能用就要看你们了,不明白随时留言,谢谢!!
“一个计划未来,一个计划离开”!未来在美好,少了一个,又能有什么值得去精彩!