场景:
1、调用/list
接口返回json对象列表,返回参数结构如下
{
"count":0,
"content":[
{
"id":1,
"name":"aaa",
"status":"new",
"description":"xx",
"version":"1",
"_token":"dadakda-adaad_dada"
},
{
"id":2,
"name":"bbbb",
"status":"new",
"description":null,
"version":"1",
"_token":"dadasv_34f_aa"
}
]
}
2、调用数据编辑接口/edit
循环编辑上述列表查询接口查询到的数据,content
中的数组,由于edit
为保证幂等性和数据安全,参数中需要包含/list
接口中查询出来的最新的version
和_token
,所以参数必须基于上一个接口的查询结果。
jmeter脚本编写:
1、通过json提取器提取出/list
接口中content
下的每一个json对象
Names of created variables: 提取出的数据存储的变量名
JSON Path expressions: 提取的位置,括号中的*
代表提取列表中所有的数据
ps:据说这两个参数可以提取多个值,但我没有成功
Match N0.(0 for Random):0代表随机匹配,n代表匹配第n个,-1代表匹配所有
ps:说实在的没搞懂这个参数什么意思,填个-1保险一点
2、ForEach循环取到的json对象,并调用编辑接口
3、对象处理,在原数据的基础上修改需要编辑的字段
处理json需要一个工具,这里用的阿里的fastJson,将用到的第三方jar包放在jmeter的lib/ext
目录下
4、编写脚本处理参数
这里在调用/edit
接口前,是用了个BeanShell预处理程序,写的是个java脚本
import com.alibaba.fastjson.JSONObject;
//log.info("hello");
String jsonDataStr = vars.get("lineData");
//log.info(jsonDataStr);
JSONObject jsonData = JSONObject.parseObject(jsonDataStr);
// 将json中的参数拆开来单独存储在jmeter变量中
// 为什么不直接使用lineData这个对象呢,因为使用这个接口内部会报一个utf-8转码的报错,就干脆把参数拆开好了
// 修改状态为pending
vars.put("status","pending");
// 下列数据不做修改
// 这里转成String是因为vars里只能存数字的话会报错
vars.put("id",String.valueOf(jsonData.get("id")));
vars.put("name",jsonData.get("name"));
vars.put("version",String.valueOf(jsonData.get("version")));
vars.put("_token",jsonData.get("_token"));
// 如果有会为空的字段需要转成空字符串,否则参数为空的话在使用改参数的地方并不会传空值,而是会直接使用这个参数的参数字符串,即"${description}"不会被替换为null而是会直接使用"${description}"
vars.put("description",jsonData.get("description")==null?:"",jsonData.get("description"));
5、调用/edit
接口,参数填“消息体数据”
{
"id":"${id}",
"name":"${name}",
"status":"${status}",
"description":"${description}",
"version":"${version}",
"_token":"${_token}"
}
6、完结撒花