课程:B站大学
记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师
性能测试-jmeter元件实操作
- Jmeter元件
-
- [一、测试计划类(Test Plan)](#一、测试计划类(Test Plan))
- 二、线程控制器(Controllers)
- 三、取样器(Samplers)
- 四、监听器(Listeners)
- 五、断言(Assertions)
- 六、定时器(Timers)
- 七、前置处理器(Pre-Processor)
- 八、后置处理器(Post-Processor)
- [九、配置元件(Config Elements)](#九、配置元件(Config Elements))
- [十、函数助手对话框(Function Helper Dialog)](#十、函数助手对话框(Function Helper Dialog))
- 元件作用域
- Jmeter参数化
- 实践是检验真理的唯一标准
Jmeter元件
一、测试计划类(Test Plan)
元件作用
- 测试计划(Test Plan) JMeter 脚本的根节点,用于组织整个测试流程,可配置全局变量、用户定义变量、函数、默认编码等。
- 线程组(Thread Group) 用于模拟并发用户数(线程数)、循环次数、启动/停止时间等。它是测试计划的子节点,控制测试的并发逻辑。
二、线程控制器(Controllers)
控制器用于控制请求的执行逻辑,分为两种:
- 逻辑控制器(Logic Controller) 元件 作用
- 循环控制器(Loop Controller) 控制其内部元件的循环执行次数。
- 条件控制器(If Controller) 判断是否执行其中的子元素。
- 开关控制器(Switch Controller) 类似 switch-case,只执行选中的子元素。
- 随机控制器(Random Controller) 从子元素中随机选一个执行。
- 模块控制器(Module Controller) 用于跳转到某个模块(通过控制器路径指定),用于脚本复用。
- 事务控制器(Transaction Controller) 将多个请求当成一个事务处理,可统计整个事务耗时。
- 录制控制器(Recording Controller) 配合代理服务器使用,接收浏览器录制的请求。
三、取样器(Samplers)
取样器是真正发出请求的执行体。每个请求类型对应一个取样器。
取样器类型说明
- HTTP 请求(HTTP Request) 用于发起 HTTP/HTTPS 请求,是最常用的接口测试元件。
- JDBC Request 数据库查询请求(支持MySQL、Oracle等)。
- JSR223 Sampler 使用 Groovy/Java 脚本进行自定义请求。
- Debug Sampler 打印当前变量、属性,调试用。
- BeanShell Sampler 使用 BeanShell 脚本语言执行请求(性能不如JSR223)。
- FTP Request 执行 FTP 协议的上传下载操作。 SMTP Sampler 邮件发送测试。
四、监听器(Listeners)
用于查看测试结果,监听器会收集并展示响应时间、断言信息等。数据量大时不推荐同时开启太多监听器。
元件说明:
- 查看结果树(View Results Tree) 详细查看每个请求的请求/响应数据。
- 聚合报告(Aggregate Report) 聚合各请求的统计数据(吞吐量、平均时间等)。
- 图形结果(Graph Results) 图形方式展示请求性能曲线。
- 表格结果(View Results in Table) 表格形式展示每个请求的响应情况。
- 监听器 → 写入文件 可将结果输出到 CSV/HTML 文件中进行后续分析。
五、断言(Assertions)
用于验证接口的响应是否符合预期。
元件说明
- 响应断言(Response Assertion) 判断响应内容中是否包含指定文本、正则等。
- 断言结果(Assertion Results) 查看断言是否通过。
- JSON断言 断言 JSON 响应体结构(需要插件支持)。
- XML断言 用于验证返回的 XML 内容。
六、定时器(Timers)
用于控制请求之间的延时,模拟用户真实行为。
元件说明
- 常数定时器(Constant Timer) 固定延时。
- 高斯随机定时器 模拟高斯分布的延时。
- 均值随机定时器 在一个固定值的基础上加上一个范围内的随机值。
- BeanShell Timer / JSR223 Timer 可通过脚本自定义延时时间逻辑。
七、前置处理器(Pre-Processor)
在请求发送前运行,用于准备数据或动态修改请求参数。
元件用途:
- JSR223 PreProcessor 使用 Groovy 动态处理请求前参数(如设置 header、生成 token)。
- User Parameters 设置不同线程的参数(多用户模拟)。
八、后置处理器(Post-Processor)
在请求执行后运行,常用于提取响应中的数据供后续请求使用。
元件用途:
- 正则表达式提取器(Regular Expression Extractor) 从响应体中提取数据保存为变量。
- JSON提取器(JSON Extractor) 提取 JSON 数据中的字段值(需要插件)。
- XPath 提取器 处理 XML 响应。
- JSR223 PostProcessor 使用脚本进行复杂的数据处理或提取。
九、配置元件(Config Elements)
提供默认参数配置,使请求更灵活。
元件说明
- HTTP请求默认值(HTTP Request Defaults) 设置公共的 URL、端口、编码等。
- 用户定义变量(User Defined Variables) 设置全局变量,在多个请求中复用。
- HTTP Cookie 管理器 管理会话中的 Cookie 信息。
- HTTP Header 管理器 设置统一的请求头。 JDBC Connection Configuration 配置数据库连接信息。
十、函数助手对话框(Function Helper Dialog)
- 用于辅助生成 JMeter 函数表达式,例如 ${__Random(1,100,)},便于插入动态参数。
元件作用域
在JMeter中,元件的作用域是靠测试计划的树形结构中元件的父子关系来确定的。
提示:核心是取样器,其他组件都是以取样器为核心运行的,组件添加的位置不同,生效的取样器也不同。
作用域的原则
- 取样器:元件不和其他元件相互作用,因此不存在作用域的问题;
- 逻辑控制器:元件只对其子节点中的取样器和逻辑控制器作用;
- 其他七大元件:除取样器和逻辑控制器元件外,如果是某个取样器的子节点,则该元件对其父子节点起作用;
- 如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等);
jmeter实操1:
启动JMeter
在'测试计划'下添加'线程组'
在'线程组'下添加'HTTP请求'取样器
填写'HTTP请求'的相关请求数据
在'线程组'下添加'察看结果树'监听器
点击'启动'按钮运行,并查看结果
重要组件
- 线程组
- HTTP取样器
- 察看结果树
jmeter中操作如下:
- 添加线程组
位置:右键点击"测试计划" --> 添加 --> 线程(用户) --> 线程组
2.1.2 线程组的特点
- 模拟多人操作
- 线程组可以添加多个,多个线程组可以并行或串行,取样器(请求)和逻辑控制器必须依赖线程组才能使用
- 线程组下可以添加其他元件下组件
2.1.3 线程组分类
- 线程组:普通的、常用的线程组,可以看做一个虚拟用户组,线程组中的每一个线程都可以理解为一个虚拟用户
- setUp线程组:一种特殊类型的线程组,可用于执行预测试操作
tearDown线程组
- 一种特殊类型的线程组,可用于执行测试后工作
线程组的属性:
- 线程数:需要模拟的虚拟用户数。
- ramp-up time:模拟的虚拟用户数全部启动所需要的时间。
- 目的:为了模拟性能测试的场景,更接近用户的使用习惯(用户慢慢接入系统) 循环次数:
- 设置为固定次数n时:脚本运行时发送请求的次数为n
- 设置循环次数为"永远"时,脚本会一直运行下去,不停止
- 调度器 : 一般与循环次数为"永远"的设置配合使用 持续时间设置为n时:脚本的请求发送的时间为n秒
注意点:线程组将用于基准测试、负载测试、压力测试、持续压力测试。
HTTP取样器的属性:
http默认80端口
https默认443端口
post:json参数
get:url参数
post:path参数+json
接口请求方式对应的参数格式如下:
请求方法 | 参数位置 | 格式示例 |
---|---|---|
GET | URL 查询字符串 | key1=value1&key2=value2 |
POST | Body | 1. key1=value1&key2=value2 2. multipart/form-data 3. {"key":"value"} 4. <xml>...</xml> |
PUT | Body | 同 POST 的 JSON/XML |
PATCH | Body | 同 POST 的 JSON/XML |
DELETE | URL 或 Body | /api/1 或 {"id":1} |
HEAD | URL 查询字符串 | 同 GET |
OPTIONS | URL 查询字符串 | 通常无参数 |

Jmeter参数化
用户定义的变量
作用:在测试计划或线程组级别预先定义一组固定的变量,供后续请求使用。
适用场景:
测试环境的基础配置(如 base_url、port、api_path)。
固定参数(如 user_id、token 等不会频繁变化的值)。
特点:
变量在测试开始时初始化,整个测试过程中值不变。
适用于全局共享的静态数据。
用户参数
作用:在每个线程(虚拟用户)启动时动态生成变量,支持简单的参数化。
适用场景:
每个用户需要不同的固定值(如 username、password)。
少量参数的动态化(但不适合大规模数据驱动测试)。
特点:
变量在每个线程启动时初始化,线程间独立。
适用于少量用户、少量参数的场景。

CSV Data Set Config
作用:从外部 CSV 文件读取数据,实现大规模数据驱动测试。
适用场景:
需要模拟大量用户,每个用户使用不同的数据(如登录账号、订单号)。
测试数据存储在外部文件(如 users.csv)。
特点:
支持多列数据读取,可循环或按需读取。
适用于高性能、大规模数据驱动测试。
参数详解(CSV 数据文件设置)
- 文件名:CSV文件路径
- 文件编码:文件编译字符编码,一般设置UTF - 8
- 变量名称:多个变量时,使用英文逗号分隔
- 忽略首行:True为忽略,False为不忽略,默认值:False
- 分隔符:如文件中使用的是逗号分隔,则填写逗号;如使用的是制表符,则填写\t;
- 是否允许带引号:CSV文件中的内容是否允许带引号
- 遇到文件结束符再次循环:当读取文件到结尾时,是否再从头读取文件,False=当读取文件到结尾时,停止读取文件
- 遇到文件结束符停止线程:当"遇到文件结束符再次循环"一项为False时起效;True:当读取文件到结尾时,停止进程
- 线程共享模式:共享模式一般默认即可
- 所有线程:该文件在所有线程之间共享,所有线程循环取值,线程一取第一行,线程二取下一行
- 当前线程组:各个线程组分别循环取值
- 当前线程:每个文件分别为每个线程打开
函数
作用:JMeter 内置的动态变量生成工具,支持时间、随机数、字符串处理等。
适用场景:
动态生成唯一值(如 UUID、时间戳)。
随机化参数(如随机数、随机选择列表中的值)。
字符串拼接、截取等操作。
特点:
直接在请求或变量中使用,无需外部文件。
适用于动态数据生成,如 token、timestamp 等。
jmeter官方函数手册:函数手册
函数这里,在实际操作结合实际业务时使用,可以先自行了解下常用函数
性能测试业务中常用函数
JMeter函数助手:常用函数分类速查表
分类 | 函数 | 作用 | 美团业务场景示例 |
---|---|---|---|
动态数据生成 | __Random(min, max) |
生成指定范围的随机整数(如订单金额、商品数量) | 随机生成10-1000元的订单金额 |
__RandomString(length, chars) |
生成指定长度的随机字符串(如用户昵称、测试数据) | 生成8位随机用户名 __RandomString(8, abc123) |
|
__UUID |
生成唯一标识符(如订单号、会话ID) | 模拟订单号 __UUID |
|
__threadNum |
获取当前线程编号(用于区分多线程请求) | 日志标记 Thread-${__threadNum} |
|
时间处理 | __time() |
获取当前时间戳(毫秒级,如性能监控打点) | 记录接口响应时间 __time() |
__time(format) |
格式化时间(如 yyyyMMddHHmmss 生成订单时间) |
下单时间 __time(yyyyMMddHHmmss) |
|
__dateTimeConvert() |
时间格式转换(如 yyyyMMdd→yyyy-MM-dd ) |
处理美团API返回的日期格式 | |
随机化选择 | __RandomFromMultipleVars(var1,var2,...) |
从多个变量中随机选一个(如随机选商家、商品分类) | 随机选择外卖商家 __RandomFromMultipleVars(shop1,shop2) |
__CSVRead(filename, column) |
从CSV文件读取指定列数据(如用户账号、地址) | 读取 users.csv 第1列用户名 |
|
字符串处理 | __split(str, delimiter) |
拆分字符串(如解析JSON/HTML返回值) | 拆分美团返回的JSON字段 __split(${resp}, ",") |
__regexFunction(regex, str, template) |
正则表达式提取(如抓取订单ID、价格) | 提取订单号 __regexFunction(order_(\d+), "${resp}", "$1") |
|
__base64Encode(str) / __base64Decode(str) |
Base64编解码(如加密Token、解密响应) | 解密美团API的加密参数 | |
业务专用 | __property(key) |
读取JMeter全局属性(如共享Token、配置开关) | 获取登录Token __property(user.token) |
__V(var1_var2) |
嵌套解析变量(如动态生成订单ID order_${__Random(1,100)} ) |
动态订单号 __V(order_${__Random(1,100)}) |
|
__BeanShell(script) / __JSR223(script) |
执行自定义脚本(如复杂计算、逻辑判断) | 模拟优惠券满减逻辑 __BeanShell(...) |
使用技巧(针对采购业务)
- 动态参数化 :用
__CSVRead
读取测试数据(用户、商品、地址),__Random
生成随机参数(金额、数量)。 - 时间戳标记 :用
__time
记录请求时间,结合__threadNum
分析不同线程的性能差异。 - Token管理 :用
__property
存储登录Token,避免重复登录影响性能。 - 复杂逻辑 :用
__BeanShell
处理美团业务特有逻辑(如优惠券叠加、满减计算)。