07 JMeter 接口测试 - 性能与功能测试的结合
🎯 本章目标:掌握JMeter的安装配置、接口测试脚本编写、性能测试执行,理解JMeter在接口测试中的应用。
7.1 JMeter 简介
什么是JMeter
Apache JMeter 是一款开源的Java应用程序,最初为Web应用性能测试设计,现支持HTTP、FTP、数据库、消息队列等多种协议的测试。
JMeter能做什么
- 接口功能测试
- 接口性能测试
- 压力测试
- 负载测试
- 数据库测试
- 消息队列测试
为什么选择JMeter
- 开源免费:Apache开源项目
- 功能强大:支持多种协议和场景
- 扩展性好:丰富的插件生态
- 报告丰富:多种图表和报告格式
7.2 安装与配置
安装要求
- Java 8或更高版本
- 下载地址:https://jmeter.apache.org/download_jmeter.cgi
启动方式
bash
# Windows
bin/jmeter.bat
# macOS/Linux
bin/jmeter.sh
# 命令行模式(无GUI)
bin/jmeter.sh -n -t test.jmx -l result.jtl
7.3 JMeter 界面导览
- 菜单栏
- 工具栏
- 左侧面板:测试计划树
- 右侧面板:配置区域
核心组件
| 组件 | 作用 | 类比 |
|---|---|---|
| 测试计划 | 测试的顶层容器 | 项目 |
| 线程组 | 定义虚拟用户 | 用户组 |
| 取样器 | 发送具体请求 | 用户操作 |
| 断言 | 验证响应结果 | 检查点 |
| 监听器 | 查看结果 | 报告 |
| 配置元件 | 请求配置 | 设置 |
| 前置处理器 | 请求前处理 | 准备 |
| 后置处理器 | 响应后处理 | 提取 |
7.4 创建第一个接口测试
步骤
- 添加线程组:右键测试计划 → 添加 → 线程 → 线程组,设置线程数:1,Ramp-Up时间:1,循环次数:1
- 添加HTTP请求:右键线程组 → 添加 → 取样器 → HTTP请求,协议:https,服务器名称:jsonplaceholder.typicode.com,方法:GET,路径:/posts/1
- 添加监听器:右键线程组 → 添加 → 监听器 → 查看结果树
- 运行测试:点击工具栏绿色运行按钮
测试结果
Thread Name: 线程组 1-1
Sample Start: 2024-01-01 00:00:00 CST
Load time: 234
Connect Time: 45
Latency: 234
Size in bytes: 456
Response code: 200
Response message: OK
7.5 HTTP请求配置详解
基本配置
- 协议: http/https
- 服务器名称/IP
- 端口号
- 方法: GET/POST/PUT/DELETE
- 路径
- 参数/Body数据
POST请求示例
HTTP请求配置:协议 https,服务器名称 api.example.com,方法 POST,路径 /api/login,Body Data 传 JSON 数据,HTTP信息头管理器设置 Content-Type: application/json
常用配置元件
| 配置元件 | 用途 |
|---|---|
| HTTP请求默认值 | 统一设置协议、服务器、端口 |
| HTTP信息头管理器 | 设置请求头 |
| HTTP Cookie管理器 | 自动处理Cookie |
| CSV数据文件设置 | 数据驱动测试 |
| 用户定义的变量 | 定义全局变量 |
7.6 断言
响应断言
验证响应中是否包含指定内容:要测试的响应字段选择"响应文本",模式匹配规则选择"包含",要测试的模式填写 "success"
JSON断言
验证JSON字段值:JSON Path 填写 $.code,Expected value 填写 0,验证方式选择"等于"
断言类型对比
| 断言类型 | 适用场景 |
|---|---|
| 响应断言 | 验证响应文本内容 |
| JSON断言 | 验证JSON字段值 |
| 持续时间断言 | 验证响应时间 |
| 大小断言 | 验证响应大小 |
| XPath断言 | 验证XML内容 |
7.7 参数化与数据驱动
CSV数据文件设置
数据文件(users.csv):
username,password,expectedCode
admin,123456,0
admin,wrong,1001
test,123,1002
JMeter配置:
- 添加 → 配置元件 → CSV数据文件设置
- 文件名:users.csv
- 变量名称:username,password,expectedCode
- 在HTTP请求中使用:username、password 变量
用户定义的变量
用户定义的变量
├── baseUrl: https://api.example.com
├── timeout: 30000
└── version: v1
使用:baseUrl、timeout 变量
7.8 接口关联
正则表达式提取器
从响应中提取token:引用名称 authToken,正则表达式 "token":"(.+?)",模板 1,匹配数字 1
JSON提取器
从JSON响应中提取字段:名称 userId,JSON Path表达式 $.data.id,默认值 NOT_FOUND
关联流程
- JMeter发送 POST /login
- API返回 token 信息
- 后置处理器提取token
- JMeter发送 GET /users 携带token
- API返回用户列表
7.9 性能测试基础
线程组配置
线程组
├── 线程数(用户): 100 ← 并发用户数
├── Ramp-Up时间(秒): 10 ← 10秒内启动100个用户
├── 循环次数: 10 ← 每个用户执行10次
└── 持续时间(秒): 60 ← 测试持续60秒
性能指标
| 指标 | 说明 | 合格标准 |
|---|---|---|
| 响应时间 | 从发送到收到响应的时间 | < 500ms |
| 吞吐量 | 每秒处理的请求数 | 根据业务需求 |
| 错误率 | 失败请求占比 | < 0.1% |
| 并发数 | 同时在线用户数 | 根据业务需求 |
| CPU/内存 | 服务器资源使用 | < 80% |
监听器
| 监听器 | 用途 |
|---|---|
| 查看结果树 | 查看每个请求的详细结果 |
| 聚合报告 | 统计汇总数据 |
| 图形结果 | 响应时间趋势图 |
| 响应断言 | 验证响应正确性 |
7.10 命令行运行
无GUI模式
bash
# 基本命令
jmeter -n -t test.jmx -l result.jtl
# 参数说明
-n: 非GUI模式
-t: 指定jmx文件
-l: 指定结果文件
-e: 测试结束后生成报告
-o: 指定报告输出目录
# 完整示例
jmeter -n -t api_test.jmx -l result.jtl -e -o report
分布式测试
bash
# 启动远程服务器
jmeter-server -Djava.rmi.server.hostname=192.168.1.100
# 控制机执行
jmeter -n -t test.jmx -R 192.168.1.100,192.168.1.101
7.11 JMeter 最佳实践
脚本规范
- 命名规范:中文/英文统一、见名知意
- 模块化设计:使用测试片段、模块控制器
- 参数化:CSV数据驱动、变量管理
- 断言完善:每个请求都有断言
- 报告生成:自动生成HTML报告
注意事项
- GUI模式仅用于调试,正式测试用命令行
- 禁用不必要的监听器,减少资源消耗
- 使用断言验证结果,不要只看状态码
- 合理设置Ramp-Up时间,避免瞬间高压
- 定期清理结果文件,防止磁盘占满
7.12 本章小结
JMeter核心流程
- 测试计划:线程组配置、用户数量、执行策略
- 取样器:HTTP请求、参数配置、Body数据
- 断言:响应断言、JSON断言、持续时间断言
- 参数化:CSV数据文件、用户定义变量、函数助手
- 关联:正则提取、JSON提取、XPath提取
- 报告:聚合报告、HTML报告、命令行执行
课后练习 📝
- 基础题:用JMeter创建一个测试计划,测试 jsonplaceholder.typicode.com/posts 接口。
- 进阶题:实现登录→获取用户列表的关联测试,使用正则表达式提取token。
- 挑战题:设计一个压力测试场景,100用户并发访问接口,持续5分钟,生成HTML报告。
7.13 下章预告
下一章我们将了解其他接口测试工具,如Insomnia、Hoppscotch、Apifox等。
"JMeter是接口性能测试的利器,掌握它,你就能量化评估系统的承载能力。"