免费开源的接口:知乎日报(APP)API接口文档;适合初学者用来做接口测试、压力测试。
1. 右键添加线程组
2.设置线程数
线程数:指JMeter测试计划中配置的虚拟用户(Virtual Users)数量。每个线程独立执行测试计划中定义的操作(如发送HTTP请求),模拟一个真实用户的行为。
例如:设置线程数为100,表示模拟100个用户同时操作。
| 低并发测试 | 10 | 1 | 1 | 10个用户立即启动,执行1次 |
| 线性增加压力 | 100 | 100 | 10 | 100秒内启动100用户,每个用户执行10次 |
| 持续压力测试 | 50 | 10 | Forever | 10秒内启动50用户,持续运行直到手动停止 |
注意:JMeter的线程数 != 绝对并发数!
原因:JMeter线程是顺序执行测试计划中的操作(如HTTP请求),若请求之间有等待时间(如定时器),则实际并发量会低于线程数。
3. 前置处理器(JSR223预处理器),编写一个当天时间的脚本,并使用在接口中;示例代码如下:
var currentDate = new Date();
var year = currentDate.getFullYear();
var month = currentDate.getMonth() + 1;
var day = currentDate.getDate();
function padZero(number, length) {
var str = number.toString();
while (str.length < length) {
str = '0' + str;
}
return str;
}
var formattedMonth = padZero(month, 2);
var formattedDay = padZero(day, 2);
var formattedDate = year + formattedMonth + formattedDay;
vars.put("date", formattedDate);
log.info("这是一条信息级别的日志,前置处理器date: " + formattedDate);
4. 获取脚本中写的时间${date},并传参数据给接口
5.查看结果数
6. 添加后置处理器获取指定id并使用到下个接口中
//获取接口返回的结果
var responseData = prev.getResponseDataAsString();
var jsonResponse = JSON.parse(responseData);
log.info("storyid: " + jsonResponse.stories[0].id);
vars.put("storyid", jsonResponse.stories[0].id); //用于指定id查询日报详情
7. 传了指定的id到接口中,并发送请求
8. csv文件的使用
1. 接口返回的数组对象里面有多个id,把返回的id存到csv文件中,添加后置处理器,示例代码如下:
// 获取接口返回结果
var responseData = prev.getResponseDataAsString();
var jsonResponse = JSON.parse(responseData);
// 提取所有story ID到数组
var storyIds = [];
jsonResponse.stories.forEach(function(story) {
storyIds.push(story.id);
});
log.info("提取的Story IDs: " + storyIds.join(","));
// 确保目录存在
var csvDir = new java.io.File("D:/jmeter_results");
if (!csvDir.exists()) {
csvDir.mkdirs();
}
// 写入CSV文件
try {
var csvPath = "D:/jmeter_results/storyIds.csv";
var csvFile = new java.io.File(csvPath);
// 创建文件(如果不存在)
if (!csvFile.exists()) {
csvFile.createNewFile();
log.info("创建CSV文件: " + csvPath);
}
// 使用缓冲写入器
var writer = new java.io.BufferedWriter(
new java.io.FileWriter(csvFile, true) // true=追加模式
);
// 如果是新文件,写入表头
// if (csvFile.length() === 0) {
//// writer.write("StoryID");
// writer.newLine();
// }
// 写入所有story ID
storyIds.forEach(function(id) {
writer.write(id.toString());
writer.newLine();
});
writer.close();
log.info("成功写入 " + storyIds.length + " 个StoryID到: " + csvPath);
// 将ID列表存入JMeter变量
vars.put("allStoryIds", storyIds.join(","));
} catch (e) {
log.error("CSV写入错误: " + e);
}
2. 读取csv文件中的id
9. 添加同步定时器,同步定时器(Synchronizing Timer)是JMeter中的一个特殊定时器,用于模拟并发用户同时发起请求的场景。它的主要作用是阻塞线程,直到满足特定条件后才同时释放所有线程,使它们在同一时刻发送请求。
- 配置:并发数=50,超时时间=0
- 效果:只有当有50个线程到达定时器时,才会同时释放这50个线程
- 性能影响:同步定时器会阻塞线程,可能影响测试结果的准确性
- 超时设置:必须设置合理的超时时间,避免测试无限期等待
- 线程数配置:确保线程组的线程数 ≥ 同步定时器的并发数,否则可能永远无法满足条件
- 资源消耗:大量线程同时发送请求可能会对被测系统造成巨大压力
- 调试困难:由于线程同步,调试时可能难以观察单个请求的行为