Jmeter基础

1. 介绍

Jmeter 是 Apche 公司使用 Java 平台开发的一款测试工具,其主要功能如下👇:

  • 接口测试(http接口)
  • 性能测试
  • 压力测试(优势)
  • 数据库测试
  • Java程序测试

2. 元件

元件即为多个类似功能组件的容器(类似于类),组件用于实现独立的某个功能(类似于方法)

  • 取样器:发送请求
  • 逻辑控制器:控制语句的执行顺序
  • 前置处理器:对请求参数进行预处理
  • 后置处理器:对响应结果进行提取
  • 断言:检查接口的返回结果是否与预期结果一致
  • 定时器:设置等待
  • 测试片段:封装一段代码,供其他脚本调用
  • 配置元件:测试数据的初始化配置
  • 监听器:查看Jmeter脚本的运行结果

作用域原则

  • 取样器:核心,没有作用域
  • 逻辑控制器:只对其子节点中的取样器和逻辑控制器起作用
  • 其余元件
    • 如果是某个取样器的子节点,则该元件只对其父节点起作用
    • 如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点(包括子节点,子节点的子节点等)

执行顺序

  • 同一作用域下不同元件

    配置元件 --> 前置处理程序 --> 定时器 --> 取样器 --> 后置处理程序 --> 断言 --> 监听器

  • 同一作用域下相同元件

    从上到下的顺序依次执行

例子

各组件执行顺序如下【保证 IF 控制器能正常进入的情况下】👇

定时器1 --> HTTP请求1 --> 定时器1 --> 定时器2 --> HTTP请求2 --> 定时器1 --> 定时器3 --> HTTP请求3

解释

  1. 同一作用域下,定时器优先级高于取样器,因此首先执行定时器1 ,再者为HTTP请求1
  2. 除去取样器与逻辑控制器外,其余元件如果其父节点不是取样器,则其作用域是该元件父节点下的其他所有后代节点。定时器1的父节点为线程组,不属于取样器,因此在后代节点发挥作用前会再次调用定时器1
  3. 进入逻辑控制器,按照其优先级顺序分别执行定时器2HTTP请求2定时器3 是取样器的子节点,因此也发挥作用,最后是HTTP请求3

3. 三个重要组件

3.1 线程组

特点

  • 模拟用户,支持多用户操作
  • 多个线程组可以串行执行,也可以并行执行

分类

  • 普通线程组:编写脚本
  • setup 线程组:前置处理,初始化
  • teardown 线程组:后置处理,环境恢复等

属性

循环次数是指每个线程的循环次数

案例分析:

使用 1 个线程组,添加 HTTP 请求(百度)

  • 配置线程数为2,循环次数为 3 时,运行观察结果
  • 配置线程数为3,循环次数为 2 时,运行观察结果,对比是否有不同

相同点:从请求数量来说,是完全相同的

不同点:场景不同

  • 线程数:代表用户数,即性能测试时的负载量(线程数为 2 比线程数为 3 对应的负载量小)
  • 循环次数:代表时间,即性能测试时的运行时间(循虾次数 3 比循环次数 2 对应的时间长)

3.2 HTTP取样器

作用:向服务器发送http及https请求

位置:选中线程组 --> 右键 --> 添加 --> 取样器 --> HTTP请求

3.3 查看结果树

作用:查看结果

位置:选中线程组 --> 右键 --> 添加 --> 监听器 --> 查看结果树

4. 参数化

使用参数的方式来替代脚本中的固定测试数据

实现方式:

  • 定义变量(最基础)
  • 文件定义的方式(所有测试数据都是固定的情况下)
  • 数据库的方式(灵活,业务测试常用)
  • 函数的方式(灵活,业务测试常用)

4.1 用户定义的变量

作用 :定义全局变量

位置:线程组 --> 配置元件 -->用户定义的变量

4.2 用户参数

作用:针对同一组参数,当不同用户来访问时,可以获取到不同的值

位置:选中线程组 --> 右键 --> 添加 --> 前置处理器 --> 用户参数

  1. 添加线程数为 n(代表模拟的用户数)
  2. 添加用户参数
    • 第一列添加多个变量名
    • 后续每一列为一组用户的数据
  3. 添加 HTTP 请求,引用定义的变量名,格式:${}$
  4. 添加查看结果数

案例:向百度发送两次get请求,携带name与age参数,值分别为张三、李四,18、20

线程组中的线程数设置为 2 模拟两个用户

发送的两次请求URL路径如下👇

4.3 csv数据文件设置

作用:让不同用户在多次循环时,可以取到不同的值

位置:线程组 --> 配置元件 --> CSV数据文件设置

使用方法与用户参数类似

4.4 counter函数

作用:自动生成不重复的数据,让每个用户每次循环都能取到不同数据,且不需要提前定义

位置:菜单栏点击工具 --> 函数助手对话框

5. 断言

检查实际的返回结果是否与预期结果保持一致

Jmeter 有自动校验机制,即自动判断响应状态码(2xx:成功,4xx/5xx:失败)

  • 响应断言:对任意格式的响应数据进行断言
  • json断言:对 json 格式的响应数据进行断言
  • 持续时间断言:对响应时间进行断言

5.1 响应断言

作用:对HTTP请求的任意格式响应结果进行断言

位置:线程组 --> HTTP请求 --> 断言 --> 响应断言

当测试字段预期结果与实际结果不符时,在查看结果树中会出现如下提示

5.2 JSON断言

作用:对 HTTP请求的 json 格式响应数据进行断言

位置:线程组 --> HTTP请求 --> 断言 --> JSON 断言

5.3 持续时间断言

作用:对响应时间进行断言

位置:线程组 --> HTTP请求 --> 断言 --> 断言持续时间

当持续时间超出最高值时,在查看结果树中会出现如下提示

6. 关联

请求之间有依赖关系,一个请求的响应数据作为另一个的请求参数来传递

6.1 正则表达式提取器

作用:针对任意格式的响应数据进行提取

位置:线程组 --> HTTP请求 --> 后置处理器 --> 正则表达式提取器

模板中,计数以括号为单位,$1$代表第一个括号匹配的值

匹配数字是对每个括号匹配元素的计数

案例:向哔哩哔哩发送请求,获取其title值并作为关键字访问百度

查看结果树结果如下

6.2 XPath提取器

作用:针对HTML格式的响应结果数据进行提取

位置:线程组 --> HTTP请求 --> 后置处理器 --> XPath提取器

6.3 JSON提取器

作用:针对 JSON 格式的响应结果数据进行提取

位置:线程组 --> HTTP请求 --> 后置处理器 --> JSON提取器

6.4 Jmeter属性

需要实现跨线程组的数据传递时,可以使用 JMeter 属性,将线程组的局部属性存储为全局属性

案例:在线程 1 保存请求(http://m.nmc.cn/rest/predict/59289?_=1708762524613)返回的 json 数据中city关键字对应的值,并在线程2中用于百度搜索

其测试计划对应如下:

首先使用 JSON 提取器保存关键值到线程 1 中

接着使用 setProperty 函数实现局部变量到全局变量的转换,同时在此线程组中添加 BeanShell 取样器用于执行此函数,完成变量保存

再次调用函数助手,生成 property 函数

最后在线程组 2 中需要传参的地方调用函数,完成传参

查看结果树

7. 直连数据库

7.1 应用场景

  1. 用户请求的参数化

    例如登录时需要的用户名,可以从数据库中查询获取

  2. 用作结果的断言

    例如添加购物车下订单,检查接口返回的订单号,是否与数据库中生成的订单号一致

  3. 清理垃圾数据

    例如添加商品(商品号/编号等不能重复),再执行该脚本不能成功,需要在下次执行前删除该商品数据

  4. 准备测试数据

    例如通过数据库来准备大量性能测试数据

7.2 关键配置

将 MySQL 驱动 jar 包放入到 lib/ext 目录下,重启 JMeter

连接数据库配置

位置:线程组 --> 配置元件 --> JDBC Connection Configuration

执行SQL语句配置

位置:线程组 --> 配置元件 --> JDBC Request

由于查询的数据条数未知,因此实际上存储的变量名会在 Variable names 的基础上进行编号,如 Variable names 若为 var,则实际上其第一条元素变量引用名为 var_1

完成配置与语句编写,执行后通过查看结果树即可得到查询结果

8. 逻辑控制器

8.1 IF控制器

作用:控制其下测试元素是否运行

位置:线程组 --> 逻辑控制器 --> IF控制器

8.2 循环控制器

作用:控制其下测试元素循环执行

位置:线程组 --> 逻辑控制器 --> 循环控制器

8.3 ForEach控制器

作用:一般和用户自定义变量或者正则表达式提取器一起使用,读取返回结果中一系列相关的变量值。该控制器下的取样器都会被执行一次或多次,每次读取不同的变量值

位置:线程组 --> 逻辑控制器 --> ForEach控制器

结束循环字段不填时默认遍历到最后一个

案例:引用用户自定义变量访问网站

ForEach控制器设置如下

9. 定时器

9.1 同步定时器

作用:测试抢购、秒杀或者抢红包等高并发的场景下使用

位置:线程组 --> HTTP请求 --> 同步定时器

设置超时时间需要注意以下两点:

  • 建议设置:不设置的话,若没有达到设置的线程数会一直死等
  • 不能设置太小:等待时间后还没达到设置的线程数,会释放已到达的线程

通过监听器中的聚合报告可以查看线程发送的动态过程

9.2 常数吞吐量定时器

作用:让 JMeter 按指定的吞吐量执行,以每分钟为单位

位置:线程组 --> HTTP请求 --> 定时器 --> 常数吞吐量定时器

QPS(Queries-per-second)即每秒查询率

9.3 固定定时器

作用:让请求间隔一定时间后再执行

位置:线程组 --> HTTP请求 --> 定时器 --> 固定定时器

10. 测试报告

10.1 聚合报告

作用:收集性能测试结束后,系统的各项性能指标。如:响应时间、并发数、吞吐量、错误率等

位置:测试计划 --> 监听器 --> 聚合报告

  • Label:每个请求的名称
  • 样本:各请求发出的数量
  • 平均值:平均响应时间(单位:毫秒)
  • 中位数:中位数,50% <= 时间
  • 90%百分比:90% <= 时间
  • 95%百分比:95% <= 时间
  • 99%百分比:99% <= 时间
  • 最小值:最小响应时间
  • 最大值:最大响应时间
  • 异常%:请求的错误率
  • 吞吐量:吞吐量。默认情况下表示每秒完成的请求数,一般认为它为TPS
  • 接收KB/sec:每秒接收到的千字节数
  • 发送KB/sec:每秒发送的千字节数

10.2 HTML测试报告

作用:JMeter 支持生成 HTML 测试报告,以便从测试计划中获得图表和统计信息

shell 复制代码
# 命令需在jmeter的bin目录下执行
# 存放结果在jmeter中bin目录下的report文件夹,保证此时无report目录
jmeter -n -t "测试计划.jmx" -l 测试结果.jtl -e -o ./report

11. 并发数计算

普通方法

  • 并发TPS = 总请求数/总时间
  • 只能满足最基本的要求,但是不能很好覆盖系统正常的使用情况

二八原则

  • 并发TPS = 总请求数 * 80% / (总时间 * 20%)
  • 满足系统绝大多数情况下的应用场景需要

根据业务运营数据的统计计算(通常用来做稳定性测试)

  • 并发 TPS = 有效请求数 * 80% / (有效时间 * 20%)
  • 当运营数据统计越精确时,计算出的并发TPS与实际的越接近

根据用户峰值业务操作来计算(通常用来做压力测试)

  • 并发TPS = 峰值请求数 / (峰值时间 * 系数)
  • 满足峰值请求时间段内的负载量,系数取决于项目组对于未来业务量的评估

例子

某购物商城,经过运营统计,正常一天成交额为100亿,客单价平均为300元,交易时间主要为 10:00 - 14:00,17:00 - 24:00,其中 19:00 - 20:00 的成交量最大,大约成交20亿。

现升级系统,需要进行性能测试,保证软件在上线后能稳定运行。

请计算出系统稳定性测试时的并发(负载)量,及保证系统峰值业务时的并发(负载)量。
稳定并发量: 100 E 300 × 0.8 3600 × 11 ∗ 0.2 压力并发量: 20 E 300 3600 × 1 × 系数 稳定并发量: \dfrac{\frac{100E}{300} \times 0.8}{3600\times11*0.2}\\ 压力并发量: \dfrac{\frac{20E}{300} }{3600\times1\times系数} 稳定并发量:3600×11∗0.2300100E×0.8压力并发量:3600×1×系数30020E

12. Jmeter插件

使用第三方的扩展功能,可以使得 Jmeter 更为强大

使用插件前,首先需要安装Jmeter插件管理工具,下载地址如下所示👇:

https://jmeter-plugins.org/wiki/PluginsManager/

将下载后的 jar 包放入Jmeter的 lib/ext 目录下,接着按照此博客方法进行配置:Jmeter插件管理器打开报错解决办法

点击菜单栏"选项" --> "JMeter Plugins Manager",若能顺利显示如下👇界面,则说明准备工作完成。

在 Available Plugins 中添加如下四个插件,后续需要使用

12.1 阶梯线程组

作用:阶梯加压,图形界面显示运行状态

添加方式:线程(用户) --> Concurrency Thread Group

12.2 各种图表监听器

作用:统计各个事务每秒成功的事务个数

添加方式:线程组 --> 监听器 --> Transactions per Second

作用:查看服务器吞吐流量(单位/字节)

添加方式:线程组 --> 监听器 --> Bytes Throughput Over Time

作用:用来监控服务端的性能资源指标的工具,包括cpu、内存、磁盘、网络等性能数据

添加方法:线程组 --> 监听器 --> PerfMon Metrics Collector

注意:使用之前需要在服务器端安装监听服务程序并启动

  • 下载安装包 ServerAgent-2.2.3.zip,链接地址:https://github.com/undera/perfmon-agent
  • 上传到服务器上,并解压 ServerAgent-2.2.3.zip
  • 启动,如果是 Windows 运行 startAgent.bat ,如果是 Linux 运行 startAgent.sh
  • 启动这个工具后,Jmeter 的插件 PerfMon Metrics Collector 就可以收集服务端的资源使用率,并在 Jmeter 中查看了

除此之外还要其余一些指标的监听器,此处不再一一展示

相关推荐
默金……12 小时前
jmeter跨进程实现变量共享-全局变量
jmeter
字节程序员1 天前
JMeter 二次开发之环境准备
jmeter
测试杂货铺1 天前
Jmeter压测实战:Jmeter二次开发之自定义函数
自动化测试·软件测试·测试工具·jmeter·职场和发展·测试用例·压力测试
字节程序员1 天前
Jmeter对图片验证码的处理【超详细】
jmeter
测试老哥2 天前
Jmeter测试脚本编写技巧
自动化测试·软件测试·功能测试·测试工具·jmeter·职场和发展·性能测试
易思涯2 天前
【已解决】黑马点评项目jmeter高并发测试中用户数据的生成
jmeter·解决方法·黑马点评
霍格沃兹测试开发学社测试人社区2 天前
软件测试丨性能测试工具-JMeter
软件测试·测试开发·测试工具·jmeter·性能测试
字节程序员3 天前
Jmeter分布式压力测试
分布式·jmeter·压力测试
美团测试工程师3 天前
九大高效的前端测试工具与框架
软件测试·测试工具·jmeter
love静思冥想3 天前
JMeter 使用详解
java·jmeter