原数据 需要参数化数据(参数化call_id、dialog):
{"call_id": "8cf170ea31c04bd5a8a9ef9d69226045", "dialog": [{"text": "喂?是机主本人吗?借条", "role": "robot"}, {"text": "嗯。", "role": "user"}, {"text": "我看您在我们借条的借款已经发生逾期,一直没扣到,现在已经逾期1天,是怎么回事啊", "role": "robot"}], "label": "无还款诚意"}
{"call_id": "496c147977c7481aaa32e40f667ad3fd", "dialog": [{"text": "喂?是机主本人吗?借条", "role": "robot"}, {"text": "喂,你好。什么借条。", "role": "user"}, {"text": "不好意思,那您要是认识机主,麻烦您转告下他,借条找他,让她给我们借条回电,谢谢啊,再见", "role": "robot"}], "label": "不是本人"}
{"call_id": "2c72f0cf58474651b783139208c94b3e", "dialog": [{"text": "您好,这里是借条,您本期欠款已经逾期2天了,为了不影响您的正常使用,请您务必在今天晚上八点前归还欠款", "role": "robot"}, {"text": "喂,你好。我知道,我忙完了,我开着车呢,我明白我明白。", "role": "user"}], "label": "在忙"}
##带入参数后 json请求体示例:
{
"trace_id": "07364cee-8c6c-4fff-8709-6dbdd2f619db",
"call_id": "8cf170ea31c04bd5a8a9ef9d69226045",
"dialog": [{"text": "喂?是机主本人吗?借条", "role": "robot"}, {"text": "嗯。", "role": "user"}, {"text": "我看您在我们借条的借款已经发生逾期,一直没扣到,现在已经逾期1天,是怎么回事啊", "role": "robot"}]
}
这种 存在嵌套关系的json数据 通过csv是没办法的 因为 csv仅支持扁平化的参数
当然 可以通过 ‘用户参数’ 但是 如果有100条、1000条 甚至更多呢 这种方式变不可取了
解决办法:
思路:
1、把原数据当做请求头发送一个请求
2、利用正则在请求头中 提取想要的数据
3、通过forEach控制器和计数器对提取的参数进行遍历并发送请求
先来一张整体接口图(仅一次控制器不需要 需要使用的话 自行添加):
步骤一:
1、把原数据存放在一个txt文本或者json文件中 然后存放到jmeter的bin目录下(推荐txt,jsonp怕 正则取不到。 大佬的话就根据自己的喜好来就好啦)
2、测试计划线面 添加线程组、HTTP信息头管理器
3、通过函数助手 读取参数文件 并 写入HTTP信息头管理器中
4、线程组下面 随便创建一个请求 (我这里写的百度) 并添加查看结果树
添加-取样器-http请求;添加-监听器-查看结果树
运行 在请求-Request Headers中查看 原数据是否被成功引入
步骤二:
1、引用成功后 我们使用正则表达式进行数据提取**
添加-后置处理器-正则表达式提取器
添加-取样器-Debug Sampler(取样器)
选择:Request Headers
call_id正则:“call_id”: "(.?)"
dialog:正则:“dialog”: (.?), “label”:
正则验证:
清空 在运行一遍脚本 查看是否提取到全部数据
到此 想要的数据已经全部提取完成
步骤三:
3、使用提取的变量
添加-逻辑控制器-ForEach控制器
添加-配置原件-计数器(要添加在 ForEach控制器下面)
添加-取样器-http请求(真正要发送的请求)
ForEach控制器只支持一个变量作为输入,如果我们需要使用多个变量作为输入变量,怎么办呢?
其它变量我们可以用__V函数和__counter函数(或计数器)来生成Debug sampler中的变量,__V函数可以处理带有内嵌变量的值,而__counter函数则可以从1递增的生成数字,如果需要设置递增值 __counter函数是不支持的 这种情况可以使用计数器。
__V函数使用:函数助手
V函数 结合计数器写入参数位置
运行查看请求参数是否全部被正确引用:
踩坑:如果是post请求 传参一定是在消息体数据中 不要在参数里面 否则会urlEncode编码
到此 已解决完毕