Jmeter_循环获取请求接口的字段,并写入文件
通过JSON提取器、计数器、beanshell,循环读取邮箱接口的返回字段,筛选出flag为3的收件人,并写入csv文件。
1、调用接口,获取所有的邮件$.data.total.count;
2、beanshell后置处理total转换成页码,这里是227/20,由于Math.ceil没有向上取整,所以加一;
String total = vars.get("total");
int totals = Integer.parseInt(total);
// Math.ceil没有向上取整,所以+1
int total_num = (int)Math.ceil(totals / 20) + 1;
//log.info(total_num.toString());
vars.put("total_num",total_num.toString());
3、设置第一个循环控制器;
4、配置计数器,与循环控制器一起,起到翻页的作用;
5、调用指定页码的接口;
6、正则提取所有的mid,也可以JSON提取;
7、再次设置循环控制器,循环mid个数的次数;
8、再次配置计数器,获取指定的mid,比如mid_1...,mid_20;
9、获取不同的mid,调用接口;这里如果使用${__V(mid_${__counter(,)},)}的话,第一个循环(1-20)正常,第二个循环,counter从21开始,因mid不存在而接口请求失败,所以需要使用${__V(mid_${count},)};
10、beanshell处理返回的数据,首先将json转换,获取flag为3的收件人,并写入csv文件;
import java.io.*;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;
import java.io.BufferedWriter;
import java.io.FileWriter;
import org.apache.jmeter.services.FileServer;
//import java.util.Date;
//import java.text.SimpleDateFormat;
//
//SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
//String currentDate = dateFormat.format(new Date());
//vars.put("currentDate", currentDate);
// 获取文件路径,这里使用FileServer.getAbsolutePath()获取绝对路径以确保跨平台兼容性
String filePath = FileServer.getFileServer().getBaseDir() + "/sina001_.csv";
// 获取上个http请求返回的json数据
String jsonString = prev.getResponseDataAsString();
// 将json转为JSONObject
JSONObject obj = JSONObject.parseObject(jsonString);
// 拿到响应为true的请求
if(obj.getString("result").equals("true")){
// 提取json数组sendstatus
JSONArray rows =obj.getJSONObject("data").getJSONArray("sendstatus");
// 提取数组sendstatus中的flag
String flag = rows.get(0).get("flag").toString();
// flag=3表示发送失败
if(flag.equals("3")){
// 获取收件人的邮箱地址
String mailto = rows.get(0).get("mailto").toString();
// log.info(mailto);
try {
// 创建一个 FileWriter 对象,true 表示追加模式
FileWriter fstream = new FileWriter(filePath, true);
// 创建一个 BufferedWriter 对象
BufferedWriter out = new BufferedWriter(fstream);
// 替换提取值
String variableValue = mailto;
// 将变量值写入文件,并添加换行符
out.write(variableValue + "\r\n");
// 关闭 BufferedWriter 和 FileWriter
out.close();
fstream.close();
} catch (Exception e) {
log.error("Error occurred while writing to file: " + e.getMessage());
SampleResult.setSuccessful(false);
SampleResult.setResponseMessage("Failed to write to file: " + e.getMessage());
}
}
}
fastjson的下载地址:Central Repository: com/alibaba
截取返回的body中的中文,比如退信原因,收件人等信息:
可以通过subject来判断,当为系统退信时,才会提取body中的相关信息;
import java.io.*;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONArray;
import java.io.BufferedWriter;
import java.io.FileWriter;
import org.apache.jmeter.services.FileServer;
import java.util.Date;
import java.text.SimpleDateFormat;
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd_HHmm");
String currentDate = dateFormat.format(new Date());
//vars.put("currentDate", currentDate);
// 获取文件路径,这里使用FileServer.getAbsolutePath()获取绝对路径以确保跨平台兼容性
String filePath = FileServer.getFileServer().getBaseDir() + "/sina001_detail_" + currentDate + ".csv";
// 获取上个http请求返回的json数据
String jsonString = prev.getResponseDataAsString();
// 将json转为JSONObject
JSONObject obj = JSONObject.parseObject(jsonString);
String subject = obj.get("data").get("subject").toString();
//log.info(subject.length().toString());
// "subject": "系统退信",字符长度为4
if(subject.length() == 4){
String body = obj.get("data").get("body").toString();
String[] body1 = body.split("<br/>");
//for(int i=0;i<body1.length;i++){
// log.info(body1[i]);
// }
try {
// 创建一个 FileWriter 对象,true 表示追加模式
FileWriter fstream = new FileWriter(filePath, true);
// 创建一个 BufferedWriter 对象
BufferedWriter out = new BufferedWriter(fstream);
// 替换提取值
String variableValue = body1[5] + "," + body1[6];
// 将变量值写入文件,并添加换行符
out.write(variableValue + "\r\n");
// 关闭 BufferedWriter 和 FileWriter
out.close();
fstream.close();
} catch (Exception e) {
log.error("Error occurred while writing to file: " + e.getMessage());
SampleResult.setSuccessful(false);
SampleResult.setResponseMessage("Failed to write to file: " + e.getMessage());
}
}