性能测试-jmeter实战5
课程:B站大学
记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师
性能测试-jmeter元件实操作
- Jmeter元件
-
- 一、测试计划类(Test Plan)
- 二、线程控制器(Controllers)
- 三、取样器(Samplers)
- 四、监听器(Listeners)
- 五、断言(Assertions)
- 六、定时器(Timers)
- 七、前置处理器(Pre-Processor)
- 八、后置处理器(Post-Processor)
- 九、配置元件(Config Elements)
- 十、函数助手对话框(Function Helper Dialog)
- 元件作用域
-
- 作用域的原则
- jmeter实操1:
- 重要组件
- jmeter中操作如下:
- 线程组的属性:
- HTTP取样器的属性:
- Jmeter参数化
-
- 用户定义的变量
- 用户参数
- CSV Data Set Config
-
- 参数详解(CSV 数据文件设置)
- 函数
-
- 性能测试业务中常用函数
- 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
接口请求方式对应的参数格式如下:
key1=value1&key2=value2
key1=value1&key2=value2
2.
multipart/form-data
3.
{\"key\":\"value\"}
4.
...
/api/1
或 {\"id\":1}
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)
__RandomString(length, chars)
__RandomString(8, abc123)
__UUID
__UUID
__threadNum
Thread-${__threadNum}
__time()
__time()
__time(format)
yyyyMMddHHmmss
生成订单时间)__time(yyyyMMddHHmmss)
__dateTimeConvert()
yyyyMMdd→yyyy-MM-dd
)__RandomFromMultipleVars(var1,var2,...)
__RandomFromMultipleVars(shop1,shop2)
__CSVRead(filename, column)
users.csv
第1列用户名__split(str, delimiter)
__split(${resp}, \",\")
__regexFunction(regex, str, template)
__regexFunction(order_(\\d+), \"${resp}\", \"$1\")
__base64Encode(str)
/ __base64Decode(str)
__property(key)
__property(user.token)
__V(var1_var2)
order_${__Random(1,100)}
)__V(order_${__Random(1,100)})
__BeanShell(script)
/ __JSR223(script)
__BeanShell(…)
使用技巧(针对采购业务)
- 动态参数化:用
__CSVRead
读取测试数据(用户、商品、地址),__Random
生成随机参数(金额、数量)。 - 时间戳标记:用
__time
记录请求时间,结合__threadNum
分析不同线程的性能差异。 - Token管理:用
__property
存储登录Token,避免重复登录影响性能。 - 复杂逻辑:用
__BeanShell
处理美团业务特有逻辑(如优惠券叠加、满减计算)。