1.安装jmeter GUI图形界面
需要安装JDK
官方网址: Apache JMeter - Apache JMeter™
linux tgz windows zip
2. 目录及文件
bin: 核心可执行文件,包含配置
extras:插件扩展包
lib:核心依赖包
ext:核心包
junit:单元测试包
3. 准备一个API接口测试
/**
* JMeterHttpController
*
* @author joker
* @version 1.0
* 2022/11/1 15:55
**/
@Slf4j
@RestController
@CrossOrigin
@Api(tags = "jmeter测试")
public class JMeterHttpController {
@ApiOperation("名称列表")
@GetMapping("/listName")
public Result<List<String>> listName(){
log.info("http listName Api request...");
ArrayList<String> arrayList = Lists.newArrayList();
arrayList.add("张三");
arrayList.add("李四");
arrayList.add("王五");
return Result.success(arrayList);
}
}
使用浏览器地址栏模拟访问
添加一个线程组:
线程数: 虚拟用户数,一个虚拟用户占用一个进程或线程
Ramp-Up: 准备时长, 全部线程启动的时长 比如100个线程,20秒,则表示20秒内100个线程都要完成启动,每秒启动5个线程
循环次数:每个线程发送的次数,例如值为5,100个线程,则会发送500次请求,可选永久循环
一个线程组下可以增加多个sampler
查看测试结果,添加结果数
断言基本使用:
以响应断言为例子
测试字段:
响应文本: 即响应的数据,比如json文本
响应代码: http的响应状态码,如200 400 404
响应信息:http响应代码对应的响应信息,例如OK,Found
响应头: response header
模糊匹配规则:
包含:包含在里面则成功
匹配:响应内容完全匹配,不区分大小写
断言失败会变成红色, 请求成功-断言失败
失败原因 同 断言自定义失败消息
4.压测结果聚合报告:
lable: sample名称,可以看出接口名称
samples:总共发送多少个请求
average:平均响应时间
median:中位数,50%的用户都是这个响应时间
90%line:90%的用户响应时间不会超过这个值
...
min:最小响应时间
max:最大响应时间
error%: 错误率 错误的请求总数 / 请求总数
Throughput:吞吐量,可以理解为qps
KB/Sec:每秒接收数据量
5.压测脚本JMX:
待补充
6.用户自定义变量:
可以一处定义,多处使用
应用方式${xxx},在接口中使用,也可当参数传递
7.CSV可变参数:
准备api接口
@ApiOperation("指定字符长度")
@GetMapping("/nameLength")
public Result<List<String>> nameLength(String name){
log.info("http nameLength Api request...");
ArrayList<String> arrayList = Lists.newArrayList();
arrayList.add(name);
arrayList.add(String.valueOf(name.length()));
return Result.success(arrayList);
}
准备csv数据(默认以逗号分割)
添加CSV配置
指定具体的csv文件,自定义设置变量名
变量名替换固定值
查看结果树,请求参数使用的csv文件中的数据
多参数情况
@ApiOperation("指定两个字符长度")
@GetMapping("/nameTwoLength")
public Result<List<String>> nameTwoLength(String name, String nameTwo){
log.info("http nameTwoLength Api request...");
ArrayList<String> arrayList = Lists.newArrayList();
arrayList.add(name);
arrayList.add(String.valueOf(name.length()));
arrayList.add(nameTwo);
arrayList.add(String.valueOf(nameTwo.length()));
return Result.success(arrayList);
}
准备数据