背景
隔壁项目组同事找到我,说想要使用JMeter调用接口批量跑一批数据,数据量大概10万,接口的请求体和响应体如下,要求将响应状态码为1000的deviceId保存到本地。这里需要思考的问题是,如何将POST请求中请求体参数值提取出来并保存?在这里记录我当时给出的方案。
请求体:
{
"deviceId": "12345678901234567890",
"eventType": 1
}
响应体:
{
"code": 1000,
"data": {
"alarmType": 1,
"status": 0
},
"message": "success"
}
操作步骤
1.添加一个CSV 数据文件设置元件
将10万个deviceId存储到本地csv文件,接口调用时,从本地读取请求参数值。
CSV文件配置如下:
2.添加一个HTTP请求录入接口请求信息
请求参数值从csv文件读取,配置如下:
3.添加一个JSON提取器,提取响应状态码
JSON提取器配置如下:
4.添加一个调试取样器,运行并查看提取结果
5.添加一个BeanShell后置处理程序,编写脚本
可以使用log.info()将日志打印出来,在控制台查看是否正确
脚本如下:
import java.net.URLDecoder;
import org.json.*;
import java.io.BufferedWriter;
import java.io.FileWriter;
String statusCode=vars.get("code"); //获取JSON提取器提取到的参数值
int code= Integer.parseInt(statusCode); //jmeter内部变量都是String类型,需要强转
log.info("状态码为:"+code); //用于调试,打印日志
String samplerData = prev.queryString; // 只取post data 数据
JSONObject requestBody=new JSONObject(samplerData); //获取请求体
String subData = requestBody.get("deviceId").toString(); // 获取deviceCode的value值
String deviceCode = URLDecoder.decode(subData,"utf-8"); //避免中文乱码
log.info("设备编码为:"+subData); //用于调试,打印日志
FileWriter fstream =null;
BufferedWriter out =null;
if(code==1000){
try {
fstream = new FileWriter("F:\\device.csv",true); //写入csv文件,路径下无文件时自动创建
out = new BufferedWriter(fstream);
out.write(deviceCode+"\n"); //写入的数据
} catch (IOException e) {
e.printStackTrace();
}
finally{
try {
if(out!=null){
out.close(); //关闭资源
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if(fstream!=null){
fstream.close(); //关闭资源
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
6.执行脚本,查看保存到csv文件的数据
7.在线程组中设置相应的线程数
通过前面1-6步操作调通了脚本,就可以设置线程组批量跑这十万数据啦,线程组设置如下: