一、安装
1.下载JMeter
https://jmeter.apache.org/download_jmeter.cgi
下载安装文件到本地
2.安装JDK
https://www.oracle.com/java/technologies/downloads/
3.切换中文
- 进入bin文件夹
- 打开jmeter.properties
#language=en
下增加#language=zh_CN
二、使用
1.进入安装文件夹 -> bin文件夹
2.点击jmeter.bat(windows)
三、脚本录制
1.打开JMeter图形界面
2.新建线程组
- 选中Test Plan,Add -> Threads(线程) -> Thread Group(线程组)
3.新增HTTP代理服务器
- 选中Test Plan,Add -> Non-Test Elements(非测试元件) -> HTTP(s) Test Script Recorder(HTTP代理服务器)
- 点击【HTTP(s) Test Script Recorder】,查看端口号
4. 新增录制控制器
- 选中Thread Group(线程组),Add -> Logic Controller(逻辑控制器) -> Recording Controller(录制控制器)
5.安装证书
- 进入bin文件夹
- 双击【ApacheJMeterTemporaryRootCA.crt】
- 根据安装引导,把证书存储到【受信任的根证书颁发机构】下
6.浏览器添加代理
- chrome浏览器安装SwitchyOmega插件,用于管理代理
- SwitchyOmega插件设置:
- 新建情景模式,勾选代理服务器
- 代理服务器填入127.0.0.1,端口号为8888(代理服务器端口号)
7.启动代理服务器
- 点击【HTTP(s) Test Script Recorder】下的【start】
8.查看录制的请求
- 请求在Recording Controller(录制控制器)下
9.请求筛选
- 进入HTTP代理服务器
- Requests Filtering
- 包含模式添加想选取的域名等(使用正则表达式)
- URL Pattern to Include(包含模式)
- Add
.*baidu.com
- 排除模式添加想过滤的域名等(使用正则表达式)
- URL Pattern to Exclude(排除模式)
- Add
.*\.(js|css|woff|jpg).*
10. 停止录制
11.添加 察看结果树,查看请求的返回内容
- 选中线程组,Add -> Listener(监听器) -> View Results tree(察看结果树)
12.屏蔽部分录制的部分请求
- 选中要屏蔽的请求后,点击 工具栏的【Toggle(切换)】
13.再次运行录制的请求
- 进入 察看结果树
- 点击 工具栏的【Start(开始)】
- 在 察看结果树 可以看到返回内容
四、压力测试
1.新增线程组
- 选中Tset Plan,Add -> 线程 -> 线程组
2.新增HTTP请求
- 选中线程组,Add -> Sampler(取样器) -> HTTP Request(HTTP请求)
3.填写web服务器信息
- 进入 HTTP请求 页面
- 填写web服务器的 【协议】 【服务器名称】 【路径】等
4.添加 察看结果树
- 选中线程组,Add -> 监听器 -> 察看结果树
5.查看返回结果
- 点击【开始】,在 察看结果树 查看返回结果
6.跑多个线程
- 进入 线程组
- 修改 线程数
- 修改循环次数
- 循环执行
- 勾选Infinite(永远)
- 设置循环时长
- 勾选 Specify Thread lifetime(调度器)
- Duration(seconds)(持续时间) 设置时长
7.添加聚合报告
- 选中 线程组,Add -> Listener(监听器) -> Aggregate Report(聚合报告)
8.聚合报告数据
- Label:每个 JMeter 的 element(例如 HTTP Request)都有一个 Name 属性,这里显示的就是 Name 属性的值
- Samples(样本):表示这次测试中一共发出了多少个请求
- Average(平均值):平均响应时间——默认情况下是单个 Request 的平均响应时间(单位ms),当使用了 Transaction Controller 时,也可以以Transaction 为单位显示平均响应时间(应该为单个线程时间)
- Median:中位数,也就是 50% 用户的响应时间
- 90% Line:90% 用户的响应时间l
- Min:最小响应时间
- Max:最大响应时间
- Error%(异常):本次测试中出现错误的请求的数量/请求的总数
- Throughput(吞吐量):默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction Controller 时,也可以表示类似 LoadRunner 的 Transaction per Second 数
- 接收KB/Sec:每秒从服务器端接收到的数据量,相当于LoadRunner中的Throughput/Sec
9.TPS计算公式
(1/Average)*1000*线程数
10.teardown线程组
- 选中测试计划,Add -> Threads -> tearDown Thread Group
- 最后执行的线程组
11.setUP线程组
- 选中测试计划,Add -> Threads -> setUp Thread Group
- 最新执行的线程组
五、分布式压力测试
1.Slave节点
-
关闭服务器的SSL(因为测试在局域网内,不需要ssl)
- 在服务器A打开apache-jmeter-5.4.3\bin下的jmeter.properties
- 修改
server.rmi.ssl.disable=true
-
修改hostname为本机地址(如果有多个网卡,不指定hostname会报错)
- 在服务器A打开apache-jmeter-5.4.3\bin下的system.properties
java.rmi.server.hostname=192.168.2.1
-
运行jmeter-server
2.Master节点
- 端口 udp 4445
- 添加负载机IP
- 打开jmeter.properties
- remote_hosts=192.168.2.1,192.168.2.2 ( Slave节点的ip地址)
- 关闭SSL
- 打开jmeter.properties
- server.rmi.ssl.disable=true
- 运行jmeter
- 设置test plan 线程组
- 点击【运行】-【远程启动所有】
六、性能测试指标
1.每秒请求数 QPS
2.请求响应时间(最大、最小、平均)
3.错误率
4.机器性能 CPU idle 30%、内存memory无剧烈抖动或飙升
5.压测过程接口功能是否正常
6.压测过程
- 环境检查:记录机器参数
- 起压:根据被压情况,调节并发量到合适的情况
- 查看记录各项性能指标
1. nginx日志查看每秒请求数
2. 查看nginx错误请求
3. 查看机器参数: cpu idle、men等
4. 查看db、cache等数据是否写入正常
5. 访问接口,查看功能是否正常
七、实战
1.访问接口
2.使用前置处理器动态生成参数
- 1.选中线程组
- 2.add -> Pre Processors-> JSR223 PreProcessor
- 3.添加脚本
import java.util.Random;
String phone_pre = '171';
Random random = new Random();
int rand01 = random.nextInt(10);
int rand02 = random.nextInt(10);
String timestamp = System.currentTimeMillis().toString();
String phone_end = rand01.toString() + timestamp.substring(7) + rand02.toString();
vars.put('phone_num',phone_pre+phone_end);
3.创建HTTP Request Defaults,统一设置ip地址
- 选中线程组
- ADD -> config Element(配置元件) -> HTTP Request Defaults(HTTP请求默认值)
- 填入协议、ip地址等
4.设置CSV Data Set Config,数据驱动
- 创建
5.访问第二个接口
6.从上一个接口获取参数传递给第二个接口(验证码)
- 选择第一个接口的HTTP Requeest Defaults
- ADD -> POST Processors(后置处理器) -> JSON Extractor(JSON提取器)
- Names of created variables 输入 auth_code
- JSON Path expressions 输入 .data
7.创建全局的用户变量(批量生成用户名)
- 点击进入 test plan 测试计划
- 在【用户定义的变量】ADD增加参数 user_prefix ,值设置为input_name
8.使用counter的方式去变量赋值
- 选中线程组
- ADD -> config element -> Counter
- 设置区间
- 【Exported Variable Name】 设置为user_id
9.第二个接口创建参数
- 参数名 username
- 值 ${user_prefix}${user_id}
10.对接口返回值进行验证
- 选中HTTP Request
- ADD -> Assertion -> JSON Assertion
- Assert JSON Path exists 输入 $.code
- Expected Value 输入200
- 勾选 Additionally assert value
11.解析token
- ADD -> POST Processors -> JSON Extractor
- Names of created variables 输入 【token】
- JSON Path expressions 输入 【.data.token】