一、JMeter的简单介绍
1. JMeter安装使用
JMeter是一款基于Java语言开发的工具,可用于接口测试与性能测试。由于其依赖Java环境,因此在安装JMeter之前,需先配置好Java运行环境,建议使用Java 8或更高版本。
安装步骤如下:
- 安装Java环境: JMeter由Java编写,必须确保系统中已安装JRE或JDK,推荐版本为Java 8及以上。
- 下载JMeter: 访问JMeter官方网站的下载页面,在“Binaries”分类下选择合适的压缩包进行下载。
- 解压并启动: 下载完成后解压文件,进入解压目录中的bin文件夹,通过终端执行启动命令。
示例操作(以macOS为例):
# 进入bin目录 /Applications/apache-jmeter-5.6.3/bin # 启动JMeter sh jmeter
成功启动后将显示以下界面:
2. JMeter文件目录结构
JMeter解压后的主目录包含多个子目录,各具不同功能:
- bin: 存放启动脚本、配置文件、模板及日志信息。初次使用时,建议修改核心配置文件
jmeter.properties,例如设置语言和编码:
language=zh_CN sampleresult.default.encoding=utf-8
- extras: 用于集成第三方插件或构建工具(如Maven)。
- lib: 存放JMeter运行所依赖的jar包,所有扩展功能的库文件均放在此处。
- backups: 自动保存的jmx测试脚本备份文件存储目录。
jmeter.bat: windows的启动文件
jmeter.log: 日志文件
jmeter.sh: linux的启动文件
3. JMeter基本使用流程
需求目标: 使用JMeter访问百度首页接口,并查看请求与响应数据。
具体操作流程:
- 启动JMeter应用程序。
- 在“测试计划”下添加一个“线程组”。
- 在线程组中添加一个“HTTP请求”取样器。
- 填写HTTP请求的相关参数(如协议、服务器地址等)。
- 再在线程组下添加“查看结果树”监听器。
- 点击“启动”按钮运行测试,随后在监听器中查看详细结果。
4. JMeter的基本元件
JMeter由多种元件构成,它们共同协作完成完整的测试任务。
常用元件列表
- 测试计划(必需)
- 线程组(必需)
- 配置元件
- 前置处理器
- 定时器
- 逻辑控制器
- 取样器(必需)
- 后置处理器
- 断言
- 监听器(必需)
常用元件功能详解
- 测试计划: 所有测试的起点。支持独立运行各个线程组,并可导入外部jar包扩展功能。
- 线程组: 模拟用户行为的核心组件。关键属性包括:
- 线程数: 表示虚拟用户数量,接口测试通常设为1。
- Ramp-Up时间: 启动所有线程所需的时间,默认建议为1秒。
- 循环次数: 每个线程执行请求的次数。
- 配置元件: 负责初始化测试环境与数据,类似于自动化脚本中的setup阶段。常见类型包括:
- HTTP请求默认值
- HTTP Cookie管理器
- 用户定义的变量
- 前置处理器: 在发送请求前对数据进行预处理,实现参数化等功能。
- 逻辑控制器: 控制请求的执行逻辑,支持条件判断、循环等结构。
- 定时器: 设置请求之间的延迟时间,相当于代码中的sleep操作。
- 取样器: 发送实际请求到服务器,是必须存在的元件,如HTTP请求、Java请求等。
- 后置处理器: 对服务器返回的响应内容进行提取处理,类似从响应体中获取特定字段。
- 断言: 验证响应结果是否符合预期,起到校验作用。
- 监听器: 展示测试执行过程中的结果与日志,提供多种形式的结果展示,如树状视图、表格等。
5. 元件作用域
元件的作用范围由测试计划中的树形结构决定,尤其是父子节点关系。
核心原则围绕“取样器”展开:
- 取样器本身无作用域概念。
- 逻辑控制器仅对其子节点下的元件生效。
- 其他元件:
- 若父节点为取样器,则仅对该取样器有效。
- 若父节点非取样器,则对其下所有子节点及其后代元件均有效。
由此得出三个结论:
- 元件可以作用于其父级元件。
- 元件可以影响同层级的其他元件。
- 元件能够作用于同级元件下的所有子元件。
6. 元件的执行顺序
在JMeter中,各元件按照固定顺序依次执行:
执行流程为: 配置元件 → 前置处理器 → 定时器 → 取样器 → 后置处理器 → 断言 → 监听器
注意事项: 配置元件、前置处理器和后置处理器必须依赖于取样器才能触发执行,无法单独运行。
二、JMeter的三个重要组件
1. 线程组
线程组的介绍
线程组是JMeter中最基础也是最重要的组件之一,用于模拟并发用户的行为。它是所有取样器运行的基础容器。
线程组的属性
- 线程数: 定义并发用户的数量。
- Ramp-Up时间: 表示在多长时间内启动全部线程。
- 循环次数: 指定每个线程重复执行测试的次数。
2. HTTP请求(取样器)
HTTP请求元件属于取样器的一种,用于向目标服务器发送HTTP/HTTPS请求。可通过设置协议、主机名、端口、路径、方法(GET/POST)、参数等来构造完整的请求。
3. 查看结果树
该监听器用于展示每一个请求的详细发送与接收信息,包括请求头、请求体、响应数据、响应码等,便于调试和验证测试结果。
三、JMeter参数化
为了提升测试灵活性,JMeter支持多种参数化方式,使测试数据可动态变化。
1. 用户定义的变量
在测试计划或线程组级别定义全局变量,适用于在整个测试过程中保持不变的数据。
2. 用户参数
允许为每个线程(用户)分配不同的参数值,常用于模拟多用户登录等场景。
3. CSV数据文件设置
通过读取外部CSV文件中的数据实现批量参数化输入,适合大量测试数据的驱动测试。
4. 函数方式参数化
利用内置函数(如__Random、__time、__threadNum等)生成动态值,实现更灵活的参数控制。
.tgz
bin
sh jmeter在同一个作用域中,相同类型的元件会按照从上到下的顺序依次执行。
JMeter的核心组件解析
1. 线程组
线程组的作用:通过设置线程数量来模拟真实用户行为。其中,每个线程代表一个虚拟用户,而线程组则相当于一组并发用户集合。
主要特点:
- 支持多用户并发模拟
- 取样器与逻辑控制器必须置于线程组之下才能生效
- 一个测试计划可包含多个线程组,这些线程组可以并行或串行运行
执行模式说明:
- 并行执行:默认情况下,各线程组同时启动
- 串行执行:若在测试计划中勾选“独立运行每个线程组”,则所有线程组将按上下顺序逐一执行
线程组的分类
- setup线程组:用于测试前的准备工作,在所有其他线程组之前最先执行
- 普通线程组:承载核心业务逻辑和性能测试脚本的主体部分
- teardown线程组:负责测试结束后的清理工作,如环境恢复、数据清理等,最后执行
线程组的关键属性配置
- 线程数:设定并发用户的数量
- Ramp-up时间:指所有虚拟用户完成启动所需的时间(单位:秒)
- 循环次数:
- 可指定具体循环次数
- 也可设为“永远”循环,需配合调度器使用
- 持续时间:控制整个测试脚本的运行时长
- 延迟启动时间:设置脚本延迟多少秒后开始执行
注意:线程数m与循环次数n的关系:
- 当两者同时配置时,实际发出的HTTP请求数量为 m × n
- 尽管总请求数相同,但二者不可互换:
- 线程数反映服务器负载压力(并发用户数)
- 循环次数体现的是执行时间维度
例如:
- 设置线程数为1,循环次数为5,则结果中显示均为“线程组1-1”,表示同一用户连续发送5次请求
- 若设置线程数为5,循环次数为1,则会看到5个不同的线程实例分别执行一次请求
2. HTTP请求(取样器)
- 协议类型:支持HTTP或HTTPS,默认为HTTP
- 服务器名称或IP:填写目标服务地址
- 端口号:HTTP默认80,HTTPS默认443
- 请求方法:支持GET、POST、PUT、DELETE等标准HTTP方法
- 路径:包含目录结构及查询参数
- 编码格式:建议统一使用UTF-8编码
补充说明:
完整的HTTP请求由四个要素构成:请求方法、请求路径、请求头、请求体。
关于请求头管理:
- 可通过“HTTP信息头管理器”进行配置
- 若仅对单个请求生效,应将其放置于对应取样器下
- 若需应用于全部请求,则应与取样器同级,直接放在线程组下
请求参数传递方式(四种):
- Params(查询字符串):适用于GET请求,参数以键值对形式附加在URL后,使用?分隔
- Form表单:常用于POST请求,提交键值对形式的数据
- JSON字符串:在请求体中发送JSON格式数据
- File文件:实现文件上传功能
3. 查看结果树
- 取样器结果:展示请求的详细统计信息
- 请求部分:包括完整的请求头与请求体内容
- 响应部分:展示响应头与响应体的原始数据,便于调试分析
JMeter参数化技术详解
1. 用户定义的变量
方式一:通过配置元件添加
- 路径:线程组 → 配置元件 → 用户定义的变量
- 配置项:参数名 + 参数值
- 引用方式:在HTTP请求中使用 ${变量名} 调用
方式二:在测试计划层级直接定义
- 操作:在测试计划界面中添加用户定义变量
- 引用方式:同样使用 ${变量名} 进行调用
两种方式的区别:
- 第一种方式定义的变量仅在当前线程组内有效
- 第二种方式定义的变量作用范围覆盖整个测试计划下的所有线程组
2. 用户参数
- 添加路径:线程组 → 前置处理器 → 用户参数
- 配置说明:
- 参数:定义变量名称
- 参数值:为不同用户分配各自的值
- 使用方式:在取样器中通过 ${变量名} 引用
查看执行效果:
3. CSV数据文件设置
应用场景:需要循环3次,每次请求携带不同的 username、password、code 参数值,如何实现?
- 添加路径:线程组 → 配置元件 → CSV数据文件设置
- CSV文件编写规范:
- 多个参数作为多列,使用逗号分隔
- 多组数据使用多行表示
配置项说明:
- 文件路径:推荐使用相对路径以增强可移植性
- 文件编码:建议设置为UTF-8
- 变量名称:与CSV列对应,多个变量名之间用逗号分隔
- 是否忽略首行:决定是否跳过标题行读取数据
- 分隔符:必须与CSV文件中的实际分隔符一致
- 遇到文件末尾是否循环:默认为TRUE,即循环读取
- 遇到文件末尾是否停止线程:仅当前一项为FALSE时该选项才生效,通常建议设为TRUE
4. 函数方式实现参数化
首先打开JMeter内置的函数助手对话框:
选择 counter 函数进行计数器配置:
- TRUE:每个线程拥有独立的计数器实例
- FALSE:所有线程共享同一个全局计数器
在取样器中,可以通过使用 ${__counter(FALSE,)} 来获取对应的数值。
适用场景:当所需参数化数据仅需满足唯一性,而对具体取值没有特定要求时,推荐采用函数的方式来实现。
接下来我们逐步了解实际操作流程:
配置函数参数时,请注意界面中的提示说明:若将参数设为 TRUE,则每个线程(即每个虚拟用户)将拥有独立的计数器,例如各自的计数都从1开始;若设置为 FALSE,则所有线程共享一个全局计数器。
如果文字描述不够直观,可参考以下图示说明:
当参数为 TRUE 时,各线程使用各自的计数器,因此生成的结果会是三组独立的 1 和 2;
当参数为 FALSE 时,所有线程共用同一个计数器,此时输出的值将按顺序从 1 连续递增至 6。
本部分内容到此结束,敬请期待后续更新。


雷达卡


京公网安备 11010802022788号







