【性能测试】Jmeter工具快速上手-搭建压力测试脚本

 🔥个人主页: 中草药

 🔥专栏:【Java】登神长阶 史诗般的Java成神之路


概念

        性能测试是软件测试的重要分支,核心目标是通过模拟真实业务场景和负载压力,评估系统在不同条件下的性能表现,发现系统性能问题,验证其是否满足预期的性能指标(如响应速度、稳定性、并发能力等),并定位性能瓶颈以支撑优化。


关键指标

响应时间(Response Time):用户发起请求到系统返回结果的总时间(如接口响应时间、页面加载时间),直接影响用户体验。

对于Web应用而言,系统响应时间包括前端展现时间和系统响应时间

前端展现时间:页面渲染时间

系统响应时间:包括服务器,数据库,通讯网络等响应时间

吞吐量(Throughput):单位时间内系统处理的请求数 / 数据量(如 TPS 每秒事务数、QPS 每秒查询数),直接反映系统负载承受能力。

并发用户数(Concurrent Users):指的是Web服务器在一段时间内处理浏览器请求而建立http连接数或生成的处理线程数(注意:非 “在线用户数”,而是实际操作的活跃用户)。

资源利用率:CPU、内存、磁盘 I/O、网络带宽等服务器资源的占用率,过高会导致性能下降。

稳定性:系统在长时间高负载下是否持续正常运行(无崩溃、无内存泄漏、响应时间稳定)。

TPS:每秒处理事务数,用于衡量系统在一定时间内能够处理的事务数

计算公式:总的事务数/总的运行时间

举例 1:某一系统 1 分钟处理 1000 个业务,那么 TPS = 1000 / 60 = 16.7

举例 2:2022 年最高的一天有 10 万笔交易,预测 2023 年 TPS 需要多少合格?认为每笔交易就是一个事务,理论 TPS = 100000 / 24*60*60 = 1.2(理想状态),然而实际上订单量会在某段时间内突然增加,并不是平均到每个时间段内,因此
1)没有更详细的数据:根据二八定律(80% 的事务在 20% 的时间内完成)
TPS = 100000 * 0.8 / 24*60*60*0.2 = 4.6
2)如果有详细的数据:5 万笔交易在晚上的 8~9 点完成的
TPS = 50000 / 60*
60 = 13.9(实际还要参考往年业务的增长,假设每年业务增长 30%,则 TPS = 50000 + 50000*0.3 / 60*60 = 18)

QPS:每秒查询率,若一个事务中只有一个接口且是查询接口,则QPS=TPS


测试分类

测试类型核心目的典型场景举例
基准测试

又称单用户测试,在标准环境下执行特定场景,获取性能基准值(如响应时间、吞吐量),作为后续优化或版本对比的参考。

新功能上线前,测试核心支付接口在 50 并发下的平均响应时间,建立性能基线。
并发测试模拟多个用户同时发起相同 / 不同操作,验证系统在并发场景下的资源竞争、数据一致性表现。100 个用户同时抢购同一件限量商品,测试订单数据是否准确无重复。
负载测试逐步增加负载(如用户数、请求量),观察性能指标变化,找到 “正常负载下的性能阈值”。电商日常促销时,验证系统在 1000 并发用户下是否稳定。
压力测试超过预期负载持续加压,找到系统 “极限瓶颈”(如崩溃、响应超时的临界点)。模拟 2000 并发用户访问,测试系统最大承载能力。
耐久性测试在预期负载下长时间运行(几小时到几天),验证系统稳定性(是否内存泄漏、资源耗尽)。核心交易系统连续 72 小时运行,监控资源是否持续增长。
尖峰测试突发高负载冲击(如瞬间用户数暴涨),验证系统抗突发能力。秒杀活动开始瞬间,10 秒内用户从 100 突增至 5000。
配置测试调整系统配置(如服务器数量、JVM 参数、数据库连接池),找到最优配置方案。测试 “2 核 4G” vs “4 核 8G” 服务器的性能差异。
容量测试验证系统在数据量增长下的性能(如数据库数据量从 10 万到 1000 万时的响应变化)。社交平台用户数据达 1 亿时,好友列表查询是否延迟。

Jmeter

        JMeter 是 Apache 基金会开发的一款开源性能测试工具,主要用于模拟多用户并发场景,测试软件(如 Web 应用、API、数据库等)的性能指标(如响应时间、吞吐量、并发能力等),广泛应用于负载测试、压力测试、接口测试等场景。它支持多种协议,操作灵活且扩展性强,是性能测试领域的主流工具之一。


核心组件

jmeter有着很多非常核心的组件,其中JMeter元件的作用域主要由测试计划的树形结构中的元件父子关系来确定


线程组(Thread Group)

性能测试的 “负载发生器”,定义并发用户数、测试持续时间、用户启动速度等。


取样器(Sampler)

模拟用户具体操作,向目标系统发送请求(如 HTTP 请求、数据库查询)。比如HTTP请求取样器


监听器(Listener)

收集并展示测试结果,支持实时查看或事后分析。比如结果树


配置元件(Config Element)

为取样器提供默认配置(如请求头、数据库连接信息),减少重复设置。比如

HTTP请求默认值

用户定义的变量

HTTP Cookie管理器

自动存储 Cookie:当服务器通过Set-Cookie响应头返回 Cookie 时,Cookie 管理器会自动捕获并保存这些 Cookie(包括名称、值、域名、路径、过期时间等属性)。

自动发送 Cookie:后续向同一服务器发送请求时,Cookie 管理器会根据 Cookie 的域名、路径规则,自动将匹配的 Cookie 通过Cookie请求头携带到请求中,模拟浏览器 “记住会话状态” 的行为。


前置 / 后置处理器(Pre/Post Processor)

处理请求前的参数(如动态获取 token)或响应后的结果(如提取返回值供后续请求使用)。比如后置处理器 Json提取器

操作符作用说明语法示例说明(结合 JSON 示例)
$表示 JSON 数据的 根节点,所有路径均从根节点开始。$.name从根节点开始,提取 name 字段的值。
.访问当前节点的 子节点(直接子节点)。$.user.name访问根节点下 user 子节点的 name 字段(适用于嵌套结构)。
..递归匹配所有 子孙节点(跨层级查找,不局限于直接子节点)。$..email递归查找所有层级中名为 email 的字段,无论其在嵌套结构的第几层。
*通配符,匹配 所有子节点 或 数组元素$.users[*].age匹配 users 数组中所有元素的 age 字段,提取所有用户的年龄。
[]访问数组元素,支持索引、范围或过滤。$.users[0]
$.users[1:3]
[0] 提取数组第 1 个元素(索引从 0 开始);
[1:3] 提取数组索引 1 到 2 的元素(左闭右开)。
?()过滤数组元素,通过条件表达式筛选符合条件的节点。$.users[?(@.age > 18)].name从 users 数组中筛选出 age > 18 的元素,提取其 name 字段。
@在过滤表达式 ?() 中,代表 当前节点(用于引用当前元素的属性)。$.users[?(@.name == 'Alice')].id@ 指代 users 数组中的每个元素,筛选 name 为 Alice 的元素,提取其 id
['字段名']通过属性名访问子节点(与 . 作用类似,支持特殊字符字段名,如含空格的字段)。$.user['full name']访问 user 节点下名为 full name 的字段(字段名含空格时必须用此语法)。
length()数组长度函数,返回数组的元素数量(需配合过滤或数组操作)。$.users.length()返回 users 数组的长度(即用户总数)。

举例,我们有以下Json数据

{"name": "JMeter","user": {"id": 1001,"full name": "Test User","email": "test@example.com"},"users": [{"name": "Alice", "age": 20, "id": 1},{"name": "Bob", "age": 17, "id": 2},{"name": "Charlie", "age": 25, "id": 3}]
}
  • $.name → 提取结果:"JMeter"
  • $.user.email → 提取结果:"test@example.com"
  • $..age → 提取结果:[20, 17, 25](递归找到所有 age 字段)
  • $.users[*].name → 提取结果:["Alice", "Bob", "Charlie"]
  • $.users[?(@.age > 18)].name → 提取结果:["Alice", "Charlie"]
  • $.users.length() → 提取结果:3(数组长度为 3)

Json断言

接口发送请求成功,并不完全意味着接口请求成功,我们更多的需要关注接口响应数据是否符合预期,JSON 断言的核心是JSON Path 表达式(类似 XML 的 XPath,用于定位 JSON 中的元素)。通过 JSON Path 定位到目标字段后,断言会对比该字段的实际值与预设的 “预期值”,判断是否匹配。

若不选Additionally assert value,表示添加断言值,则可用来判断字段是否存在

若选择Match as regularexpression正则匹配,则Expected Value可以仅写上部分关键词即可断
言成功


CSV数据文件设置

CSV数据文件设置辅助我们去模拟更真实的用户环境

CSV 数据文件(Comma-Separated Values,逗号分隔值文件)是一种纯文本格式的表格数据存储文件,主要用于存储结构化数据(如电子表格、数据库表等),并实现不同系统、工具之间的数据交换。

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


定时器(Timer)

控制请求发送的间隔(如模拟用户思考时间),避免请求无间隔发送(非真实场景)。

为了达到并发的效果,我们需要添加同步定时器(集合点)

模拟用户组的数量(Number of simulated users to group by):
设定 “同时释放的用户数”(即并发阈值)。例如设为 100,表示当有 100 个用户被阻塞时,同时释放这 100 个用户执行后续操作。

超时时间(Timeout in milliseconds):
若超过该时间仍未达到 “用户组数量”,则无论当前阻塞多少用户,都会强制释放(避免无限等待)。例如设为 5000(5 秒),若 5 秒内只有 80 个用户到达,则释放这 80 个用户。

配置后的日志如下:


事务控制器

将一系列连续的操作(如请求、逻辑控制器等)“打包” 为一个 “事务”,用于统计该事务的整体响应时间、成功率等指标,更贴合真实业务场景中 “用户完成一个完整操作” 的概念。

压力测试

环境准备

1、先下载插件管理

Install :: JMeter-Plugins.org

并将插件添加至jmeter下的lib/ext文件夹下

安装成功右上角会出现一个蝴蝶的logo

2、下载所需插件,分别下载

监听器插件 Page Data Extractor

线程组插件

Custom Thread Groups 

3 Basic Graphs 

梯度压测线程组 Stepping Thread Group

添加监听器-汇总报告,聚合报告,Response Times Over Time,Transaction pet second

我们可以系统日志去更加详尽的分析此次测试过程

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

性能分析

可以通过三大性能指标去分析性能问题

响应时间

如果响应时间超过了要求,代表系统遇到了瓶颈,注意分析多少线程的情况下发生了超标,响应时间变化会受到系统稳定性影响,随着系统并发压力变大,响应时间会变高

吞吐量

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

变化规律:

波动很大:代表系统性能不稳定

慢慢变高,再趋于稳定:和并发量强相关。如果并发量小于吞吐量,慢慢增大并发量,吞吐量也会随之增加

慢慢变低,并发量也减少了:要么说明性能测试要结束了,并发减少;也可能是系统变的卡顿,从而导致响应时间变慢,导致单个线程发起的并发量变少

错误率(Error Rate):异常请求数占总请求数的比例(单位:%),反映系统 “稳定性和容错能力”。错误类型包括 5xx(服务器错误,如超时、OOM)、4xx(客户端错误,如参数错误、权限不足)等。

一般要求可靠的成功率在99.9999%

错误率高的原因:

接口请求错误

服务器无法继续处理,达到了性能瓶颈(业务逻辑有问题,内存泄漏,硬件资源等等)

后端系统限流(系统配置了最大并发数的限制)实现了熔断,降级

熔断:防止系统因某个服务的故障而整体崩溃。当电商平台上用户支付时,收银台发现某个支付渠如微信支付失败率突增,超时严重,那么就可以临时把这个支付方式熔断掉道

降级:主动关闭一些非核心功能,以确保核心功能的正常运行。某次腾讯视频挂了的时候,用户名称默认显示腾讯用户,:这也是一种降级方式,用兜底名称做展示


在自己身上,克服这个时代。              ——尼采

🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀

以上,就是本期的全部内容啦,若有错误疏忽希望各位大佬及时指出💐

  制作不易,希望能对各位提供微小的帮助,可否留下你免费的赞呢🌸 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/96335.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/96335.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

oracle里的int类型

oracle里的int类型 在 ANSI SQL 标准 中,INTEGER 和 SMALLINT 是定义好的精确数值类型,但它们的 “长度”或“大小”并不是通过 (N) 括号来指定的(如 INT(4)),这一点与 MySQL 等数据库的非标准扩展完全不同。 SMALLI…

前端学习之后端java小白(二)-sql约束/建表

一、约束SQL约束(Constraints)是用于限制表中数据的规则,确保数据的完整性和准确性。以下是主要的SQL约束类型: 主要约束类型: 1. NOT NULL 约束: 确保列不能包含空值 CREATE TABLE users (id INT NOT NULL,name VARC…

OpenCV:图像金字塔

文章目录一、什么是图像金字塔?二、图像金字塔的核心操作:采样与逆采样1. 向下采样(pyrDown):从高分辨率到低分辨率步骤1:高斯滤波步骤2:删除偶数行与偶数列OpenCV实战代码效果特点2. 向上采样&…

LVS与Keepalived详解(一)负载均衡集群介绍

文章目录前言一、什么是LVS?二、四层(L4)负载均衡的最佳解决方案是什么?2.1解决方案分类与对比(负载均衡的三种方式介绍)2.1.1 硬件负载均衡 (Hardware Load Balancer)2.1.2 软件负载均衡 (Software Load B…

消息队列-kafka完结

基本概念和操作 基本概念 简单概念:::color4 Broker:如果将kafka比喻成数据仓库网络,那么Broker就是网络中的仓库节点,比如快递站,在该节点内可以独立运行,并且多个Broker可以连接起来,构建kafka集群Topic&…

Chromium 138 编译指南 Windows篇:环境变量配置与构建优化(三)

引言配置,往往决定成败。在软件开发的世界里,环境变量就像是一位无声的指挥家,默默地协调着各个组件的协同工作。对于Chromium 138这样一个拥有数千万行代码的超大型项目而言,正确的环境变量配置更是编译成功的关键所在。也许您曾…

LabVIEW加载 STL 模型至 3D 场景 源码见附件

LabVIEW 中 STL 模型的导入与 3D 场景显示,基于示例代码逻辑,结合格式兼容性、功能实现步骤及多样化显示方式,适用于三维可视化温控、机械零件模拟等场景。 1示例代码 NI 社区案例 “Add an STL file to 3D scene using LabVIEW” 提供了经…

硅基计划3.0 Map类Set类

文章目录一、二叉搜索树(排序树)1. 概念初识2. 模拟实现1. 创建搜索树节点2. 查找指定元素是否存在3. 插入4. 删除二、Map类1. put——设置单词以及其频次2. get——获取单词频次3. getOrDefault——获取单词频次或返回默认值4. remove——删除单词频次信…

LeetCode 刷题【73. 矩阵置零】

73. 矩阵置零 自己做 解&#xff1a;标记消除 class Solution { public:void setZeroes(vector<vector<int>>& matrix) {vector<bool> x(matrix.size(), false); //要置0的行vector<bool> y(matrix[0].size(), false); //…

Unity学习----【进阶】TextMeshPro学习(一)--基础知识点

来源于唐老狮的视频教学&#xff0c;仅作记录和感悟记录&#xff0c;方便日后复习或者查找 一.导入TextMeshPro 对于新创建的工程&#xff0c;可以直接在这里导入TMP必要的资源&#xff08;上面&#xff09;&#xff0c;以及TMP的实例和扩展&#xff08;下面&#xff09; 导入之…

BigDecimal(用于处理超出double范围的浮点数)

BigDecimal 是 Java 中 java.math 包提供的高精度十进制浮点数类&#xff0c;专为解决基本类型&#xff08;float/double&#xff09;的精度缺陷而设计&#xff0c;广泛用于金融、科学计算等对精度要求极高的场景。以下从核心特性、使用方法、常见问题对比、注意事项等方面详细…

Nginx 优化

文章目录1、隐藏版本号2、修改用户与组3、缓存时间4、日志切割5、连接超时6、更改进程数7、配置网页8、防盗链1、隐藏版本号 隐藏nginx的版本号&#xff0c;为了防止恶意用户利用已知漏洞进行攻击 ## 查看版本号 curl -I http://192.168.10.23方法一&#xff1a;修改配置文件…

基于多模态与主动学习的车船飞机图像识别系统研究与应用技术方案

技术方案 一、技术背景与研究现状 图像识别是计算机视觉的核心任务之一&#xff0c;随着深度学习的发展&#xff0c;基于 卷积神经网络&#xff08;CNN&#xff09; 与 视觉Transformer&#xff08;ViT&#xff09; 的图像分类方法已成为主流。 根据《图像分类技术选型——截止…

Word2Vec词嵌入技术和动态词嵌入技术

Word2Vec&#xff08;Word to Vector&#xff09;是 2013 年由 Google 团队提出的无监督词嵌入模型&#xff0c;是一种静态词嵌入技术&#xff0c;核心目标是将自然语言中的离散词汇映射为低维、稠密的实数向量&#xff08;即 “词向量”&#xff09;&#xff0c;让向量空间的距…

Netty从0到1系列之Netty逻辑架构【上】

文章目录一、Netty逻辑架构【上】1.1 网络通信层1.1.1 BootStrap & ServerBootStrap1. ✅核心方法链与配置2. ✅ 架构与流程3. ✅ 底层实现与原理分析4. ✅ 实践经验与总结1.1.2 Channel1.2 事件调度层1.2.1 事件调度层概述1.2.2 EventLoop【事件循环】1.2.3 EventLoopGrou…

Spring Cloud 高频面试题详解(含代码示例与深度解析)

文章目录Spring Cloud 高频面试题详解&#xff08;含代码示例与深度解析&#xff09;1. 什么是 Spring Cloud&#xff1f;它与 Spring Boot 有什么关系&#xff1f;2. 服务发现&#xff1a;Eureka 和 Nacos 的区别与选型&#xff1f;Eureka 示例与原理Eureka vs Nacos 对比表3.…

Ascend310B重构驱动run包

在Atlas 200I AI加速模块(Ascend310B)移植过程中如需要将自己编译的Image、dt.img及内核模块打包到启动镜像包中需要对"Ascend-hdk-310b-npu-driver-soc_<version>_linux-aarch64.run"(下面统称驱动run包)进行重构。下面将介绍如何重构run包。 重构驱动run包需…

Leecode hot100 - 287. 寻找重复数

题目描述 287. 寻找重复数 - 力扣&#xff08;LeetCode&#xff09; 定一个包含 n 1 个整数的数组 nums &#xff0c;其数字都在 [1, n] 范围内&#xff08;包括 1 和 n&#xff09;&#xff0c;可知至少存在一个重复的整数。 假设 nums 只有 一个重复的整数 &#xff0c;返…

机器人控制器开发(驱动层——奥比大白相机适配)

文章总览 编译OrbbecSDK_ROS2的代码 执行命令 colcon buildros2 launch orbbec_camera dabai.launch.py问题1&#xff1a; 运行时报错&#xff1a; [component_container-1] [ERROR] [1757153916.450795107] [camera.camera_container]: Failed to load library: Could not…

`vcpkg` 微软开源的 C/C++ 包管理工具的使用和安装使用spdlog

vcpkg 是 微软开源的 C/C 包管理工具&#xff0c;类似于 Python 的 pip、Node.js 的 npm、Rust 的 cargo。 它的主要作用是&#xff1a;帮助你快速下载、编译、安装和管理 C/C 第三方库&#xff0c;并自动配置到你的项目&#xff08;比如 Visual Studio、CMake、MSBuild&#x…