JMeter(一):jemter安装
-
-
- [前言:为什么 JMeter 是性能测试的首选工具?](#前言:为什么 JMeter 是性能测试的首选工具?)
- 一、安装jmeter
-
- [1. 环境准备:Windows/Mac 通用](#1. 环境准备:Windows/Mac 通用)
- [2. 安装 JMeter(解压即用,无需安装包)](#2. 安装 JMeter(解压即用,无需安装包))
- [3. 启动与界面设置(建议改成中文)](#3. 启动与界面设置(建议改成中文))
- [二、 核心元件](#二、 核心元件)
-
- [1. 测试计划(Test Plan)](#1. 测试计划(Test Plan))
- [2. 线程组(Thread Group):模拟并发用户的核心](#2. 线程组(Thread Group):模拟并发用户的核心)
- [3. 取样器(Sampler):发送请求的执行单元](#3. 取样器(Sampler):发送请求的执行单元)
- [4. 配置元件:预设参数,简化脚本](#4. 配置元件:预设参数,简化脚本)
- [5. 定时器:模拟真实用户的思考时间](#5. 定时器:模拟真实用户的思考时间)
- [6. 断言:验证响应是否符合预期](#6. 断言:验证响应是否符合预期)
- [7. 后置处理器:提取响应数据,实现关联](#7. 后置处理器:提取响应数据,实现关联)
- [8. 监听器:收集并展示测试结果](#8. 监听器:收集并展示测试结果)
- [9. 逻辑控制器:控制请求执行顺序](#9. 逻辑控制器:控制请求执行顺序)
- 三、单接口配置
-
- [1. 添加线程组](#1. 添加线程组)
- [2. 添加HTTP请求](#2. 添加HTTP请求)
- [3. 添加其他配置元件](#3. 添加其他配置元件)
- 四、接口压测
-
- [1. 分布式压测(模拟 10000 + 并发)](#1. 分布式压测(模拟 10000 + 并发))
- [2. 阶梯加压(模拟真实流量增长)](#2. 阶梯加压(模拟真实流量增长))
- [3. BeanShell 脚本:动态处理复杂逻辑](#3. BeanShell 脚本:动态处理复杂逻辑)
- 五、常见问题分析
- [六、JMeter 学习路径](#六、JMeter 学习路径)
-
前言:为什么 JMeter 是性能测试的首选工具?
在高并发场景下,"功能能用"≠"性能能用"------ 一个电商网站在 100 人访问时正常,1000 人访问就卡顿,本质是性能瓶颈未被发现。Apache JMeter 作为开源免费、跨平台、可扩展的性能测试工具,能精准模拟高并发场景,定位系统瓶颈,无论是 Web 应用、数据库还是接口测试,都能轻松应对。
一、安装jmeter
1. 环境准备:Windows/Mac 通用
JMeter 依赖 Java 环境,必须先装 JDK 再配 JMeter,适合已经安装java环境的用户
-
版本要求:建议Java 17 或更高版本(JDK 8 虽兼容,但 有点老了)
-
验证方法:终端输入以下命令,显示版本号即合格:
java -version # 输出:java version "17.0.10"
javac -version # 输出:javac 17.0.10(JDK特有,JRE无此命令)

2. 安装 JMeter(解压即用,无需安装包)
-
下载安装包 :官网地址https://jmeter.apache.org/download_jmeter.cgi,选择「Binaries」下的
apache-jmeter-5.6.3.zip(最新稳定版) -
解压配置:
-
解压到无空格路径(如
D:\JMeter,避免后续脚本运行报错) -
目录结构说明(核心目录必知):
bin/ # 启动脚本(jmeter.bat/jmeter.sh)+ 配置文件
lib/ # 核心库文件,JDBC驱动需放此目录
lib/ext/ # 插件目录(如阶梯加压插件放这里)
docs/ # 官方文档
3. 启动与界面设置(建议改成中文)
(1) 启动方式
-
Windows:双击
bin/jmeter.bat -
Linux/Mac:终端进入 bin 目录,执行
./jmeter -
启动优化 :修改
bin/setenv.bat(Windows)或setenv.sh(Linux)配置 JVM 内存,避免压测时内存不足:# Windows示例:setenv.bat
set HEAP=-Xms2G -Xmx4G # 初始堆2G,最大堆4G(根据电脑内存调整)
set GC_ALGO=-XX:+UseZGC # 用ZGC垃圾回收器,减少卡顿
(2) 永久设置中文界面
-
打开
bin/jmeter.properties文件 -
找到
#language=en,修改为:language=zh_CN # 去掉#,下划线不能改
-
重启 JMeter,界面自动切换为中文
二、 核心元件
1. 测试计划(Test Plan)
-
作用:所有元件的顶层容器,定义测试整体配置
-
关键设置:
✅ 勾选「独立运行每个线程组」:避免线程组互相干扰
✅ 取消勾选「函数测试模式」:减少响应数据存储,降低内存消耗
2. 线程组(Thread Group):模拟并发用户的核心
-
作用:定义并发用户数、执行时长等负载参数
-
常用类型:
| 类型 | 用途 | 适用场景 |
|---|---|---|
| 普通线程组 | 常规压测 | 模拟稳定并发用户 |
| setUp 线程组 | 测试前初始化 | 数据库连接、数据准备 |
| tearDown 线程组 | 测试后清理 | 数据删除、连接关闭 |
-
核心参数配置(电商下单场景示例):
线程数(用户数):500 # 模拟500个并发用户
Ramp-Up时间:60秒 # 60秒内逐步启动所有线程(避免瞬间冲击服务器)
循环次数:Forever # 持续运行,配合调度器设置时长
调度器→持续时间:300秒 # 压测5分钟
3. 取样器(Sampler):发送请求的执行单元
-
作用:向服务器发送请求(HTTP / 数据库 / FTP 等),是测试的核心操作
-
常用类型及配置:
| 取样器类型 | 用途 | 关键配置 |
|---|---|---|
| HTTP 请求 | Web 接口测试 | 服务器名称、路径、方法 |
| JDBC 请求 | 数据库性能测试 | SQL 语句、参数化变量 |
| TCP 请求 | 协议层测试 | 主机、端口、请求数据 |
-
HTTP 请求示例(测试商品详情接口):
-
服务器名称或 IP:
api.mall.com -
路径:
/goods/detail -
方法:GET
-
参数:
goodsId=${goodsId}(${goodsId} 为参数化变量)
-
4. 配置元件:预设参数,简化脚本
-
HTTP 请求默认值:统一设置所有 HTTP 请求的服务器地址、端口,避免重复配置
-
HTTP Cookie 管理器:自动处理 Session,无需手动添加 Cookie
-
CSV 数据文件设置:从外部文件读取测试数据(如批量登录的用户名密码),核心配置:
文件名:D:\testdata\users.csv
变量名称:username,password # CSV文件的列名
分隔符:,(逗号)
遇到文件结束符再次循环?:False
遇到文件结束符停止线程?:True
5. 定时器:模拟真实用户的思考时间
-
固定定时器:每个请求间隔固定时间(如 2 秒),适合稳定场景
-
高斯随机定时器:按高斯分布生成延迟(如 1-3 秒随机),更贴近真实用户行为
-
同步定时器:让多个线程同时发送请求,模拟瞬间高并发(如秒杀场景)
6. 断言:验证响应是否符合预期
-
响应断言 :检查响应中是否包含指定文本(如
"code":200) -
持续时间断言:验证响应时间是否小于阈值(如 500ms)
-
JSON 断言(接口测试必备):用 JSONPath 验证响应,示例:
-
JSONPath 表达式:
$.data.goodsName -
预期值:
iPhone 15
-
7. 后置处理器:提取响应数据,实现关联
-
JSON 提取器(最常用):从 JSON 响应中提取动态值(如 token),配置:
引用名称:token # 提取后的变量名,用${token}调用
JSONPath表达式:$.data.token
匹配数字:0(取第一个匹配结果)
-
正则表达式提取器:处理非 JSON 响应,如从 HTML 中提取订单 ID:
-
引用名称:orderId
-
正则表达式:
orderId=(\d+) -
模板:
$1$
-
8. 监听器:收集并展示测试结果
-
查看结果树:调试时用,显示每个请求的请求 / 响应详情
-
聚合报告:核心指标汇总(必看!),关键指标说明:
| 指标 | 含义 | 健康阈值 |
|---|---|---|
| 样本 | 总请求数 | - |
| 平均值 | 平均响应时间(ms) | |
| 90% 百分位 | 90% 用户的响应时间 | < 800 |
| 错误率 | 请求失败比例 | % |
| Throughput | 吞吐量(请求 / 秒) | 越高越好 |
-
HTML 报告:压测完成后生成可视化报告,命令:
jmeter -n -t test.jmx -l result.csv -e -o report # 生成report目录的HTML报告
9. 逻辑控制器:控制请求执行顺序
-
事务控制器:将多个请求组合为一个事务(如 "登录→加购→下单" 视为一个事务)
-
如果(If)控制器 :满足条件才执行(如
${userId} != null) -
循环控制器:重复执行子元件(如循环查询商品列表 5 次)
三、单接口配置
1. 添加线程组

2. 添加HTTP请求

3. 添加其他配置元件



四、接口压测
1. 分布式压测(模拟 10000 + 并发)
当单机无法模拟足够压力时,用多台机器分布式压测:
-
执行机配置:所有执行机启动 jmeter-server:
# Linux执行机(指定IP,避免网卡问题)
jmeter-server -Djava.rmi.server.hostname=192.168.1.101
-
控制机配置 :修改
bin/jmeter.properties:remote_hosts=192.168.1.101,192.168.1.102 # 执行机IP列表
server.rmi.ssl.disable=true # 禁用SSL,简化配置
-
执行命令:
jmeter -n -t test.jmx -R 192.168.1.101,192.168.1.102 -l result.csv
2. 阶梯加压(模拟真实流量增长)
用「Concurrency Thread Group」插件实现阶梯式加压(需先下载插件放 lib/ext 目录):
目标并发用户数:1000
起步并发:100
步长:100
每步持续时间:60秒
稳定持续时间:300秒
3. BeanShell 脚本:动态处理复杂逻辑
-
生成随机手机号:在 BeanShell 前置处理器中添加:
String mobile = "138" + (int)(Math.random()*100000000);
vars.put("mobile", mobile); // 存入变量,供取样器调用
-
日志输出:调试时打印变量值:
log.info("当前用户:" + vars.get("username")); // 日志在jmeter.log中查看
五、常见问题分析
| 问题现象 | 根本原因 | 解决方案 |
|---|---|---|
| 内存溢出(OOM) | 默认堆内存不足 + 监听器过多 | 1. 改 setenv.bat 增大堆内存;2. 压测时只保留聚合报告监听器 |
| 连接重置错误 | 服务器过载或端口被占 | 1. 减少线程数;2. 检查服务器端口是否被防火墙拦截 |
| 断言频繁失败 | 动态数据未关联 | 用 JSON 提取器提取动态值,传递给后续请求 |
| 并发用户数达不到预期 | 单机资源瓶颈 | 改用分布式压测,或优化 JVM 参数 |
| HTTP 403 错误 | 缺少 Token 或 Cookie | 添加 HTTP Cookie 管理器,提取并传递 Token |
| 脚本在 CLI 模式运行失败 | 路径含空格或中文 | 重新解压 JMeter 到无空格路径(如 D:\JMeter) |
| 分布式测试连接超时 | SSL 未禁用或端口未开放 | 1. 配置 server.rmi.ssl.disable=true;2. 开放 60000 端口 |
| 参数化数据重复使用 | CSV 配置未勾选停止线程 | 勾选 "遇到文件结束符停止线程?=True" |
六、JMeter 学习路径
-
基础层:安装配置→线程组 + HTTP 请求 + 监听器→结果分析
-
进阶层:参数化(CSV)→关联(JSON 提取器)→断言→BeanShell
-
专家层:分布式压测→插件开发→持续集成(Jenkins+JMeter)
-
领域层:全链路压测→云环境压测→性能调优