一、环境与核心概念
1.1、JMeter的下载与安装
访问Apache官网,选择合适版本。
Java环境要求与检查。
Windows/Linux/macOS下的安装步骤。
启动Jmeter。
1.2、JMeter的界面概览
- 主界面介绍:菜单栏、工具栏、测试计划树、元件面板、属性面板。
- 测试元件执行的顺序:配置元件、前置处理器、定时器、取样器、后置处理器、断言、监听器。
1.3、核心概念理解
- 测试计划:一切的容器。
- 线程组:模拟虚拟用户的基石(线程数、Ramp-Up时间、循环次数)。
- 采样器:发送请求的核心(HTTP、JDBC、FTP等)。
- 监听器:查看结果的窗口(查看结果树、聚合报告、图形结果等)。
- 配置元件:为采样器提供配置(HTTP信息头管理器、CSV数据文件设置等)。
- 断言:验证响应结果。
- 前置/后置处理器:在请求前后进行处理(如提取数据、参数化)。
- 逻辑控制器:控制请求的执行逻辑(如循环、事务、IF条件)。
- 定时器:控制请求之间的等待时间,模拟真实用户思考。
二、核心使用
2.1、发送请求
2.1.1、get请求
请求数据 
查看结果 
2.1.2、post请求
创建:测试计划 → 添加 → 线程(用户) → 线程组,线程组 → 添加 → 取样器 → HTTP请求
请求数据 
请求头设置
- HTTP信息头管理:属于配置元件。
- 如果创建在"HTTP请求"下面,只对当前的请求生效。
- 如果创建在"线程组"下面,则对当前的所有请求生效。

查看结果
- 查看结果树:属于监听器。
- 如果创建在"HTTP请求"下面,只看当前请求的结果。
- 如果创建在"线程组"下面,则查看所有请求的结果。

2.2、并发和顺序执行
2.2.1、并发执行
jmeter默认并发执行,每次执行的顺序都是不一样的。

2.2.2、顺序执行
勾选线程组中的"独立运行每个线程",就能实现顺序执行。


2.3、参数化
2.3.1、CSV文件(推荐)
- CSV Data Set Config:属于配置元件。
- 可以创建在测试计划、线程组和HTTP请求中,范围决定作用域。
准备测试数据的CSV文件 
读取CSV文件,如果文件首行有变量名,记得忽略首行 
引用读取文件中接收的变量,${变量名} 
配置循环控制器,来循环读取文件中的数据
- 循环控制器:属于逻辑控制器。
- 可以将HTTP取样器放在它的下级,来控制影响的范围。

查看结果 
还有一种方式来执行CSV文件,在"CSV数据文件设置"中:
- "遇到文件结束符再次循环" 设置为False。
- "遇到文件结束符停止线程" 设置为Ture。
在"线程组"或"循环控制器"中循环次数勾选"永远"。
2.3.2、用户定义的变量
- 用户定义的变量:属于配置元件。
- 可以创建在测试计划、线程组和HTTP请求中,范围决定作用域。
- 用于:配置全局环境变量、数据库连接串、基础 URL、固定头信息。
定义公共变量 
使用公共变量:${变量名} 
2.3.3、用户参数
- 用户参数:属于前置处理器。
- 使用"用户参数"配置的数据,需要通过线程组去获取,不能通过循环控制器。
准备数据 
使用数据,有多少组数据就配置几个线程 

2.3.4、函数 - __counter
计数器函数:
- True表示每个用户都有自己的计数器。
- False表示所有用户共用一个计数器。
可能遇到的问题
Jmeter 5.6.3版本的counter函数,可能起始为2,步长也为2,这是这个版本的bug。
修复方式如下:


定义两个线程,每个线程循环三次 
选择counter函数,设置的值为true,复制生成的函数 
使用函数,查看结果 
选择counter函数,设置的值为false,复制生成的函数 
使用函数,查看结果 
2.3.5、函数 - __Random
设置随机函数 
使用函数,查看结果 
2.3.6、函数 - __time
设置时间函数 - 时间戳 
设置时间函数 - 自定义格式 
2.4、断言
2.4.1、Json断言

2.4.2、响应断言
响应文本 - 断言响应中是否包含指定文本 
响应代码 - 断言响应状态码是否等于200 
响应代码 - 断言响应状态码是否等于200或者201 
2.4.3、大小断言
- 若响应的数据中显示了实际数据的大小,断言中可以直接比较大小。
- 若响应的数据中不是大小,而是字符,则输入长度,例如:状态码200 = 3,响应信息OK = 2。
响应的对应关系

判断响应代码的时候,不是输入状态码200,而是输入状态码的长度 
2.4.4、断言持续时间
断言发送请求和结果响应的总共时间,单位是ms。

2.5、后置处理器
2.5.1、Json提取器
提取登录接口返回的token 
在订单列表接口中,使用上面定义的token变量:${变量名} 
查看结果 
2.5.2、Xpath提取器
第一个请求访问百度,提取百度中的title标签信息"百度一下,你就知道" 

第二个请求访问百度,使用上面提取的标签信息访问 

2.5.3、正则表达式提取器
查看响应的结果,设置正则表达式的条件 

查看提取的结果 
2.6、模块化测试
- 可以将不同的模块分测试片段。
- 测试片断是一个单独的模块,里面定义的变量、断言、结果树都是片段内部使用。
- 测试片段可以导出,可以使用Include控制器导入使用,大型项目一般就是使用测试片段。
- 片段组合执行:线程组 --- 添加 --- 逻辑控制器 --- 模块控制器 --- 选择执行的模块。
2.6.1、创建使用测试片段
在测试计划中可以将每个请求单独成一个测试片段。 
在测试计划中添加一个线程组,在线程组中添加一个模块控制器。
模块控制器:属于逻辑控制器。
在模块控制器中可以选择要执行的测试片段。

查看结果 
2.6.2、导入导出测试片段
导出测试片段
- 右键点击测试片段 -> 选中部分保存为... -> 指定文件名和保存路径 -> 点击保存。
- 注意:不要将一个测试片段再次"保存测试片段",这会导致层级嵌套,使后续无法正确调用。

导入测试片段
- 使用包含控制器(Include Controller,推荐)。
- 在目标测试计划的线程组下,右键添加 -> 逻辑控制器 -> 包含控制器。
- 在包含控制器的"文件"字段中,输入测试片段文件的完整路径或相对于JMeter bin目录的相对路径。

2.7、连接数据库
2.7.1、下载JDBC驱动包
打开mysql官网,进入到JDBC的downloads页面,选择对应的版本下载

把下载好的jar包放到jemter的lib的文件中,重启jmeter 
2.7.2、配置连接
- JDBC Connection Configuration:属于配置原件
- Database Url:jdbc:mysql://localhost:3306/book?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
- JDBC Driver Claa:Mysql 5.x版本:com.mysql.jdbc.Driver;Mysql 8.x版本:com.mysql.cj.jdbc.Driver


创建JDBC Request 
2.8、跨线程共享变量
场景:在一个线程组中,访问另一个线程组中的数据。
设置全局变量的函数 
使用全局变量的函数 
2.8.1、BeanShell后置处理器
- 在源线程组中,使用BeanShell后置处理器执行props.put("propertyName",vars.get("variableName"));
- 在JSONt提取器中设置的token被存入了vars中。
- 在目标线程组中,通过函数${__property(propertyName)}直接引用属性值。
- vars:线程局部变量,仅在当前线程内有效,用于请求链路间传递。
- props:全局属性,跨线程组共享,需手动通过 props.put("token", value) 显式设置。
bash
# 定义
props.put("token",vars.get("token"));
# 使用
${__property(token)}
在源线程中,定义变量、声明变量 

在目标线程中使用源线程中定义的变量 
查看结果 
2.8.2、JSR223后置处理器
2.9、逻辑控制器
2.9.1、if控制器
- If 控制器通过判断一个布尔表达式的真假来决定是否执行其下的测试元件。
- 如果表达式为 true,则执行子节点;如果为 false,则跳过这些子节点。
创建"用户定义的变量"作为条件 
在"if控制器"中设置条件,并且将HTTP请求放在下面 
2.9.2、ForEach控制器
- ForEach控制器是一种逻辑控制器,用于遍历一组变量值,并在每次迭代中使用不同的变量值执行其下的采样器或控制器。
- 它通常与用户自定义变量或正则表达式提取器配合使用。
创建"用户定义的变量",设置几组变量,格式:变量名_1 
在"ForEach控制器"中设置条件,并且将HTTP请求放在下面 
使用变量,发送请求 
2.9.3、循环控制器
- 循环控制器是一种逻辑控制器,用于重复执行其下的采样器或控制器。
- 它允许你指定循环的次数,从而可以重复执行一组测试步骤。
- 与在线程组中定义的循环次数没有什么差别,但是循环控制器可以控制单个请求。

三、性能测试
3.1、基础压测
3.2、梯度压测
插件:jp@gc - Stepping Thread Group。
3.2.1、下载安装插件
下载 Plugins Manager:https://jmeter-plugins.org/install/Install/

将下载的 .jar 文件复制到JMeter安装目录下的lib/ext文件夹中

重启JMeter后,点击顶部菜单 Options → Plugins Manager

安装插件:jpgc - Standard Set

重启后,会成功安装这个包下面的所有插件

3.2.2、界面功能介绍
创建:测试计划 → 添加 → 线程(用户) → jp@gc - Stepping Thread Group

3.3、通用压测
插件:jp@gc - Ultimate Thread Group。
可以用来模拟:基础压测、梯度压测、尖峰测试。
3.3.1、界面功能介绍

3.4、图形报表插件
下面三个插件均属于监听器。
3.4.1、查看线程数量
插件:jp@gc - Active Threads Over Time
3.4.2、查看响应时间
插件:jp@gc - Response Times Over Time
3.4.3、查看吞吐量
插件:jp@gc - Transactions per Second
四、分布式
4.1、分布式原理
- 控制机:负责任务分配。
- 执行机:负责任务执行。
- 工作流程:
- 控制机需要制定测试任务,并且下发到执行机。
- 执行机执行任务,并且将结果返回控制机。
- 控制机做结果汇总。

4.2、环境搭建
执行机
- 在不同的测试机上安装Jmeter。
- 配置基础环境(统一的操作系统、JDK、Jmeter...)。
控制机
- 在控制机中配置执行机的ip。
- 配置文件:JMeter\apache-jmeter-5.6.3\bin\jmeter.properties。

控制机和执行机都得配置

4.3、执行分布式
- 在控制机中,点击运行 --- 启动远程所有。
- 在执行机中,要把Jmeter打开,点击执行jmeter.bat文件。
