4、压测脚本设计:参数化、关联、断言、思考时间的设置技巧
脚本设计这事儿,说白了就是让压测工具模拟出「真人操作」的感觉。我见过太多团队,脚本写得跟机器人念稿似的——每个用户发同样的请求、拿同样的数据、连停顿都一模一样。这种压测结果,你敢信?
今天咱们就聊聊脚本设计的四个核心技巧:参数化、关联、断言、思考时间。嗯,一个一个来。
4.1 参数化:别让所有用户都用同一个账号
先问个问题:你压测登录接口时,1000个并发用户都用同一个账号?
那结果肯定好看——因为服务端有缓存啊!第一个用户登录后,后续的请求全走缓存了。这测出来的TPS能信吗?
参数化就是解决这个问题的。它让每个虚拟用户使用不同的数据,模拟真实场景。
常见的参数化方式
| 方式 | 说明 | 适用场景 |
|---|---|---|
| CSV文件 | 从外部文件读取数据 | 大量用户、数据可预知 |
| 计数器 | 自动生成递增序列 | 用户ID、订单号 |
| 随机函数 | 生成随机字符串/数字 | 手机号、邮箱 |
| 数据库查询 | 从数据库动态获取 | 实时数据、复杂关联 |
参数化实战:JMeter CSV Data Set Config
// CSV文件内容(users.csv)
user001,pass001
user002,pass002
user003,pass003
...
// JMeter配置步骤
1. 添加「CSV Data Set Config」
2. 文件名:users.csv
3. 变量名称:username,password
4. 共享模式:所有线程(All Threads)
5. 在请求中使用 ${username} 和 ${password}
4.2 关联:把上一个请求的结果传给下一个
很多业务场景是链式的:先登录拿到token,再用token去查询订单。这个token就是「关联数据」。
说白了,关联就是从上一个响应里提取某个值,存起来,供下一个请求使用。
关联的三种常用方法
- 正则表达式提取器:最灵活,适合各种文本格式
- JSON提取器:专门处理JSON响应,简单直观
- XPath提取器:处理XML响应时用
实战:提取登录返回的token
// 登录接口返回的JSON
{
"code": 0,
"data": {
"token": "abc123xyz",
"userId": 10086
}
}
// JMeter JSON提取器配置
1. 在登录请求下添加「JSON提取器」
2. 变量名称:myToken
3. JSON表达式:$.data.token
4. 匹配编号:1
// 在后续请求中使用
Authorization: Bearer ${myToken}
避坑指南:我曾经遇到一个坑——token有有效期。登录后拿到的token,5分钟就过期了。但我的压测脚本跑30分钟。结果5分钟后所有请求都返回401。解决方案:在脚本里加个循环,每4分钟重新登录一次,更新token。
4.3 断言:别让错误数据混进结果里
你压测了1万次请求,TPS显示500。但仔细一看,其中3000次返回的是「系统繁忙」的错误页面。这TPS还有意义吗?
断言就是用来判断请求是否成功的。它帮你过滤掉无效数据,只统计真正的成功请求。
常用的断言类型
| 断言类型 | 检查内容 | 示例 |
|---|---|---|
| 响应文本 | 检查响应体是否包含特定字符串 | 检查是否包含"success" |
| 响应代码 | 检查HTTP状态码 | 期望200,实际500则失败 |
| 响应头 | 检查响应头字段 | 检查Content-Type |
| JSON断言 | 检查JSON字段值 | 检查code是否为0 |
| 持续时间 | 检查响应时间是否超时 | 超过3秒标记为失败 |
断言的最佳实践
// 不好的断言(太宽松)
响应文本包含 "200" // 可能匹配到其他内容
// 好的断言(精确)
JSON断言:$.code == 0
响应文本包含 "\"status\":\"success\""
// 更严谨的做法
1. 先断言HTTP状态码为200
2. 再断言业务code为0
3. 最后断言响应时间小于3秒
4.4 思考时间:让压测更像真人操作
真人操作网页时,会看内容、想问题、点按钮。这个过程需要时间。这个时间就是思考时间。
没有思考时间的压测,就像让1000个人同时狂点鼠标。服务器压力确实大,但这不是真实场景。
思考时间的设置策略
| 场景 | 思考时间 | 说明 |
|---|---|---|
| 登录页面 | 1-3秒 | 用户输入账号密码需要时间 |
| 查询列表 | 2-5秒 | 用户浏览列表内容 |
| 提交表单 | 3-8秒 | 用户填写信息、确认 |
| 支付确认 | 5-15秒 | 用户犹豫、确认支付 |
JMeter中实现思考时间
// 使用「固定定时器」
1. 在请求之间添加「固定定时器」
2. 设置延迟时间:3000(毫秒)
3. 所有用户都会等待3秒
// 使用「均匀随机定时器」(更真实)
1. 添加「均匀随机定时器」
2. 随机延迟范围:2000-5000(毫秒)
3. 每个用户的等待时间不同,更接近真实
4.5 知识体系总览
下面这张图,把脚本设计的四个核心技巧串起来了。你可以看到它们在整个压测流程中的位置和作用。
4.6 综合实战:一个完整的脚本示例
最后,咱们看一个完整的脚本设计思路。假设你要压测一个电商系统的下单流程。
// 步骤1:登录(参数化 + 断言)
- 参数化:从CSV读取不同账号
- 关联:提取返回的token
- 断言:检查code=0
- 思考时间:1-3秒
// 步骤2:查询商品列表(关联 + 断言)
- 关联:使用上一步的token
- 关联:提取第一个商品的ID
- 断言:检查返回商品列表不为空
- 思考时间:2-5秒
// 步骤3:添加购物车(断言)
- 关联:使用token和商品ID
- 断言:检查添加成功
- 思考时间:1-2秒
// 步骤4:提交订单(断言)
- 关联:使用token
- 断言:检查订单创建成功,提取订单号
- 思考时间:3-8秒
// 步骤5:支付(断言)
- 关联:使用token和订单号
- 断言:检查支付成功
- 思考时间:5-10秒
总结一下:脚本设计不是技术活,而是「模拟活」。你越了解真实用户怎么操作,脚本就设计得越好。参数化让数据真实,关联让流程连贯,断言让结果可信,思考时间让压力合理。这四个技巧用好了,压测结果才有参考价值。
嗯,今天就聊到这儿。脚本设计这块,多练几次就有感觉了。