小牛丨软件测试学习小牛丨软件测试学习
首页
  • 业务测试面试题
  • 数据库测试面试题
  • Linux测试环境面试题
  • 网络协议测试面试题
  • 中间件测试面试题
  • Java测试开发面试题
  • Python测试开发面试题
  • Python自动化面试题
  • Java自动化面试题
  • 性能测试面试题
  • 手撕代码
  • HR面试题
  • 系列总入口
  • 业务测试理论
  • 数据库测试
  • Linux测试环境
  • 网络协议
  • 中间件测试
  • Python编程
  • Java编程
  • 自动化测试
  • 性能测试
  • AI测试
  • HR面试
  • AI测试学习路线
  • AI测试基础面试题
  • 大模型测试面试题
  • AI自动化测开面试题
  • AI Agent测试面试题
  • AI性能与稳定性测试面试题
  • AI应用安全测试面试题
  • 互联网大厂面试真题
  • 互联网中厂面试真题
  • 手机厂商面试真题
  • 通信厂商面试真题
  • 新能源汽车面试真题
  • 银行金融面试真题
  • 项目说明
  • 电商接口文档
  • 实战项目总入口
  • 测试简历编写指南
  • 20K level 简历打磨指南
  • 测试简历模板参考
  • 简历常见问题与避坑
  • 零基础入行专题路径
  • 初中级进阶高级专题路径
  • 零基础小白入行软件测试保姆级学习路线
  • 初中级测试进阶高级测试全路线
首页
  • 业务测试面试题
  • 数据库测试面试题
  • Linux测试环境面试题
  • 网络协议测试面试题
  • 中间件测试面试题
  • Java测试开发面试题
  • Python测试开发面试题
  • Python自动化面试题
  • Java自动化面试题
  • 性能测试面试题
  • 手撕代码
  • HR面试题
  • 系列总入口
  • 业务测试理论
  • 数据库测试
  • Linux测试环境
  • 网络协议
  • 中间件测试
  • Python编程
  • Java编程
  • 自动化测试
  • 性能测试
  • AI测试
  • HR面试
  • AI测试学习路线
  • AI测试基础面试题
  • 大模型测试面试题
  • AI自动化测开面试题
  • AI Agent测试面试题
  • AI性能与稳定性测试面试题
  • AI应用安全测试面试题
  • 互联网大厂面试真题
  • 互联网中厂面试真题
  • 手机厂商面试真题
  • 通信厂商面试真题
  • 新能源汽车面试真题
  • 银行金融面试真题
  • 项目说明
  • 电商接口文档
  • 实战项目总入口
  • 测试简历编写指南
  • 20K level 简历打磨指南
  • 测试简历模板参考
  • 简历常见问题与避坑
  • 零基础入行专题路径
  • 初中级进阶高级专题路径
  • 零基础小白入行软件测试保姆级学习路线
  • 初中级测试进阶高级测试全路线
  • 软件测试工具精华文章

    • 软件测试工具精华文章
    • 1. Postman 接口测试面试怎么讲
    • 2. Postman 环境变量和断言怎么用
    • 3. JMeter 不只是压测工具
    • 4. JMeter 参数化和关联怎么讲
    • 5. Charles 抓包在测试中怎么用
    • 6. Fiddler 抓包怎么辅助定位 Bug
    • 7. Jenkins 和自动化测试怎么结合
    • 8. Git 在测试团队中怎么用
    • 9. 常用测试工具怎么写进简历
    • 10. 测试工具面试常见追问怎么答
⌕
🛒项目实战📦资料包🛠测试神器AIAI路线CV简历测评🧭入行测评🧪测开测评🎯训练营🏆案例❤赞赏我

4. JMeter 参数化和关联怎么讲?

JMeter 面试中,参数化和关联是两个高频追问。很多同学会搭一个 HTTP 请求,也会设置线程数,但一问“不同用户怎么登录?”“登录后的 Token 怎么传给下一个接口?”“下单返回的订单号怎么给支付接口用?”就答不上来。实际上,参数化和关联是 JMeter 从“简单压一个接口”升级到“模拟真实业务流程”的关键。

参数化解决的是不同虚拟用户使用不同数据的问题;关联解决的是前一个接口的动态返回值传给后一个接口的问题。没有参数化,所有线程可能用同一个账号、同一个商品、同一个订单;没有关联,业务流程就串不起来,只能测孤立接口。

一、什么是参数化

参数化就是把固定写死的数据变成动态数据。比如登录接口中账号密码不能所有线程都写死同一个账号,而应该从 CSV 文件中读取不同账号。

不参数化的请求体:

{
  "username": "user001",
  "password": "123456"
}

参数化后:

{
  "username": "${username}",
  "password": "${password}"
}

JMeter 执行时会从数据文件中读取不同的 username 和 password。

二、为什么性能测试必须参数化

1. 避免账号冲突

所有线程用同一个账号登录,可能导致 Token 被覆盖、账号被锁、会话冲突。

2. 避免缓存影响

所有线程查询同一个商品,结果可能被缓存命中,不能反映真实压力。

3. 避免业务限制

同一个用户可能不能重复下单、同一优惠券不能重复使用、同一手机号不能重复注册。

4. 模拟真实用户行为

真实系统里不同用户会访问不同商品、创建不同订单,参数化能让压测更接近实际。

三、CSV Data Set Config 怎么用

CSV Data Set Config 是 JMeter 最常用的参数化方式。

假设准备文件 users.csv:

username,password
user001,123456
user002,123456
user003,123456

配置项:

  • Filename:CSV 文件路径;
  • Variable Names:username,password;
  • Delimiter:逗号;
  • Recycle on EOF:读完是否循环;
  • Stop thread on EOF:读完是否停止线程。

请求中引用:

${username}
${password}

面试时可以说:账号、商品 ID、手机号、订单数据都可以通过 CSV 参数化。

四、什么是关联

关联是把接口返回的动态值提取出来,保存成变量,给后续接口使用。

例如登录接口返回 Token:

{
  "code": 0,
  "token": "abc123"
}

后续接口需要 Header:

Authorization: Bearer abc123

这个 Token 每次登录都可能不同,不能写死,所以要用 JSON Extractor 提取。

五、JSON Extractor 提取 Token

在登录请求下面添加 JSON Extractor。

配置:

Names of created variables: token
JSON Path expressions: $.token
Match No.: 1

后续 Header 中使用:

Authorization: Bearer ${token}

如果响应结构是:

{
  "data": {
    "token": "abc123"
  }
}

JSON Path 就是:

$.data.token

六、提取订单号并传给支付接口

创建订单接口返回:

{
  "code": 0,
  "data": {
    "orderNo": "NO202604300001"
  }
}

JSON Extractor:

Names of created variables: order_no
JSON Path expressions: $.data.orderNo

支付接口路径:

/api/orders/${order_no}/pay

这就是典型业务链路关联。

七、正则提取什么时候用

如果响应不是标准 JSON,或者要从 HTML、文本中提取数据,可以用 Regular Expression Extractor。但接口测试中优先用 JSON Extractor,因为更稳定、更易读。

例如从响应中提取某个字段:

"token":"(.+?)"

但正则容易受格式变化影响,能用 JSON Path 就不要用复杂正则。

八、参数化和关联结合的完整案例

场景:100 个用户并发登录并创建订单。

设计:

  1. CSV 参数化账号密码;
  2. 登录接口使用 ${username} 和 ${password};
  3. JSON Extractor 提取 ${token};
  4. 商品 ID 从 CSV 或商品列表接口中获取;
  5. 创建订单接口 Header 使用 ${token};
  6. 创建订单后提取 ${order_no};
  7. 查询订单或支付接口使用 ${order_no};
  8. 添加断言校验业务 code。

这样脚本才像真实业务流程。

九、常见错误和排查

1. CSV 文件路径错误

相对路径在不同执行目录下可能失效。正式执行前要确认 JMeter 能读到文件。

2. 变量名不一致

CSV 里定义 username,请求里写 ${user},就会取不到值。

3. CSV 数据不够

线程数大于数据量时,如果不循环且设置读完停止,部分线程会停止;如果循环,可能重复使用数据。

4. JSON Path 写错

提取不到 Token 时,可以用 View Results Tree 查看响应结构,再调整 JSON Path。

5. 提取器位置放错

JSON Extractor 要放在对应请求下面,确保它提取的是该请求的响应。

6. 没有处理提取失败

如果 Token 提取失败,后续接口可能全部 401。要用断言及时发现。

十、面试回答模板

如果面试官问“JMeter 参数化和关联怎么做”,可以这样回答:

参数化主要是让不同虚拟用户使用不同测试数据,比如登录账号、商品 ID、手机号等。我常用 CSV Data Set Config,把账号密码放到 CSV 文件中,请求体里用 ${username}、${password} 引用,避免所有线程使用同一个账号。关联是把前一个接口返回的动态值传给后一个接口,比如登录返回 token,我会用 JSON Extractor 通过 JSON Path 提取成 ${token},后续接口 Header 使用 Bearer ${token};创建订单返回订单号后,再提取 ${order_no} 给支付或查询订单接口使用。这样可以压测完整业务链路,而不是孤立接口。

十一、常见追问

追问:参数化数据不够怎么办?

看测试目标。如果允许重复使用,可以设置 Recycle on EOF;如果必须唯一,比如注册手机号,就要准备足够数据或动态生成,并设置读完停止。

追问:Token 提取失败怎么排查?

先看登录接口是否成功,再看响应 JSON 结构,确认 JSON Path 是否正确,确认提取器是否放在登录请求下,最后看变量引用是否一致。

追问:参数化和关联有什么区别?

参数化通常是从外部数据源读取输入数据;关联是从前一个接口响应中提取动态输出,传给后续接口。

十二、练习清单

  1. 准备 CSV 文件参数化登录账号;
  2. 用 CSV Data Set Config 读取账号密码;
  3. 登录接口引用 ${username};
  4. 用 JSON Extractor 提取 token;
  5. Header 中引用 ${token};
  6. 创建订单后提取 order_no;
  7. 查询订单接口引用 order_no;
  8. 故意写错 JSON Path,练习排查;
  9. 测试 CSV 数据不足时的表现;
  10. 准备一段参数化和关联面试回答。

JMeter 参数化和关联,是业务压测脚本的基础。只要你能结合登录、下单、支付这类流程讲清楚,面试官就会知道你不是只会点线程组,而是真正理解接口性能测试。

配套刷题:

  • 性能测试面试题
  • 网络协议测试面试题
相关推荐

下一步可以看这些

面试通关软件测试面试通关系列精华文章

把面试题、项目、简历和训练营串成一套求职准备路径。

入行路线零基础入行软件测试专题路径

从测评、学习路线、项目、简历到面试,按顺序入行。

进阶路线初中级测试进阶高级专题路径

接口自动化、性能测试、CI/CD、复杂业务质量保障进阶路线。

AI 方向AI 测试学习路线专题页

大模型评测、RAG 测试、Agent 测试和 AI 自动化路线。

求职结果Offer 案例 / 学员案例展示

看看真实学员 Offer 案例,判断目标和学习投入是否匹配。

资料 / 交流群添加小牛微信

备注:资料、简历、AI 或找工作,领取对应资料或进交流群。

添加小牛微信
Prev
3. JMeter 不只是压测工具
Next
5. Charles 抓包在测试中怎么用