Jmeter 是 Apche 公司使用 Java 平台开发的一款测试工具,其主要功能如下👇:
元件即为多个类似功能组件的容器(类似于类),组件用于实现独立的某个功能(类似于方法)
执行顺序
同一作用域下不同元件
配置元件 --> 前置处理程序 --> 定时器 --> 取样器 --> 后置处理程序 --> 断言 --> 监听器
同一作用域下相同元件
从上到下的顺序依次执行
例子
各组件执行顺序如下【保证 IF 控制器能正常进入的情况下】👇
定时器1 --> HTTP请求1 --> 定时器1 --> 定时器2 --> HTTP请求2 --> 定时器1 --> 定时器3 --> HTTP请求3
解释:
特点
分类
属性
循环次数是指每个线程的循环次数
案例分析:
使用 1 个线程组,添加 HTTP 请求(百度)
相同点:从请求数量来说,是完全相同的
不同点:场景不同
作用:向服务器发送http及https请求
位置:选中线程组 --> 右键 --> 添加 --> 取样器 --> HTTP请求
作用:查看结果
位置:选中线程组 --> 右键 --> 添加 --> 监听器 --> 查看结果树
使用参数的方式来替代脚本中的固定测试数据
实现方式:
作用:定义全局变量
位置:线程组 --> 配置元件 -->用户定义的变量
作用:针对同一组参数,当不同用户来访问时,可以获取到不同的值
位置:选中线程组 --> 右键 --> 添加 --> 前置处理器 --> 用户参数
${}$案例:向百度发送两次get请求,携带name与age参数,值分别为张三、李四,18、20
线程组中的线程数设置为 2 模拟两个用户
发送的两次请求URL路径如下👇
作用:让不同用户在多次循环时,可以取到不同的值
位置:线程组 --> 配置元件 --> CSV数据文件设置
使用方法与用户参数类似
作用:自动生成不重复的数据,让每个用户每次循环都能取到不同数据,且不需要提前定义
位置:菜单栏点击工具 --> 函数助手对话框
检查实际的返回结果是否与预期结果保持一致
Jmeter 有自动校验机制,即自动判断响应状态码(2xx:成功,4xx/5xx:失败)
作用:对HTTP请求的任意格式响应结果进行断言
位置:线程组 --> HTTP请求 --> 断言 --> 响应断言
当测试字段预期结果与实际结果不符时,在查看结果树中会出现如下提示
作用:对 HTTP请求的 json 格式响应数据进行断言
位置:线程组 --> HTTP请求 --> 断言 --> JSON 断言
作用:对响应时间进行断言
位置:线程组 --> HTTP请求 --> 断言 --> 断言持续时间
当持续时间超出最高值时,在查看结果树中会出现如下提示
请求之间有依赖关系,一个请求的响应数据作为另一个的请求参数来传递
作用:针对任意格式的响应数据进行提取
位置:线程组 --> HTTP请求 --> 后置处理器 --> 正则表达式提取器
模板中,计数以括号为单位,$1$代表第一个括号匹配的值
匹配数字是对每个括号匹配元素的计数
案例:向哔哩哔哩发送请求,获取其title值并作为关键字访问百度
查看结果树结果如下
作用:针对HTML格式的响应结果数据进行提取
位置:线程组 --> HTTP请求 --> 后置处理器 --> XPath提取器
作用:针对 JSON 格式的响应结果数据进行提取
位置:线程组 --> HTTP请求 --> 后置处理器 --> JSON提取器
需要实现跨线程组的数据传递时,可以使用 JMeter 属性,将线程组的局部属性存储为全局属性
案例:在线程 1 保存请求(http://m.nmc.cn/rest/predict/59289?_=1708762524613)返回的 json 数据中city关键字对应的值,并在线程2中用于百度搜索
其测试计划对应如下:
首先使用 JSON 提取器保存关键值到线程 1 中
接着使用 setProperty 函数实现局部变量到全局变量的转换,同时在此线程组中添加 BeanShell 取样器用于执行此函数,完成变量保存
再次调用函数助手,生成 property 函数
最后在线程组 2 中需要传参的地方调用函数,完成传参
查看结果树
用户请求的参数化
例如登录时需要的用户名,可以从数据库中查询获取
用作结果的断言
例如添加购物车下订单,检查接口返回的订单号,是否与数据库中生成的订单号一致
清理垃圾数据
例如添加商品(商品号/编号等不能重复),再执行该脚本不能成功,需要在下次执行前删除该商品数据
准备测试数据
例如通过数据库来准备大量性能测试数据
将 MySQL 驱动 jar 包放入到 lib/ext 目录下,重启 JMeter
连接数据库配置
位置:线程组 --> 配置元件 --> JDBC Connection Configuration
执行SQL语句配置
位置:线程组 --> 配置元件 --> JDBC Request
由于查询的数据条数未知,因此实际上存储的变量名会在 Variable names 的基础上进行编号,如 Variable names 若为 var,则实际上其第一条元素变量引用名为 var_1
完成配置与语句编写,执行后通过查看结果树即可得到查询结果
作用:控制其下测试元素是否运行
位置:线程组 --> 逻辑控制器 --> IF控制器
作用:控制其下测试元素循环执行
位置:线程组 --> 逻辑控制器 --> 循环控制器
作用:一般和用户自定义变量或者正则表达式提取器一起使用,读取返回结果中一系列相关的变量值。该控制器下的取样器都会被执行一次或多次,每次读取不同的变量值
位置:线程组 --> 逻辑控制器 --> ForEach控制器
结束循环字段不填时默认遍历到最后一个
案例:引用用户自定义变量访问网站
ForEach控制器设置如下
作用:测试抢购、秒杀或者抢红包等高并发的场景下使用
位置:线程组 --> HTTP请求 --> 同步定时器
设置超时时间需要注意以下两点:
通过监听器中的聚合报告可以查看线程发送的动态过程
作用:让 JMeter 按指定的吞吐量执行,以每分钟为单位
位置:线程组 --> HTTP请求 --> 定时器 --> 常数吞吐量定时器
QPS(Queries-per-second)即每秒查询率
作用:让请求间隔一定时间后再执行
位置:线程组 --> HTTP请求 --> 定时器 --> 固定定时器
作用:收集性能测试结束后,系统的各项性能指标。如:响应时间、并发数、吞吐量、错误率等
位置:测试计划 --> 监听器 --> 聚合报告
作用:JMeter 支持生成 HTML 测试报告,以便从测试计划中获得图表和统计信息
# 命令需在jmeter的bin目录下执行
# 存放结果在jmeter中bin目录下的report文件夹,保证此时无report目录
jmeter -n -t "测试计划.jmx" -l 测试结果.jtl -e -o ./report
普通方法
二八原则
根据业务运营数据的统计计算(通常用来做稳定性测试)
根据用户峰值业务操作来计算(通常用来做压力测试)
例子
某购物商城,经过运营统计,正常一天成交额为100亿,客单价平均为300元,交易时间主要为 10:00 - 14:00,17:00 - 24:00,其中 19:00 - 20:00 的成交量最大,大约成交20亿。
现升级系统,需要进行性能测试,保证软件在上线后能稳定运行。
请计算出系统稳定性测试时的并发(负载)量,及保证系统峰值业务时的并发(负载)量。
稳定并发量:
100
E
300
×
0.8
3600
×
11
∗
0.2
压力并发量:
20
E
300
3600
×
1
×
系数
稳定并发量: \dfrac{\frac{100E}{300} \times 0.8}{3600\times11*0.2}\\ 压力并发量: \dfrac{\frac{20E}{300} }{3600\times1\times系数}
稳定并发量:3600×11∗0.2300100E×0.8压力并发量:3600×1×系数30020E
使用第三方的扩展功能,可以使得 Jmeter 更为强大
使用插件前,首先需要安装Jmeter插件管理工具,下载地址如下所示👇:
https://jmeter-plugins.org/wiki/PluginsManager/
将下载后的 jar 包放入Jmeter的 lib/ext 目录下,接着按照此博客方法进行配置:Jmeter插件管理器打开报错解决办法
点击菜单栏“选项” --> “JMeter Plugins Manager”,若能顺利显示如下👇界面,则说明准备工作完成。
在 Available Plugins 中添加如下四个插件,后续需要使用

作用:阶梯加压,图形界面显示运行状态
添加方式:线程(用户) --> Concurrency Thread Group
作用:统计各个事务每秒成功的事务个数
添加方式:线程组 --> 监听器 --> Transactions per Second
作用:查看服务器吞吐流量(单位/字节)
添加方式:线程组 --> 监听器 --> Bytes Throughput Over Time
作用:用来监控服务端的性能资源指标的工具,包括cpu、内存、磁盘、网络等性能数据
添加方法:线程组 --> 监听器 --> PerfMon Metrics Collector
注意:使用之前需要在服务器端安装监听服务程序并启动
除此之外还要其余一些指标的监听器,此处不再一一展示