1)Jmeter 介绍
-
JMeter
是一款 JAVA 桌面应用程序,常常被用来做接口测试、负载测试等等 -
JMeter
是一款开源测试工具:- 开源免费软件,不需要任何使用费用
- 小巧绿色,相比
LoadRunner
的庞大,它非常小巧并且不需要安装(需要安装 JDK) - 功能强大,设计之初只是一个简单的性能测试工具,经过无数次更新已变得非常强大
2)Jmeter 下载安装
1、Jmeter 下载
-
Jmeter
安装包下载(解压即可)链接:https://pan.baidu.com/s/1a6iIAYP55rfY4fmdtraOnA
提取码:fapd
2、JDK 安装
-
-
JDK
安装包下载(内含安装教程)链接:https://pan.baidu.com/s/1-W5fpN4vSPRxkPMdVe6xrw
提取码:hgh4
-
-
3、Jmeter 运行
-
Jmeter 启动相当简单,双击 bin 目录下的
jmeter.bat
文件即可
3)Jmeter 功能说明
1、接口测试- 示例
-
新建线程组 => 右键测试计划 => 添加 => 添加 => 线程(用户) => 线程组
- 线程数:模拟用户请求线程数(单接口用默认值1即可)
- Ramp-Up时间(秒):启动设定线程数在设定时间内启动(单接口用默认值1即可)
- 循环次数:可勾选永远或指定循环次数(单接口用默认值1即可)
- 新建
Http
请求 => 添加 => 取样器 =>Http
请求
- 名称:接口名称
- 协议:Http 、 HTTPS
- 服务器名称或 IP : 请求服务器域名或 IP 地址
- 端口号:XXXX(默认端口 80 可以省略)
- 方法:GET、POST 等等
- 路径:(接口地址名称)
- 内容编码:UTF-8(支持中文)
- 参数:添加行参数
- 消息体数据:JSON 格式数据等
- 文件上传:测试接口带有文件(文本文件、图片文件等)
2、测试计划
-
Test Plan (测试计划):用来描述一次接口测试或性能测试相关内容,也就说测试的所有内容是于基于计划完成的
3、线程组
-
Thread Group(线程组):线程组中的每个线程都是一个虚拟用户,线程组中包含的线程数量在测试执行过程中不会发生改变
-
线程组位置:
右键测试计划 => 线程(用户) => 线程组
-
线程数:模拟用户请求线程数(即虚拟用户数)
-
Ramp-Up时间(秒):启动设定线程数在设定时间内启动,立即启动可设置0
-
循环次数:每个线程执行次数,可勾选永远或指定循环次数
-
4、取样器
-
Sampler(取样器):取样器是接口测试中向服务器发送请求,记录响应信息,记录响应时间的最小单元,Jmeter 支持特别多取样器:如 HTTP 请求、FTP 请求、JAVA 请求等等,在这里只介绍
HTTP Request(HTTP 请求)
,如需要了解更多,请自行百度 -
取样器位置:
右键线程组 => 添加 => 取样器 => Http 请求
- 名称:接口名称
- 协议:Http 、 HTTPS
- 服务器名称或 IP : 请求服务器域名或 IP 地址
- 端口号:XXXX(默认端口 80 可以省略)
- 方法:GET、POST 等等
- 路径:(接口地址名称)
- 内容编码:UTF-8(支持中文)
- 参数:添加行参数
- 消息体数据:JSON 格式数据等文件上传:测试接口带有文件(文本文件、图片文件等)
- 文件上传:测试接口带有文件(文本文件、图片文件等)
5、逻辑控制器
-
Logic Controller(逻辑控制器):逻辑控制器对其子节点的取样器有效,作用是控制取样器的执行顺序,Jmeter 总数有 17 种逻辑控制器,功能各不相同,但是大概可以分为 2 种类型
-
第一种类型:控制测试计划节点的执行顺序 (如果(if)控制器、While控制器等)
如果(if)控制器 - 示例
-
如果(if)控制器:如需要对不同的条件做不同的操作,我们可以使用(if)控制器来实现
-
条件格式:${__jexl3(条件表达式)}:表达式可使用
Jmeter 函数助手(参见12、函数助手)
-
完成需求:如果登录接口返回参数
errno = 0
,执行用户信息接口,否则不执行
-
实现步骤(已知登录接口返回 JSON 数据):
第一步:右键登录接口 => 后置处理器 => JSON 提取器
第二步:点击“选项”=> 函数助手 => 选择函数“__jexl3”=>引用变量名“login_judge”
获得函数:${__jexl3(${login_judge},)}
最终函数:${__jexl3(${login_judge}==0,)}
(判断的条件为字符串需要加"")
第三步:在(if)控制器下添加用户信息接口
While 控制器 - 示例
-
While 控制器 :一直循环执行子节点内容,直到条件为
False(假)
-
Condition 条件如下:
1、为空:直到请求失败退出循环
2、LAST:直到最后一个请求失败退出循环
3、其他:条件值为
False
,退出循环 -
While 控制器 - 示例:
登录判断 errno != 0,退出循环
-
- 第二种类型:统计执行结果以及进行脚本的运行时控制(吞吐量控制器、事务控制器等)
吞吐量控制器 - 示例
-
吞吐量控制器:它跟吞吐量没有任何关系
-
两种执行方式:设置百分比行和设置线程数控制执行执行次数
-
6、前置处理器
-
Pre Processors(前置处理器):前置处理器用于在实际的请求发出之前,对发出的请求进行特殊处理,Jmeter 提供了 8 种(这里不一一说明,主要说明用户参数)
用户参数 - 示例
- 添加变量:添加用户参数,支持多参数
- 添加用户:添加参数使用用户,支持多用户
- 每次迭代更新一次:勾选后,每次运行都要重新获取参数(针对使用随机函数)
7、后置处理器
-
Post Processors(后置处理器):后置处理器是用于对
取样器
发出请求后得到的服务器响应进行处理,一般用来提取响应中的特定数据,Jmeter 提供了 11 种(这里不一一说明,主要说明 Json 提取器与正则表达式提取器)Json 提取器 - 示例
-
如下 JSON 代码:
提取 authToken 的值
{ "errno": 0, "data": { "authToken": "37f95bc40fb0ccb0be4e922655d4660b" }, "errmsg": "登录成功" }
-
位置:
添加 => 后置处理器 => Json 提取器
- 引用变量:
${authToken}
-
- 正则表达式 提取器 - 示例(可以提取任何格式数据,这以JSON数据为例)
-
如下 JSON 代码:
提取 authToken 的值
{ "errno": 0, "data": { "authToken": "37f95bc40fb0ccb0be4e922655d4660b" }, "errmsg": "登录成功" }
- 位置:
添加 => 后置处理器 => 正则表达式提取器
8、断言
-
Assertions(断言)一般用来设置检查点,用于检测
实际数据是否符合预期
,Jmeter 总数有13 种断言(这里不一一说明,主要说明:响应断言与 JSON 断言)响应断言 - 示例
-
如下 JSON 代码:
断言 errno = 0 为接口成功,反之接口失败
{ "errno": 0, "data": { "authToken": "37f95bc40fb0ccb0be4e922655d4660b" }, "errmsg": "登录成功" }
- 位置:
添加 => 断言 => 响应断言
-
- JSON 断言 - 示例
-
如下 JSON 代码:
断言 errno = 0 为接口成功,反之接口失败
-
位置:
添加 => 断言 => JSON 断言
9、定时器
-
Timer(定时器)用于操作之间设置等待时间,也就是我们常说的思考时间,Jmeter 有9 种定时器(这里不一一说明,主要说固定定时器、高斯随机定时器)
-
定时器作用域:定时器是在每个取样器之前执行,如果希望定时器仅应用于其中一个取样器,则在其子节点中加入,定时器的延时不会计入取样器的响应时间
固定定时器 - 示例
-
固定定时器:
登录请求延迟1000毫秒执行
-
位置:
添加 => 定时器 => 固定定时器
-
高斯随机定时器 - 示例
-
高斯随机定时器:
要求随机时间在200毫秒~300毫秒之间
-
位置:
添加 => 定时器 => 高斯随机定时器
-
10、配置元件
-
Config Element(配置原件),用于提供对各种数据支持,Jmeter 有19种配置原件(这里不一一说明,主要说明 CSV 数据文件设置、HTTP 信息头管理器、HTTP 请求默认值、用户自定义变量)
CSV 数据文件设置 - 示例
-
CSV 数据文件设置:
-
位置:
添加 => 配置元件 => CSV 数据文件设置
-
准备 CSV 格式数据:
- 配置 CSV 数据
- 引用 CSV 数据:
-
HTTP 信息头管理器 - 示例
-
HTTP 信息头管理器:
-
位置:
添加 => 配置元件 => HTTP 信息头管理器
- 执行后结果:
用户自定义变量 - 示例
-
用户自定义变量:定义变量 phoneNumber = 18589236787
-
位置:
添加 => 配置元件 => 用户自定义变量
- 引用自定义变量:
11、监听器
-
Listener(监听器),用于对测试结果数据处理和可视化展示的一系列元件,Jmeter 提供了16 种监听器(这里不一一说明,只讲解最常用察看结果树、聚合报告)
察看结果树 - 示例
-
察看结果树:显示了每一个取样器的结果、请求信息和响应信息,可以分析接口是否存在问题
-
位置:
添加 => 监听器 => 察看结果树
-
聚合报告 - 示例
-
聚合报告:对于每个请求统计响应信息并提供请求数、平均值、最大、最小值、错误率、大约吞吐量、kb/秒为单位的吞吐量
-
位置:
添加 => 监听器 => 聚合报告
-
报告内容分析:
-
1、Label:请求名称
2、#Samples:总线程数 = 线程数 * 循环次数
3、Average:单个请求的平均响应时间 = 总运行时间 / 发送到服务器的总请求数
4、Median、90%line、95%line、99%line:分别代表50%的用户响应时间、90%的用户响应时间、95%的用户响应时间、99%的用户响应时间(90%line是性能测试重要的一个衡量指标)
5、Min:最小响应时间
6、Max:最大响应时间
7、Error%:错误率 = 发生错误的请求 / 总请求数
8、Throughput:吞吐量,表示每秒完成的请求数
9、KB/sec:每秒发送的千字节为单位测量数据
12、函数助手
-
函数助手对话框(Ctrl + Shift + F1),可以参照一定的规则生成数据函数,Jmeter 支持的函数特别多(不一一说明,主要说明随机数、当前时间、唯一ID)
随机数函数 - 示例
- 随机数函数:可按照一定规则生成需要的随机数
- 位置:
选项 => 函数助手对话框 => 随机数函数 => __Random()
当前时间函数 - 示例
- 随机数函数:可按照一定规则生成时间函数
- 位置:
选项 => 函数助手对话框 => 随机数函数 => __time()
-
时间格式说明:
1、${__time(yyyy-MM-dd HH:mm:ss:SSS,time)} :格式化生成时间格式 2100-01-01 11:08:23:635
2、${__time(yyyy-MM-dd HH:mm:ss,time)} :格式化生成时间格式 2100-01-01 11:08:23
3、${__time(yyyy-MM-dd,time)} :格式化生成时间格式 2100-01-01
4、${__time(,)}:默认该公式精确到毫秒级别, 13位数 1527822855323
-
唯一ID函数 - 示例
唯一ID函数:可按照一定规则生成需要的唯一表示
位置:选项 => 函数助手对话框 => 随机数函数 => __UUID()