jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据

jmeter 中逻辑控制器使用

  先给一个简单的目录,需要的时候可以看一下,是在不懂可以给我留言,我会及时回复。最后还写了点彩蛋,JM做接口测试的一点小技巧!!!

名称 作用
While控制器 根据条件循环,当天健不满足时停止循环
ForEach控制器 循环一个数组,或者,提取器中返回的数据
如果(If)控制器 在这个控制器下边的组件,只有当满足控制器条件的时候才会运行
循环控制器 就是增加循环次数
仅一次控制器 不论如何,每个线程,或者循环,只执行一次
简单控制器 没有逻辑,里面的组件全部执行
随机控制器 里边的组件随机执行一个
模块控制器 调用其他逻辑控制器,被调用的控制器根据自己规则执行

点关注的图片

  

While控制器(循环一个 csv文件的所有数据)

   先简单看一下目录结构!
jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第1张图片

  • 线程组 (规定的写法,那个都一样)
    • While控制器(用来控制循环次数的)
      • CSV 数据文件设置(读取CSV 文件)
    • 如果(If)控制器(判断数据是不是有效的)
      • 采集器 (可以是多个,没有什么约束)
   While控制器(用来控制循环次数的)

   ${__groovy("${skuId}"!="")} 这一句话,表示这是否还有下一行,如果遇到文件结束符,就不在循环。
拆分解释一下

  • __groovy 是jmeter中的函数,将逻辑表达式的结果,返回给Jmeter
  • “${skuId}” 获取文件中的一条数据中的一列数据
  • ” 文件结束符的表示

  不过这样写会有一个警告,就是当 csv数据控制器没执行的时候回有一个警告,提示你${skuId}没有获取到数据,不过不影响程序运行。
jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第2张图片

介绍一下 CSV 的文件格式和读取的方式

   其中 第一列是 ID 必填项,他如果是空的,其他数据就不能用。

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第3张图片
   其他的没什么,都一样的吗,遇到文件结束符时,再次循环,一定要选False,不然就会无限循环了。

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第4张图片

如果(If)控制器

   ${__groovy("${skuId}"!="")} 判断数据是否有效,如果有效就执行下边的组件

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第5张图片

最后看以下是结果

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第6张图片

ForEach控制器(循环一个提取器中返回的数据)

先 看一下目录结构,顺道看一下http请求
jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第7张图片
http请求,可以访问请求接口,也可以请求一个文件吗,我这是味了方便,我把接口的返回数据,保存到了文件里,然后直接请求这个文件。(调试脚本的时候可以这样写,其他时间还是要以接口数据的返回值为准。)

C:\Users\Administrator\Desktop\JM技巧片段\test.txt
{
    "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"
            }
        ]
    }
}
边界提取器 or 正则表达式提取器

就是提取多个数据放到一个变量里边,可以有多个方法。
jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第8张图片
jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第9张图片

ForEach控制器

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第10张图片

  • 输入变量前缀:就是 提取器 提取出来的值
  • 输出变量名称:forEach控制器下面的组件引用的名称
看一下结果

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第11张图片

如果(If)控制器

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第12张图片
  这里边的其实是 BeanShell 脚本,但是最后的返回值一定是一个返回True,或者 False 。

  想要判断上一个请求是否是成功的,可以使用${JMeterThread.last_sample_ok}来判断上一个采集器是否运行成功!

  写判断的使用,不能直接写 [1 == 1 ] 这类的逻辑表达式,要用上 ${__groovy(1==1)} 或者 ${__jexl3(1==1)} 通过这两个函数,将逻辑表达式的结果返回给控制器。

循环控制器

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第13张图片
  循环次数,你给他一个数字(可以是变量)他就能自己去循环去了。

仅一次控制器

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第14张图片

  对,没错,什么都不需要。你只需要知道这里的组件只执行一次,不管后续调用,还是循环调用,他就执行一次(一个线程执行一次)

简单控制器

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第15张图片
  对,没错,什么都不需要。你只需要知道这里的组件全部执行,就是给《模块控制器》准备的控制器

随机控制器

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第16张图片
  对,没错,什么都不需要。你只需要知道这里的组件随机执行一个(如果是其他组件的话,那会执行一个组件下的所有组件)。

模块控制器

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第17张图片
  在红色的地方,选择一个模块,就可以调用他了,不过需要注意的是,小心递归调用。

使用 BeanShell 遍历一个请求返回的所有参数!!!

虽然是遍历的所有,但是用起来却是很麻烦,正在想办法升级,哪位大神,有思路希望可以指点一下。

HTTP请求 还是请求的本地文件,不多说。

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第18张图片

http 请求的 后置处理器 BeanShell PostProcessor
/*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));
		}
	}
循环控制器,循环的次数就是上面定义的 9 行定义的

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第19张图片

计数器,用来计算当前所在的index在哪里

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第20张图片

BeanShell 取样器
/*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")));
	}
看一下结果

jmeter5.1 中逻辑控制器使用 And 循环一个 csv文件的所有数据 And 循环一个提取器中返回的数据_第21张图片

上面的组件,我都放在百度盘上了,有兴趣,可以去看看!!
链接:https://pan.baidu.com/s/1pMyW-kxiM7uuE4EF2SOPCQ 
提取码:z6u6 

写是写了,大家能不能用就要看你们了,不明白随时留言,谢谢!!
点关注的图片

“一个计划未来,一个计划离开”!未来在美好,少了一个,又能有什么值得去精彩!

你可能感兴趣的:(jmeter接口测试)