测试-Gatling 与性能测试
Gatling 与性能测试详解
一、什么是性能测试?
性能测试是一种软件测试类型,旨在评估系统在负载下的响应时间、吞吐量和资源利用率等性能指标。通过性能测试,开发者和运维团队能够识别出系统的瓶颈、优化系统性能,并确保其在实际生产环境中能够处理预期的流量。
性能测试通常分为以下几类:
- 负载测试:通过模拟多个用户同时访问系统,测试系统在高负载下的行为和响应能力。
- 压力测试:将系统负载逐步增加,直至系统崩溃,评估其最大承受能力。
- 容量测试:确定系统在特定硬件资源条件下的最大用户处理量。
- 稳定性测试:在较长时间内保持负载,检查系统的稳定性和是否存在内存泄漏等问题。
二、Gatling 简介
Gatling 是一个开源的、高性能的性能测试工具,专为测试 HTTP 协议设计,同时也支持 WebSocket、JMS 等协议。Gatling 使用 Scala 编写,具有强大的并发处理能力和易用的脚本语言,适合用于模拟大规模用户请求、分析系统性能瓶颈。
Gatling 具有以下特点:
- 高性能:使用非阻塞 I/O,可以模拟大规模并发请求,适合测试高负载应用。
- 易用的 DSL(领域特定语言):基于 Scala 的测试脚本,结构清晰、语法简单,易于编写和维护复杂的性能测试场景。
- 丰富的报告:提供详尽的 HTML 格式的报告,展示响应时间、错误率、吞吐量等指标,并直观地展示系统性能瓶颈。
- 集成能力强:与 CI/CD 工具(如 Jenkins)无缝集成,适合自动化测试流程。
三、Gatling 的核心概念
- Scenario(场景)
场景代表性能测试的核心逻辑。一个 Scenario 描述了用户如何与系统进行交互,例如登录、查询、提交数据等操作。Gatling 中的 Scenario 通常通过定义用户行为序列来模拟实际的业务流程。
- Simulation(模拟)
Simulation 是 Gatling 中运行测试的单元,包含场景定义、负载模型、执行配置等内容。每个 Simulation 定义了一个测试计划,Gatling 执行该计划并生成测试报告。
- Session(会话)
Session 是用户与系统之间的一次完整交互,保存了测试过程中的所有上下文信息。每个用户都有独立的 Session,测试过程中可以在不同请求之间共享数据。
- Feeders(数据源)
Feeders 是用来为测试数据驱动的功能。通过 Feeders,测试脚本可以从外部数据源(如 CSV 文件、JSON 文件等)读取数据,为每个用户提供不同的测试输入。
- Assertions(断言)
断言用于检查测试的期望结果,确保测试在完成后能够验证系统是否达到了性能要求。Gatling 允许开发者对响应时间、成功率、吞吐量等进行断言。
四、Gatling 的安装与使用
- 安装 Gatling
下载并安装 Gatling:
- 前往 Gatling 官网 下载最新版本的 Gatling 压缩包。
- 解压缩后,配置 GATLING_HOME 环境变量指向 Gatling 解压目录。
- 创建一个简单的测试脚本
Gatling 提供了基于 Scala 语言的 DSL 来编写性能测试脚本。以下是一个简单的 Gatling 脚本示例,它模拟 100 名用户向网站发送 HTTP 请求:
示例:简单的 HTTP 性能测试
```scala
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._
class BasicSimulation extends Simulation {
// 定义 HTTP 协议配置
val httpProtocol = http
.baseUrl(“https://example.com”) // 目标网站
.acceptHeader(“application/json”) // 请求头
.userAgentHeader(“Gatling”)
// 定义用户行为
val scn = scenario(“Basic Simulation”)
.exec(
http(“Home Page Request”)
.get(“/”)
.check(status.is(200)) // 检查 HTTP 响应状态码
)
// 设置负载模型和模拟执行
setUp(
scn.inject(atOnceUsers(100)) // 模拟 100 个用户同时发起请求
).protocols(httpProtocol)
}
```
代码解释:
- httpProtocol:定义了 HTTP 协议相关的配置,包括请求的 URL、请求头等。
- scenario:定义了用户的行为场景,这里表示用户访问首页(GET 请求)。
- inject:定义负载模型,atOnceUsers(100) 表示 100 个用户同时发起请求。
- check:用于验证请求的结果,这里使用 status.is(200) 确保返回的状态码是 200。
- 运行 Gatling 测试
在 GATLING_HOME 目录中,运行以下命令以启动 Gatling:
bash ./bin/gatling.sh
选择要执行的测试脚本,Gatling 将开始运行测试并生成结果。测试结束后,Gatling 会生成一个详细的 HTML 报告,报告中包含以下关键性能指标:
- 响应时间:请求的最小值、最大值、平均值、95% 响应时间等。
- 成功率:请求成功率、失败率。
- 吞吐量:系统处理请求的速率。
- 查看 Gatling 报告
Gatling 生成的 HTML 报告提供了丰富的图表和统计数据,帮助开发者分析性能瓶颈。报告包含:
- 响应时间分布图:展示每个请求的响应时间,帮助开发者了解请求的响应延迟。
- 请求成功/失败统计:展示不同请求的成功率和错误率。
- 系统吞吐量:展示每秒处理的请求数量。
报告示例截图:

五、Gatling 进阶功能
- 负载模型
Gatling 提供了多种负载模型,可以模拟不同的用户行为模式,例如:
- atOnceUsers(n):同时模拟 n 个用户。
- rampUsers(n) over (d):在 d 时间内,逐渐增加到 n 个用户。
- constantUsersPerSec(rate) during (d):在 d 时间内,以每秒 rate 个用户的速率持续发送请求。
负载模型可以组合使用,例如:
scala setUp( scn.inject( rampUsers(100) over (10 seconds), // 在 10 秒内增加到 100 个用户 constantUsersPerSec(50) during (30 seconds) // 在 30 秒内保持每秒 50 个用户 ) ).protocols(httpProtocol)
- 数据驱动测试
Gatling 支持使用 Feeders 来从外部数据源读取测试数据。以下示例演示了如何从 CSV 文件中读取用户数据进行测试:
数据文件 users.csv:
csv username,password user1,pass1 user2,pass2
脚本示例:
```scala
val feeder = csv(“users.csv”).circular
val scn = scenario(“Login Simulation”)
.feed(feeder)
.exec(
http(“Login Request”)
.post(“/login”)
.formParam(“username”, “ u s e r n a m e " ) . f o r m P a r a m ( " p a s s w o r d " , " {username}") .formParam("password", " username") .formParam("password","{password}”)
.check(status.is(200))
)
```
- 高级断言
断言可以用于在测试结束后,自动验证性能目标是否达成。例如,可以验证响应时间的 95% 百分位数是否小于 500 毫秒:
scala setUp( scn.inject(atOnceUsers(100)) ).protocols(httpProtocol) .assertions( global.responseTime.percentile(95).lt(500), // 95% 响应时间小于 500 毫秒 global.successfulRequests.percent.gte(99) // 请求成功率大于 99% )
六、Gatling 与 CI/CD 集成
Gatling 可以轻松集成到 Jenkins 等持续集成/持续交付(CI/CD)工具中,帮助开发团队在代码发布前自动执行性能测试。
- **在 Jenkins 中
配置 Gatling**:
- 安装 Jenkins 的 Gatling 插件。
- 配置 Jenkins 任务,添加执行 Gatling 测试的步骤:
bash ./bin/gatling.sh -s simulations.BasicSimulation
- Jenkins 将在每次代码构建时自动运行 Gatling 性能测试,并将报告集成到构建结果中。
- 自动化测试流程:
在 CI/CD 管道中,Gatling 可以作为代码发布前的性能测试工具,帮助开发团队识别潜在的性能问题。例如,在应用部署到预生产环境后,可以使用 Gatling 测试接口的吞吐量和响应时间,确保其在高负载下的表现符合预期。
七、Gatling 与其他性能测试工具的比较
| 工具 | 特点 | 优点 | 缺点 |
|---|---|---|---|
| Gatling | 基于 Scala 的高性能工具,支持复杂场景 | 高并发性能,易用的 DSL,详细报告 | 基于 Scala,可能对非 Java/Scala 开发者不友好 |
| JMeter | 图形化界面的负载测试工具 | 图形界面易上手,支持多种协议 | 高并发下性能不足,脚本维护较复杂 |
| Locust | 基于 Python 的可扩展负载测试工具 | 使用 Python 编写脚本,适合复杂场景 | 性能低于 Gatling,尤其是模拟大量用户时 |
| k6 | 使用 JS 编写测试脚本,现代云原生负载工具 | 易于集成到 CI/CD 流程,支持云原生应用的负载测试 | 适合 API 测试,复杂业务逻辑支持不如 Gatling |
八、总结
Gatling 是一个功能强大且高效的性能测试工具,尤其擅长于模拟大规模的并发用户请求,适合测试现代 Web 应用和微服务架构的性能表现。通过使用 Gatling,开发团队能够准确分析系统在不同负载下的表现,识别潜在的性能瓶颈,并确保系统在实际生产环境中的稳定性和可扩展性。
结合 Gatling 的丰富 DSL、灵活的负载模型和与 CI/CD 的深度集成,开发者可以轻松地将性能测试融入到自动化发布流程中,确保应用在每次发布前都经过严格的性能评估。
相关文章:
测试-Gatling 与性能测试
Gatling 与性能测试详解 一、什么是性能测试? 性能测试是一种软件测试类型,旨在评估系统在负载下的响应时间、吞吐量和资源利用率等性能指标。通过性能测试,开发者和运维团队能够识别出系统的瓶颈、优化系统性能,并确保其在实际…...
ESRGAN——老旧照片、视频帧的修复和增强,提高图像的分辨率
ESRGAN(Enhanced Super-Resolution GAN):用于提高图像的分辨率,将低质量图像升级为高分辨率版本,常用于老旧照片、视频帧的修复和增强。 一、ESRGAN 介绍 1.1 背景 超分辨率问题是计算机视觉中的一个重要研究领域&a…...
跨界融合:EasyDSS+无人机视频直播推流技术助力行业多场景应用
随着科技的飞速发展,无人机技术与流媒体技术的结合正逐步改变着多个行业的运作模式。其中,EasyDSS互联网视频云服务与无人机视频直播推流技术的结合,更是为警务安防、赛事直播、农业监测等多个领域带来了前所未有的变革。本文将深入探讨EasyD…...
Linux实操笔记2 Ubuntu安装Nginx的不同方法
今天来了解Ubuntu或者说Linux系统安装Nginx的几种办法。包括从Ubuntu的库安装到官方源码编译安装。 一、Nginx是什么? 以下是来自Nginx中文文档的内容。 Nginx 是一个高性能的 Web 和反向代理服务器, 它具有有很多非常优越的特性: 作为 Web 服务器:相比…...
QCustomPlot笔记(一)
文章目录 简介将帮助文档添加到Qt Creator中编译共享库cmake工程编译提示ui_mainwindow.h找不到qcustomplot.h文件 环境:windowsQt Creator 10.0.1cmake 简介 QT中用于绘制曲线的第三方工具 下载地址:https://www.qcustomplot.com/index.php/download 第一个压缩…...
【机器学习】多模态AI——融合多种数据源的智能系统
随着人工智能的快速发展,单一模态(如文本、图像或语音)已经不能满足复杂任务的需求。多模态AI(Multimodal AI)通过结合多种数据源(如文本、图像、音频等)来提升模型的智能和表现,适用…...
QT学习与数据库连接
1.基础 1. 安装最后一个非在线版本 5.14, 没有的话联系我 新建一个.cpp文件 #include <QApplication> #include <QLabel> #include <QLineEdit> #include <QPushButton> #include <QHBoxLayout> #include <QVBoxLayout> #include <Q…...
泛读笔记:从Word2Vec到BERT
自然语言处理(NLP)模型的发展历史 1.统计方法时期:使用贝叶斯方法、隐马尔可夫模型、概率模型等传统统计方法 2.机器学习时期:支持向量机(SVM)、决策树模型、随机森林、朴素贝叶斯等传统机器学习方法 3.深度学习革命:各种新的深度学习模型&am…...
redis实现分布式锁详细教程,可续锁(看门狗)、可重入
前言 本文将讨论的做一个高并发场景下避不开的话题,即redis分布式锁。比如在淘宝 的秒杀场景、热点新闻和热搜排行榜等。可见分布式锁是一个程序员面向高级的一门必修课,下面请跟着本篇文章好好学习。 redis分布式锁有哪些面试题 1.Redis做分布式的时…...
代码随想录打卡Day32
今天有点事,先做一题,剩下的明天补。 509. 斐波那契数 这道题目太简单了,递归几行代码就结束了,用动态规划做也可以,主要是学习一下动态规划五部曲。 这是递归的代码 class Solution { public:int fib(int n) {//确…...
数学学习记录
目录 学习资源: 9月14日 1.映射:编辑 2.函数: 9月15日 3.反函数: 4.收敛数列的性质 5.反三角函数: 9月16日 6.函数的极限: 7.无穷小和无穷大 极限运算法则: 学习资源: 3Blue1…...
R语言统计分析——散点图1(常规图)
参考资料:R语言实战【第2版】 R语言中创建散点图的基础函数是plot(x,y),其中,x和y是数值型向量,代表着图形中的(x,y)坐标点。 attach(mtcars) plot(wt,mpg,main"Basic Scatter plot of MPG vs. Weigh…...
蓝桥杯—STM32G431RBT6按键的多方式使用(包含软件消抖方法精讲)从原理层面到实际应用(一)
新建工程教程见http://t.csdnimg.cn/JySLg 点亮LED教程见http://t.csdnimg.cn/Urlj5 末尾含所有代码 目录 按键原理图 一、按键使用需要解决的问题 1.抖动 1.什么是抖动 2.抖动类型 3.如何去消除抖动 FIRST.延时函数消抖(缺点:浪费CPU资源ÿ…...
基于STM32的温度、电流、电压检测proteus仿真系统(OLED、DHT11、继电器、电机)
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于STM32F103C8T6 采用DHT11读取温度、滑动变阻器模拟读取电流、电压。 通过OLED屏幕显示,设置电流阈值为80,电流小阈值为50,电压阈值为60,温度阈值…...
Linux - iptables防火墙
目录 一、iptables概述 二、规则表与规则链结构(四表五链) 1.简述 2.四表(规则表) 3.五链(规则链) 三、数据链过滤的匹配流程 四、iptables命令行配置方法 1.命令格式 2.基本匹配条件 3.隐含匹配 …...
【C语言零基础入门篇 - 3】:格式化输入输出、字符操作和sizeof运算符揭秘
文章目录 格式化输入与输出格式化输入输出演示基本格式化输入输出 字符的输入输出sizeof运算符 格式化输入与输出 什么是数据的输出? 计算机向输出设备输出数据 什么是数据的输入? 从输入设备向计算机输入数据 #include<stdio.h>:标准的输入输出库&#…...
JVM字节码与局部变量表
文章目录 局部变量表javap字节码指令分类 指令指令数据类型前缀加载和存储指令加载常量算术指令其他指令 字节码示例说明 局部变量表 每个线程的帧栈是独立的,每个线程中的方法调用会产生栈帧,栈帧中保存着方法执行的信息,例如局部变量表。 …...
Java许可政策再变,Oracle JDK 17 免费期将结束!
原文地址:https://www.infoworld.com/article/3478122/get-ready-for-more-java-licensing-changes.html Oracle JDK 17的许可协议将于9月变更回Oracle Technology Network License Agreement,这将迫使用户重新评估他们的使用策略。 有句老话说…...
网页交互模拟:模拟用户输入、点击、选择、滚动等交互操作
目录 一、理论基础 1.1 网页交互模拟的重要性 1.2 网页交互的基本原理 二、常用工具介绍 2.1 Selenium 2.2 Puppeteer 2.3 Cypress 2.4 TestCafe 三、实战案例 3.1 模拟用户输入 3.2 模拟用户点击 3.3 模拟用户选择 3.4 模拟滚动操作 四、最佳实践与优化 4.1 代…...
C sharp 学习 笔记
介绍 这篇文章是我学习C#语言的笔记 学的是哔哩哔哩刘铁锰老师2014年的课程 在学习C#之前已经学习过C语言了。看的是哔哩哔哩比特鹏哥的课程。他们讲的都很不错 正在更新, 大家可以在我的gitee仓库中下载笔记源文件、项目资料等 笔记源文件可以在Notion中导入…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
OpenLayers 可视化之热力图
注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
IT供电系统绝缘监测及故障定位解决方案
随着新能源的快速发展,光伏电站、储能系统及充电设备已广泛应用于现代能源网络。在光伏领域,IT供电系统凭借其持续供电性好、安全性高等优势成为光伏首选,但在长期运行中,例如老化、潮湿、隐裂、机械损伤等问题会影响光伏板绝缘层…...
短视频矩阵系统文案创作功能开发实践,定制化开发
在短视频行业迅猛发展的当下,企业和个人创作者为了扩大影响力、提升传播效果,纷纷采用短视频矩阵运营策略,同时管理多个平台、多个账号的内容发布。然而,频繁的文案创作需求让运营者疲于应对,如何高效产出高质量文案成…...
C++.OpenGL (20/64)混合(Blending)
混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
