【软件测试】性能测试工具 JMeter

性能测试工具 JMeter

  • [一. JMeter 下载与环境配置](#一. JMeter 下载与环境配置)
  • [二. JMeter 介绍](#二. JMeter 介绍)
    • [1. JMeter 基本使用](#1. JMeter 基本使用)
    • [2. JMeter 元件作用域和执行顺序](#2. JMeter 元件作用域和执行顺序)
    • [3. JMeter 重点组件](#3. JMeter 重点组件)
      • [(1). 线程组](#(1). 线程组)
      • [(2). HTTP 请求](#(2). HTTP 请求)
      • [(3). 查看结果树](#(3). 查看结果树)
      • [(4). HTTP 请求默认值](#(4). HTTP 请求默认值)
      • [(5). HTTP 信息头管理器](#(5). HTTP 信息头管理器)
      • [(6). JSON 提取器](#(6). JSON 提取器)
      • [(7). 用户定义的变量](#(7). 用户定义的变量)
      • [(8). JSON 断言](#(8). JSON 断言)
      • [(9). 同步定时器](#(9). 同步定时器)
      • [(10). 事务控制器](#(10). 事务控制器)
      • [(11). CSV 数据文件设置](#(11). CSV 数据文件设置)
      • [(12). HTTP Cookie 管理器](#(12). HTTP Cookie 管理器)
    • [4. Jmeter 插件](#4. Jmeter 插件)
      • [(1). Stepping Thread Group](#(1). Stepping Thread Group)
      • [(2). Response Times Over Time](#(2). Response Times Over Time)
      • [(3). Transactions per Second](#(3). Transactions per Second)
  • [三. 接口性能测试报告](#三. 接口性能测试报告)
  • [四. 性能分析](#四. 性能分析)
    • [1. 响应时间](#1. 响应时间)
    • [2. 错误率(可靠性)](#2. 错误率(可靠性))
    • [3. 吞吐量](#3. 吞吐量)

一. JMeter 下载与环境配置

Apache JMeter 是 Apache 组织基于 Java 开发的压力测试工具,用于对软件做性能测试。

JDK 下载:https://www.oracle.com/java/technologies/downloads/#jdk25-windows

JMeter 下载:https://jmeter.apache.org/download_jmeter.cgi



修改字体为中文:

添加环境变量:

二. JMeter 介绍

1. JMeter 基本使用

启动 JMeter:

在 "测试计划" 下添加 "线程组":

使用 Postman 发送登录博客系统请求:


在 "线程组" 下添加 "HTTP" 取样器:

填写 "HTTP请求" 的相关请求数据:

在 "线程组" 下添加 "查看结果树" 监听器:

点击 "启动" 按钮运行,查看接口测试结果:

2. JMeter 元件作用域和执行顺序

在 JMeter 中,元件的作用域和执行顺序是非常重要的概念。

  • 作用域:JMeter 元件的作用域主要由测试计划的树形结构中的元件父子关系来确定。
  • 执行顺序:取样器元件内组件不依赖其他元件就可执行,因此取样器不存在作用问题,元件作用域只对它的子节点有作用,其他作用域默认根据测试计划中树形结构来定。

3. JMeter 重点组件

(1). 线程组

控制 JMeter 将用于执行测试的线程数,也可以把一个线程理解为一个测试用户。

  • 线程数:一个线程即一个测试用户,设置发送的请求次数。
  • Ramp-up时间 (秒):设置性能测试运行时间,单位为秒。
  • 循环次数:
    • 配置指定次数:控制脚本循环执行的次数。
    • 配置循环永远。
      • 需要调度器配置使用。
      • 运行时间:脚本执行时间。
      • 延迟启动时间:脚本等待指定时间才能运行。

(2). HTTP 请求

配置信息发送 HTTP 请求,以下是博客登录请求:

添加必需的配置:

  • http 协议。
  • http 主机名/IP
  • 端口。
    • http 协议端口号80
    • https端口号443
  • 请求方法。
  • 路径 (目录+参数)
  • 内容编码 (默认的ISO国际标准,但对中文支持不友好,可以使用utf-8)
  • 参数
    • 参数可以拼在路径里,也可以卸载参数中。
    • POST参数要放到消息体数据中{wd:test}

(3). 查看结果树

发送 HTTP 的具体结果,包括请求和响应,以下是博客登录请求的具体结果:

  • 取样器结果:统计请求相关的信息。
    • Thread Name:线程组名称Sample time:发送请求时间。
    • load time:响应时间。
    • Response code:接口响应状态码。
  • 请求:HTTP请求的请求头和请求体的详细信息。
  • 响应:HTTP响应的响应头和响应体的详细信息。

(4). HTTP 请求默认值

博客中涉及到的接口协议、IP、端口号全都一样,可以单独抽取出来存放在默认值中,其他接口就可以省略不写协议、IP、端口号,如下:

(5). HTTP 信息头管理器

配置获取博客列表页 HTTP 请求:


由于不知获取博客列表页的用户是谁,需要在请求头中添加用户的登录凭证如下:


问题1:登录接口不需要用户登录凭证。

将 HTTP 信息头管理器移到 "获取博客列表页请求" 下面:

问题2:用户每一次登录都会产生的登录凭证,而写死的登录凭证存在过期,需要手动修改。

(6). JSON 提取器

接口响应成功,通过提取返回值对应字段,可用于其他接口的参数配置。

JSON 操作符参考:


参考文档:https://github.com/json-path/JsonPath

提取登录接口响应数据中的登录凭证,作为其他接口的登录凭证

提取登录凭证的键可能存在名称冲突

配置获取用户信息 HTTP 请求:


结果:获取博客列表页中的 token 是登录接口返回值中的 data 字段,而获取用户信息中的 token 是获取博客列表页接口返回值中的 data 字段,发生了覆盖。

提取获取博客列表页接口响应数据中的博客 id,作为博客详情页接口的参数

获取不存在的博客 id,接口设计的是请求成功,由于不存在该博客,所以内部无法显示博客信息:

解决办法:将博客 id 提取出来,作为请求参数。

(7). 用户定义的变量

有时我们只想要在固定的场景里使用参数化,改动后不希望影响到其他的脚本:


  • 使用:在HTTP请求的取样器中引入定义的变量,${参数名}
  • 适用场景:变量需要在多个脚本中使用,方便统一管理和修改。

添加博客接口




JMeter 和 Postman 中参数的格式不同,导致 JMeter 请求失败,正确格式应该是 Postman 中的 JSON 格式:


(8). JSON 断言

接口发送请求成功,响应码为200并不能完全代表接口请求成功,我们更多需要关注接口响应数据是否符合预期。


  • 若不选 Additionally assert value,表示添加断言值,则可用来判断字段是否存在。
  • 选择 Additionally assert value,则必须添加 Expected Value 期望的断言值。
  • 若不选 Match as regular expression 正则匹配,则 Expected Value 必须填写完整,少一个字符都会导致断言失败。
  • 若选择 Match as regular expression 正则匹配,则 Expected Value 可以仅写上部分关键词即可断言成功。

(9). 同步定时器

JMeter 同步定时器的作用主要在于模拟多用户并发访问的场景,确保多个线程能够同时执行某个操作,以达到真正的并发效果。

当多个线程同时启动时,它们可能会在不同的时间间隔内执行,这样就无法达到真正的并发效果。同步定时器的作用就是将这些线程的执行时间同步,使它们在同一时间点执行。它可以在多个线程之间制造一定的延迟,直到同时到达指定时间点,再同时执行后续的操作。

此外,同步定时器可以理解为集合点,当线程数量达到指定值后,再一起释放,可以瞬间产生很大的压里。这样,可以更好地模拟真实的用户并发访问场景,提高测试的准确性和可靠性。

在性能测试过程中,为了真实模拟多个用户同时进行操作以度量服务器的处理能里,可以使用同步定时器来设置集合点。不过,虽然通过加入集合点可以约束请求同时发送,但不能确保请求同时到达服务器,所以只能说是较真实模拟并发。

现实生活中,红绿灯就相当于意个集合点,有人先到达,有人后达到,但必须等到绿灯后所有人才能开始过人行道。

添加同步定时器:

(10). 事务控制器


添加聚合报告,查看接口执行的各种时间,如下:



JMeter 事务控制器的作用主要用于测试执行嵌套测试元素所花费的总时间。这相当于模拟用户进行一系列操作的测试。

在进行页面性能测试或API性能测试时,事务控制器是一个非常重要的工具。它可以帮助测试人员更准确地评估系统性能,尤其是在涉及多个接口或操作的复杂场景中。例如,在订单提交的过程中,可能需要调用多个接口,并且某些接口可能依赖于前一个接口的结果。在这种情况下,使用事务控制器可以将这些接口统一视为一个事务进行性能测试,从而得到更接近真实场景的性能测试结果。

若不添加事务控制器,则一个接口即一个事务。添加了事务控制器后,可以将多个接口统一放到一个事务控制器下作为一个事务。

(11). CSV 数据文件设置

以登陆接口为例,当我们执行登陆接口的性能测试时,手动配置了用户名和密码为固定的 username 和 password,然而实际使用中不可能只有一个用户登陆,为了模拟更真实的登录环境,我们需要提供更多用户的 username 和 password 来实现登录操作:




  • 文件名:填写 csv 文件的路径,建议使用绝对路径。
  • 文件编码:UTF-8
  • 变量名称:从 csv 数据文件中读起的数据需要保存到的变量名,有多个变量时用逗号分隔。
  • 是否忽略首行:是否从 csv 数据文件第一行开始读取。
  • 分隔符:要求与 csv 数据文件中多列的分隔符一致。
  • 遇到文件结束符再次循环:若选择为 True 当数据不够的时候会从头取。若选择False,则需要勾选下面的配置,遇到文件结束符停止线程,这里如果不勾选,请求将会报错。


添加 HTTP Cookie 管理器:"登录-0" 成功登录后,服务器返回的响应头中存在 Set-Cookie 字段,存放 Cookie 信息给客户端,而 "登录-1" 就会自动在请求头中添加 Cookie 字段。当然在登录请求中添加 Cookie 没有意义,但是 HTTP Cookie 管理器可以做到让其他接口的请求头中携带 Cookie 信息,才是关键!

HTTP Cookie 管理器像 Web 浏览器一样存储和发送 Cookie,如果 HTTP 请求并且响应包含 Cookie,则 Cookie 管理器会自动存储该 Cookie,并将其用于将来对该特定网站的所有请求。每个 JMeter 线程都有自己的 "Cookie 存储区"。因此,正在测试使用 Cookie 存储会话信息的网站,则每个 JMeter 线程都将拥有自己的会话。此类 Cookie 不会显示在 Cookie 管理器显示屏上,可以使用 "查看结果树监听器" 查看。

缓存配置可选择 standard(标准) 或 compatibility(兼容的),当然也可以手工添加一些 Cookie,添加了 HTTP Cookie 管理器后,会自动存储并发送 Cookie

4. Jmeter 插件

下载 Jmeter 插件功能:https://jmeter-plugins.org/install/Install/

将下载好的插件放到 apache-jmeter-5.6.3 下 lib/ext 文件夹下:

此时 jmeter 界面右上角将会展示一个小蝴蝶形状的工具,该工具即 jmeter 插件功能,点击该功能可以下载 jmeter 中支持的各种插件:

在真实企业压测场景中,我们通常为一点一点的逐步增加线程数,因此需要安装新的插件来支持线程数的配置。通过插件管理工具下载其他插件:

在插件中下载其他监听器插件:

在插件中下载线程组插件:


点击 Apply Changes and Restart JMeter 等待下载完成并重启 JMeter,下载完成后再线程和监听器中可以看到新增的元件:

(1). Stepping Thread Group

梯度压测线程组:


  • This group will start:启动多少个线程,同线程组中的线程数。
  • First, wait for:等待多少秒才开始压测,一般默认为0
  • Then start:一开始有多少个线程数,一般默认为0
  • Next, add:下一次增加多少个线程数。
    • threads every:当前运行多长时间后再次启动线程,即每一次线程启动完成之后的的持续时间。
    • using ramp-up:启动线程的时间,若设置为5秒,表示每次启动线程都持续5秒。
    • 上图含义:每隔 30 秒启动 10 个线程,这 10 个线程必须在 5 秒内准备完成
  • thenhold loadfor:线程全部启动完之后持续运行多长时间。
    • 上图含义:线程全部启动完之后持续运行 60 秒
  • finally,stop/threads every:多长时间释放多少个线程。
    • 上图含义:每隔 1 秒结束 5 个线程

最终的图形,很好的展示了上面的数据:

(2). Response Times Over Time

Response Times Over Time 主要用于监听整个事务运行期间的响应时间。在测试过程中,它可以帮助测试人员观察并分析响应时间的实时平均值以及整体响应时间的走向。通过这一监听器,测试人员能够更直观地了解系统在不同时间点的响应性能,从而发现可能存在的性能问题或瓶颈。

Response Times Over Time 的图形展示中,横坐标通常代表运行时间,而纵坐标则代表响应时间 (单位是毫秒)。测试人员可以根据图形中的趋势线来判断响应时间的稳定性以及是否存在大的波动。例如,如果响应时间在某个时间点突然增加,这可能意味着系统在该时间点遇到了性能问题。

(3). Transactions per Second

JMeter 中的 Transactions per Second (TPS) 监听器是一个用于分析系统吞吐量的重要工具。TPS 即每秒事务数,表示一个客户机向服务器发送请求后服务器做出反应的过程。这个指标反映了系统在同一时间内处理业务的最大能力。TPS 值越高,说明系统的处理能力越强。

在使用 TPS 监听器时,横坐标通常代表运行时间,而纵坐标则代表 TPS 值。通过监听器展示的图表,可以清晰地看到 TPS 值随时间的变化情况。在图表中,红色通常表示通过的 TPS,而绿色可能表示失败的 TPS。这有助于我们快速识别系统性能的变化和瓶颈。

使用如下数据,进行接口测试:

活跃线程数如下:

响应时间如下:

每秒事物数如下:

聚合报告如下:

三. 接口性能测试报告

JMeter 测试报告是一个全面而详细的文档,它提供了关于测试执行结果的详细信息,帮助用户全面评估系统的性能并进行性能优化。生成性能测试报告的命令:

Jmeter -n -t 脚本文件 -l 日志文件 -e -o 目录:

  • -n:无图形化运行。
  • -t:被运行的脚本。
  • -l:将运行信息写入日志文件,后缀为 jtl 的日志文件。
  • -e:生成测试报告。
  • -o:指定报告输出目录。

注意:日志文件和目录可以不存在,若为已经存在的情况下需要保证内容为空,否则会出现错误!

性能测试报告生成成功后,在文件夹下将出现以下内容:


双击 index.html 文件,界面展示如下:

四. 性能分析

通过三大指标来分析性能问题。

1. 响应时间

如果响应时间超过了要求,代表系统到了瓶颈。

注意事项:分析在多少线程的情况下发生了超标响应时间变化的原因:

  • 系统不稳定,有时快有时慢。
  • 随着并发压力变大而慢慢变慢,响应时间变高。

2. 错误率(可靠性)

高并发场景下,系统是否能够正常处理业务。要求:99.99%可靠,99.9999%

错误率高的原因:

  • 接口请求错误。
  • 服务器无法继续处理,达到了瓶颈 (代码写的不好,内存泄漏、硬件资源等)
  • 后端系统限流 (系统里配置了不能超过多少并发)、熔断、降级

什么是熔断、降级?

  • 熔断:防止系统因某个服务的故障而整体崩溃。当电商平台上用户支付时,收银台发现某个支付渠道,如微信支付失败率突增,超时严重,那么就可以临时把这个支付方式熔断掉。
  • 降级:主动关闭一些非核心功能,以确保核心功能的正常运行。某次腾讯视频挂了的时候,用户名称默认显示腾讯用户,这也是一种降级方式,用兜底名称做展示。

3. 吞吐量

吞吐量越大,性能越好,吞吐量相对稳定或者变低,可能系统达到了性能瓶颈。

吞吐量变化规律:

  • 波动很大:代表系统性能不稳定。
  • 慢慢变高,再趋于稳定:和并发量强相关。如果并发量小于吞吐量,慢慢增大并发量,吞吐量也会随之增加。
  • 慢慢变低,并发量也减少了:要么说明性能测试要结束了,并发减少;也可能是系统变的卡顿,从而导致响应时间变慢,导致单个线程发起的并发量变少。
相关推荐
晚笛诶3 小时前
Jmeter分布式集群搭建与使用
jmeter
学无止境w1 天前
高并发系统性能测试:JMeter_Gatling 压测实战,测试场景设计与结果分析
jmeter
测试19981 天前
Jmeter是如何实现接口关联的?
自动化测试·软件测试·python·测试工具·jmeter·职场和发展·接口测试
CesareCheung2 天前
QPS、TPS、RPS 详解
jmeter
qq_4924484463 天前
Jmeter跨线程组获取参数
jmeter
tq023 天前
Jmeter接口的负载测试概念
jmeter
张永清-老清5 天前
每周读书与学习->初识JMeter 元件(五)
学习·jmeter·性能调优·jmeter性能测试·性能分析·干货分享·每周读书与学习
低音钢琴5 天前
【从零开始构建性能测试体系-02】 Apache JMeter 取样器指南:从入门到精通
学习·jmeter·apache
向测开进阶5 天前
jmeter使用之--MD5加密
jmeter