JMeter 登录 + CSV 参数化 + JSON 关联 完整实操步骤(可直接跟着配置)

JMeter 登录+CSV参数化+JSON关联 完整实操步骤(可直接跟着配置)

整体流程:线程组 → CSV参数化(账号密码)→ 仅一次控制器(登录)→ HTTP登录请求 → JSON提取器拿token → 业务接口(Header携带token)→ 断言校验

一、前置准备CSV参数文件

新建 user.csv,放到JMeter bin目录,内容:

csv 复制代码
username,pwd
test01,123456
test02,654321
test03,888888

分隔符逗号,第一行为变量名,后续每行一组账号密码。

二、完整组件层级结构(照着建)

复制代码
测试计划
└── 线程组(并发用户数:3,Ramp-Up:3,循环:5)
    ├── 配置元件
    │   ├── HTTP请求默认值(统一域名/端口)
    │   ├── CSV Data Set Config(读取user.csv账号)
    │   └── HTTP信息头管理器(存放token,后续业务接口共用)
    ├── 逻辑控制器:仅一次控制器(登录接口只执行1次)
    │   └── HTTP取样器:登录接口
    │       ├── JSON提取器(提取返回token)
    │       └── JSON断言(校验登录成功code=200)
    └── HTTP取样器:查询用户业务接口
        ├── JSON断言(校验返回数据)

三、分步详细配置

1. HTTP请求默认值(统一域名,简化接口路径)

右键线程组 → 添加 → 配置元件 → HTTP请求默认值

  • 协议:http
  • 服务器名称或IP:127.0.0.1
  • 端口号:8080
  • 路径:/api

后续接口只需要填写后缀,如 /login /user/info,不用重复写完整地址

2. CSV Data Set Config 参数化账号

右键线程组 → 添加 → 配置元件 → CSV数据文件设置

配置项 填写内容 说明
文件名 user.csv 文件放jmeter/bin下,写相对路径
变量名称 username,pwd 和csv表头一一对应
分隔符 , csv逗号分隔
忽略首行 ✅勾选 跳过表头行
循环读取 True 读完循环复用账号
读到文件结束停止线程 False 不停止,循环使用
共享模式 当前线程组 同组线程分开读取,避免账号重复抢占

接口引用变量:${username} ${pwd}

3. 仅一次控制器(登录只执行1次)

右键线程组 → 添加 → 逻辑控制器 → 仅一次控制器

把登录HTTP请求拖进这个控制器内,每个线程只会执行一次登录,循环只跑业务接口。

4. 登录HTTP请求取样器

右键仅一次控制器 → 添加 → 取样器 → HTTP请求

  • 方法:POST
  • 路径:/login
  • 参数(表单/JSON二选一)
方式1:表单参数

参数名:username,值:${username}

参数名:pwd,值:${pwd}

方式2:JSON请求体(主流后端)

HTTP信息头管理器新增:Content-Type: application/json

请求体:

json 复制代码
{
  "username": "${username}",
  "password": "${pwd}"
}
登录接口返回示例(标准JSON)
json 复制代码
{
  "code": 200,
  "msg": "登录成功",
  "data": {
    "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9",
    "userId": 1001
  }
}

5. JSON提取器(提取token,接口关联核心)

右键登录请求 → 添加 → 后置处理器 → JSON提取器

配置项 填写值
引用名称 token
JSON路径表达式 $.data.token
匹配数字 1

拓展:同时提取userId

新增JSON提取器:引用名称userId,表达式$.data.userId

6. 登录接口JSON断言(校验登录成功)

右键登录请求 → 添加 → 断言 → JSON断言

  • 测试字段路径:$.code
  • 测试模式:等于
  • 测试值:200
    作用:登录返回code≠200时,标记请求失败,聚合报告统计错误率。

7. 全局请求头管理器(下游接口自动携带token)

右键线程组 → 添加 → 配置元件 → HTTP信息头管理器

新增头:

  • 名称:Authorization
  • 值:Bearer ${token}
    所有下层HTTP请求会自动带上该鉴权头,无需每个接口重复配置。

8. 业务接口(查询用户信息)

直接放在线程组下(仅一次控制器外部)

  • 请求方法:GET
  • 路径:/user/info?userId=${userId}
    添加JSON断言校验返回用户名:
  • 测试字段路径:$.data.name
  • 测试模式:非空

9. 添加监听器(调试+压测报表)

  1. 查看结果树:GUI调试用,运行时看请求/响应、断言失败原因;压测时删除,防止内存溢出
  2. 聚合报告:性能压测核心指标(平均响应、95%响应、吞吐量、错误率)

四、非GUI命令行执行脚本(线上压测)

  1. 保存脚本为 api_test.jmx
  2. bin目录执行命令:
bash 复制代码
jmeter -n -t api_test.jmx -l result.jtl -e -o report_html
  • -n:无界面运行
  • -t 指定脚本
  • -l 输出日志jtl文件
  • -e -o 自动生成可视化html报告

五、高频拓展脚本/函数补充

1. 随机字符串函数(注册接口随机用户名)

打开工具-函数助手,生成:

复制代码
${__RandomString(8,abcdefgh123456,randName)}

8位随机字符,变量名randName,请求中 ${randName} 使用

2. 自增数字(唯一订单号)

复制代码
${__counter(false,orderNum)}

false=全局计数器,所有线程共用一套自增数字

3. If控制器示例(token存在才执行查询接口)

新建If控制器,表达式:

复制代码
${__jexl3("${token}" != "",)}

只有token不为空时,内部业务接口才会执行。

六、常见踩坑解决

  1. CSV读取同一行账号并发冲突
    CSV共享模式改为「当前线程」,每个线程独立读取一行数据
  2. JSON提取器拿不到token
    检查JSONPath表达式、接口返回JSON格式是否正确,查看结果树校验响应体
  3. 下游接口401未鉴权
    确认HTTP信息头管理器在线程组层级,token变量名书写无错 ${token}
  4. 仅一次控制器多次执行
    控制器必须在线程组下,登录请求放在控制器内部,不要嵌套循环控制器
  5. GUI压测卡死
    大并发压测删除「查看结果树」监听器,改用命令行非GUI模式运行