JMeter工具入门与HTTP协议基础核心知识梳理
一、HTTP协议核心原理回顾
-
工作原理:
-
客户端 主动向 服务端 发送 请求。
-
服务端 处理请求后,向客户端返回 响应。
-
一次完整的交互 = 一个请求 + 一个响应。
-
-
数据包结构:
-
无论是请求还是响应,数据都遵循相同的格式,由 头 和 体 两部分组成。
-
Header: 存放通用信息(如元数据)。
-
Body: 存放具体的业务数据或敏感信息。
-
类比: 如同寄信,Header是信封(地址、邮编),Body是信纸(具体内容)。
-
-
请求详解:
-
请求行: 包含 请求方法、URL、协议版本。
-
常见请求方法:
-
GET:获取数据。 -
POST:提交数据。 -
PUT:更新数据。 -
DELETE:删除数据。
-
-
-
请求头: 包含关于请求的附加信息。
-
关键字段:
-
Host:目标域名和端口。 -
Content-Type:声明请求体的数据格式,至关重要。 -
Content-Length:请求体的长度。 -
User-Agent:客户端信息(如浏览器类型)。 -
Cookie:用于状态保持。
-
-
-
请求体: 存放具体的请求参数或数据。
-
常见
Content-Type与数据格式对应关系:-
application/x-www-form-urlencoded:表单格式,数据为key=value&key=value。 -
application/json:JSON字符串格式,数据为{"key": "value"}。
-
-
-
-
响应详解:
-
状态行: 包含 协议版本 和 状态码。
-
状态码:
-
2xx:成功(如200 OK)。 -
4xx:客户端错误(如404 Not Found)。 -
5xx:服务端错误(如500 Internal Server Error)。
-
-
-
响应头: 与请求头类似,包含关于响应的元数据。
-
响应体: 服务端返回的实际数据(如 HTML页面、JSON数据等)。
-
二、JMeter入门与实战
1. JMeter 简介
-
本质: 基于Java开发的开源性能测试工具。
-
来源: Apache基金会。
-
用途: 可用于功能和性能测试,支持扩展。
2. 环境准备
-
安装JDK: 必须安装 JDK 1.8 或更高版本。
-
安装JMeter: 从官网下载
binaries的ZIP包,解压即用,无需安装。 -
启动: 进入解压目录的
bin文件夹,双击jmeter.bat文件启动。
3. 初始配置(重要)
-
修改
bin目录下的jmeter.properties文件:-
语言: 搜索
language,修改为language=zh_CN,切换为中文界面。 -
编码: 搜索
sampleresult.default.encoding,修改为UTF-8,防止中文乱码。 -
注意: 修改后需重启JMeter生效。
-
4. 核心组件与第一个脚本
-
测试计划: JMeter脚本的根节点。
-
线程组:
-
地位: 所有其他组件的容器,是模拟并发用户的起点。
-
理解: 代表 一组虚拟用户。
-
操作: 右键测试计划 -> 添加 -> 线程(用户) -> 线程组。
-
-
取样器:
-
作用: 模拟用户发出的 各种请求。
-
操作: 右键线程组 -> 添加 -> 取样器 ->
HTTP请求。
-
-
HTTP请求配置:
-
协议:
http或https(不填默认为http)。 -
服务器名称/IP: 被测服务的地址(本地可用
localhost或127.0.0.1)。 -
端口号: 服务的端口(如
8080)。 -
HTTP请求: 选择请求方法(GET/POST等)。
-
路径: 接口的URI。
-
参数: 对于GET请求,在“参数”表中添加;对于POST请求,根据
Content-Type在“参数”表或“消息体数据”中填写。
-
-
监听器:
-
作用: 用来 查看、分析和保存测试结果。
-
关键组件: 查看结果树。
-
操作: 右键线程组 -> 添加 -> 监听器 ->
查看结果树。 -
功能: 可以详细查看每个请求的请求头、请求体、响应头、响应体、状态码等信息,是调试脚本的利器。
-
JMeter脚本进阶核心知识梳理
一、POST请求的两种常见参数类型
-
表单类型
-
Content-Type:application/x-www-form-urlencoded -
参数格式:
key=value&key=value(键值对形式) -
在JMeter中的位置: 在HTTP请求的 “参数” 选项卡中填写。
-
特点: JMeter默认使用此类型,无需额外配置HTTP信息头管理器。
-
-
JSON类型
-
Content-Type:application/json -
参数格式:
{"key": "value"}(JSON字符串格式) -
在JMeter中的位置: 在HTTP请求的 “消息体数据” 选项卡中填写。
-
必须配置: 必须添加 HTTP信息头管理器,并设置
Content-Type为application/json,否则服务器会返回415 Unsupported Media Type错误。
-
-
混合类型
-
格式: 参数为键值对,但值是一个JSON字符串 (例如:
param={"key": "value"})。 -
本质: 其本质仍然是表单类型,因为它遵循
key=value的格式。 -
在JMeter中的位置: 在 “参数” 选项卡中填写。
-
配置: 按表单类型处理,无需额外设置JSON的
Content-Type。
-
二、HTTP信息头管理器的作用域
-
重要原则: JMeter组件具有作用域。
-
最佳实践: 将 HTTP信息头管理器 放置在具体的HTTP请求采样器之下。
-
原因: 这样配置只会对该特定请求生效。如果放在线程组级别,会对其下的所有请求生效,可能会引起不必要的错误。
三、设置请求超时
-
位置: 在HTTP请求的 “高级” 选项卡中。
-
类型:
-
连接超时: 等待与服务器建立连接的最长时间。
-
响应超时: 等待服务器返回响应的最长时间。
-
-
单位: 毫秒 (例如:10000毫秒 = 10秒)。
-
作用: 避免因个别接口响应极慢而导致测试脚本长时间挂起,无法结束。超时后JMeter会主动断开连接并标记该请求为失败。
四、断言 - 验证接口响应
1. 为什么需要断言?
-
JMeter默认仅通过HTTP状态码 (如200) 判断请求成功与否。
-
但业务上,接口可能返回状态码200,实际业务数据却是错误的(例如搜索无结果)。
-
断言用于根据业务返回值来更精确地判断接口请求是否真正成功。
2. 响应断言
-
特点: 最通用、最常用的断言,适用于任何文本格式的响应(JSON, HTML, XML等)。
-
配置要点:
-
要测试的响应字段: 绝大多数情况选择 “响应文本”。
-
模式匹配规则:
-
包含: 响应中包含指定的字符串即算成功。(最常用)
-
匹配: 支持正则表达式的“包含”。
-
相等: 响应内容必须与指定字符串完全一致。(太严格,少用)
-
字符串: 与“包含”类似,但不支持正则表达式。
-
-
多条件判断:
-
可以添加多个断言模式。
-
默认是 “与” 关系(所有条件都必须满足)。
-
勾选 “OR” 按钮后,变为 “或” 关系(满足任一条件即可)。
-
-
3. JSON断言
-
特点: 专用于JSON格式的响应,语法更简洁。
-
核心配置:
-
JSON Path表达式: 用于定位要验证的JSON字段。
-
语法:
$.key或$.key.subKey(使用$.开头,用.表示层级)。 -
示例:
$.message或$.data.brand。
-
-
预期值: 填写该字段期望的值。
-
其他选项: 通常保持默认(验证条件为“相等”,并勾选“Validate against expected value”)。
-
总结:
-
正确处理不同参数类型,特别是JSON类型必须配置请求头。
-
合理设置超时,提升测试脚本的健壮性。
-
使用断言进行业务验证,确保性能测试的同时,业务逻辑结果的正确性。
JMeter参数化与函数高级应用核心知识梳理
一、用户自定义变量(全局变量)
-
目的: 管理公共的、固定的配置数据,实现“一处修改,处处生效”。
-
位置: 在 测试计划 面板中,找到 “用户定义的变量”。
-
应用场景: 服务器地址、端口号等所有请求共享的配置。
-
引用方式:
${变量名},例如:${IP},${PORT}。
二、参数化核心方法
1. 随机数
-
函数:
__Random -
位置: 选项 -> 函数助手对话框 ->
__Random -
参数:
-
最小值
-
最大值
-
-
作用: 在指定范围内生成随机整数。适用于ID、数量等数字型参数。
2. 随机字符串
-
函数:
__RandomString -
位置: 函数助手对话框 ->
__RandomString -
参数:
-
生成长度
-
字符源(从哪些字符中随机选取)
-
-
作用: 生成指定长度的随机字符串。适用于用户名、邮箱前缀等需要避免重复的场景。
3. 计数器
-
位置: 线程组 -> 添加 -> 配置元件 -> 计数器
-
关键配置:
-
起始值: 计数开始的值。
-
递增步长: 每次循环增加的值。
-
最大值: 计数上限,达到后根据配置循环或停止。
-
引用名称: 存储计数器值的变量名。
-
与每用户独立的跟踪计数器:
-
不勾选: 所有线程共享一个计数器。(默认)
-
勾选: 每个线程拥有独立的计数器。
-
-
-
作用: 生成有规律递增的数字,适用于需要序列化参数的场景(如user1, user2...)。
4. 文件参数化
方法一:CSV Read 函数
-
函数:
__CSVRead -
位置: 函数助手对话框 ->
__CSVRead -
参数:
-
文件路径
-
列号(从0开始)
-
-
核心特点: 按线程分配数据。每个线程在整个运行期间固定使用文件中的某一行数据,与循环次数无关。适用于模拟不同用户使用不同固定账号的场景。
方法二:CSV Data Set Config 元件(推荐)
-
位置: 线程组 -> 添加 -> 配置元件 ->
CSV Data Set Config -
关键配置:
-
文件名: 数据文件路径。
-
文件编码: 按文件实际编码选择(默认通常即可)。
-
变量名称: 定义多个变量名,用逗号分隔,对应文件中的各列。
-
忽略首行?: 文件首行是标题时设为True。
-
分隔符: 列之间的分隔符(默认为逗号)。
-
遇到文件结束符再次循环?:
-
True:数据用完后,从头开始循环使用。 -
False:数据用完后,停止线程。
-
-
遇到文件结束符停止线程?: 与上一项配合使用。
-
-
核心特点: 按循环分配数据。每次循环(无论来自哪个线程)读取下一行数据。适用于需要在整个测试中均匀使用所有测试数据的场景。
三、其他常用函数
1. 时间戳
-
函数:
__time -
作用: 获取当前时间。
-
常用格式:
-
无参数:返回13位毫秒级时间戳。(最常用)
-
带格式:返回格式化时间字符串,如
YYYY-MM-dd HH:mm:ss。
-
2. UUID
-
函数:
__UUID -
作用: 生成全局唯一的标识符字符串。
-
应用场景: 需要绝对不重复的参数,如订单号、消息ID。
四、高级技巧:函数结果存储与复用
-
问题: 如何在同一次循环中,让多个请求使用相同的随机值?
-
解决方案: 使用函数的 “存储结果的变量名” 参数。
-
步骤:
-
在第一个使用函数的地方(如
__Random),填写“存储结果的变量名”(如myVar)。 -
在本次循环后续需要该值的地方,直接使用
${myVar}引用。
-
-
效果: 在同一次循环内,该变量值保持不变;下一次循环时,会重新生成并存储。
五、核心概念辨析
-
线程数 vs 循环次数:
-
线程数: 模拟的并发用户数。
-
循环次数: 每个用户执行请求的次数。
-
总请求数 ≈ 线程数 × 循环次数。
-
-
参数化数据分配策略:
-
CSV Read函数: 按线程分配。 -
CSV Data Set Config元件: 按循环分配。
-
总结: 参数化是JMeter脚本的灵魂。选择哪种参数化方式,取决于你的测试数据和业务场景:
-
需要不重复的随机值 ->
__Random,__RandomString,__UUID -
需要有规律的序列 -> 计数器
-
使用预设好的数据文件 ->
CSV Data Set Config(最灵活通用) -
需要每个用户固定身份 ->
CSV Read函数 -
需要时间相关数据 ->
__time -
需要在同一次循环中复用动态值 -> 使用“存储结果的变量名”
熟练掌握这些方法,才能设计出能够模拟真实、复杂用户行为的性能测试脚本。


被折叠的 条评论
为什么被折叠?



