📚 导读
有一年双十一,我在客户现场看到一个让我记忆深刻的场景:一个电商平台零点到来的短短几分钟内,服务器CPU飙到100%,数据库连接池耗尽,订单系统直接崩溃。整整四个小时无法下单,损失超5000万元。
事后复盘的时候,我问运维同事:”你们测试环境最高跑过多少并发?”他们回答得很声胆:”500并发,内存就给咱扭了。”
这并不是个例。据我观察,80% 的线上的故障,都可以通过上线前的性能测试提前发现。性能测试不是”锦上添花”,而是生产环境的最后一道防线。
所以今天这篇文章,我想带你从零开始,用 2 小时完成人生第一个10 万并发压力测试。
🔍 为什么不用JMeter?
JMeter 当然能用,但它有一个根本问题——同步阻塞线程模型。
理解这个概念很简单:JMeter 模拟每个虚拟用户时,会创建一个线程(Thread),这个线程会一直占用内存等待网络响应。
当你需要模拟 10 万并发时:
-
需要创建 10 万个线程 -
线程创建、切换、销毁本身就有巨大开销 -
内存占用从 JMeter 本身就要 16 GB -
被测计算机的 CPU 已经餐食了,实际可用于发请求的资源所剩无几
结果:很多测试人员用 JMeter 测到 3000 并发就卡死了——不是被测系统的问题,是 JMeter 自己的瓶颈。
✅ Gatling的解决方案
而 Gatling 用的是 Akka Actor 模型 + Netty 异步基石(NIO),单线程事件驱动,等效 10 万并发,内存占用从 JMeter 的 16GB 降到 2GB,差距就是这么大。
更关键的是,现在有了 TRAE AI,你不需要学 Scala 语法有多深,只需要会复制粘贴提示词,AI 就能帮你生成完整的 Gatling 测试脚本。
本文的价值:不跳步、每一步都有说明、代码完整可运行。不管你是手动测试转岗,还是刚入行的应毕业生,只要跟着做,2 小时后你就能独立完成一次真正的并发压测。
⚠️ 阅读前提醒:建议在电脑前边看边操作。光看不练 = 光说不做。本文实际上是一个手把手教程,而不是一篇伫语故事。
一、为什么性能测试必须做?
1.1 真实事故:一次崩溃万万千的故事
让我先讲一个真实发生的故事。
📈 图1:性能测试四大核心指标关系图 – TPS = 并发 / 响应时间
2022 年双十一前夕,某知名电商平台技术团队既筹资金又资人,做了多轮功能测试。但在测试环境中,最高并发只有 500 人,因为测试班的人说:”我们资源有限,没必要测那么高。”
双十一当天,零点到来的短短几分钟内:
- 0:00:00
— 请求量突然巅覆,从平时 2000 QPS 巅覆到 50000+ QPS - 0:00:12
— 服务器 CPU 巅覆到 100%,多个应用节点同时崩溃 - 0:00:28
— 数据库连接池全部耗尽,新连接无法建立 - 0:01:00
— 订单系统全线崩溃,用户无法下单 - 4:00:00
— 经过两轮抢救,系统恢复正常,但损失已经产生
事后排查报告显刀:如果上线前能做一次负载测试,就能发现连接池设置过小,进而在大量访问来临前就做调整,不至于全线崩溃。
🔴 重要教训:测试环境的并发量必须负负负负超过生产环境的预期席位,而不是就测平时负载。
1.2 性能测试四大核心指标
测试性能的时候,我们主耍关注四个指标:
|
|
|
|
|
|---|---|---|---|
| TPS |
|
|
|
| 响应时间 |
|
|
|
| 并发用户数 |
|
|
|
| 吞吐量 |
|
|
|
👁 记住这个公式:吞吐量(TPS)= 并发用户数 ÷ 平均响应时间。例如:1000 人并发、平均 100ms 响应,TPS = 1000 ÷ 0.1s = 10000 req/s。
1.3 四种测试类型怎么选?
基准测试(Benchmark):类似于”测重”——用单一负载测试,建立性能基准值。这是所有后续测试的参照物,没有基准值,加压再多也是瞎测。
负载测试(Load Testing):正常负载下的测试,治性性增加并发,找到系统容量上限。从 100 人加到 10000 人,观察 TPS 曲线什么时候开始负载。
压力测试(Stress Testing):超过设计负载,测系统的极限和容错能力。比如设计上限是 10000 并发,就测 15000、20000,看看系统是”优雅降级”还是”直接崩溃”。
稳定性测试(Soak Testing):用正常负载跑 8 小时甚至 24 小时,观察内存是否持续增长、连接池是否慢慢耗尽。很多内存泄漏,只有长时间运行才会暴露。
二、Gatling深度解析——为什么10万并发首选它?
2.1 传统工具的困境
JMeter:同步阻塞线程模型,每个拟虚拟用户占一个线程,线程创建、切换、销毁本身就有巨大开销。模拟 10万并发时,JMeter 光线程管理就要消耗大量 CPU,实际可用于发请求的资源所剩无几。优点:GUI 界面直观,录制器好用。
⚙ 图2:Gatling Actor模型 vs JMeter线程模型 – 内存效率差异巨大
Locust:基于 Python,川异步程模拟并发,资源占用比 JMeter 低。但 Python 有 GIL(全局解释器锁),CPU 密集型任务无法真正并行。在高并发下,Python 协程调度器的开销也会显现。更重要的是,Locust 的 HTML 报告功能较弱,分析数据不够直观。
k6:近年来表现不错的工具,基于 Go 语言,支持 JavaScript 脚本,单机并发能力比 JMeter 强。但 k6 的脚本需要一定 JS 基础,生态没有 Gatling 成熟,报告可视化也不如 Gatling 精致。
2.2 Gatling的核心优势
Gatling 之所以在高并发场景下表现出色,核心在于 Akka 框架的 Actor 模型。
简单类比:JMeter 像餐厅里每个顾客占一个服务员全程等待上菜;Gatling 像一个服务员同时接侍 1000 个顾客——服务员先把订单投到后厨,在等待的过程中去接待其他顾客,菜好了再回来上菜。这种”同时接侍”的能力,就是异步非阻塞的核心。
具体来说:
- Actor 模型
:每个拟虚拟用户是一个载入式 Actor,不是操作系统线程,内存占用微不可忽。 - Netty NIO
:基于 Java NIO 的网络框架,用单线程处理海量连接,不阻塞。 - 事件驱动
:请求发送后立刻返回,等响应来了再处理,不占用线程等待。
💰 关键数据对比:同等的 10 万并发压测,JMeter 需要约 16 GB 内存,Gatling 只需约 2 GB,差距 8 倍。
2.3 四大工具全面对比
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.4 Gatling适用场景
非常适合:
-
高并发 API 压测(10 万+并发) -
微服务性能压测 -
WebSocket / HTTP/2 压测 -
需要精准分位统计的场景 -
CI/CD 流水线中的自动化性能测试
不太适合:
-
完全没有变成基础、完全不想接触代码的人(GUI 支持有限) -
需要录制复杂业务场景的 UI 操作的人(JMeter 的录制器更好用)
2.5 开源版 vs 商业版
Gatling 有两个版本:
- 开源版(gatling-charts-highchart)
:完全免费,支持 Scala DSL、HTML 报告、Maven/Gradle 集成。本文全部基于开源版演示,零成本。 - FrontLine 版(商业版)
:云端执行引擎、Web UI 管理、商业支持。适合大型企业。
三、开发工具准备——VS Code + 三大插件
3.1 为什么选 VS Code?
VS Code(Visual Studio Code)是微软出品的免费代码编辑器,在全球拥有数千万开发者使用。相比 IntelliJ IDEA 和 Eclipse,它有以下优势:
🔧 图3:VS Code及三大插件安装流程
- 完全免费
:开源且免费,不需要购买许可证 - 轻量快速
:启动只需 1-2 秒,不会像 IDEA 那样等半天 - 插件丰富
:Scala (Metals) 插件可以无缝集成 Scala 语言服务 - TRAE AI 集成
:TRAE AI 的官方插件支持直接在 VS Code 中使用 AI 辅助编程 - 跨平台
:Windows、macOS、Linux 都能用
3.2 VS Code 安装(手把手步骤)
第一步:下载安装包
打开浏览器,访问官方下载地址:
👉 https://code.visualstudio.com/
页面会自动检测你的操作系统(Windows),点击页面中央的大绿色按钮 “Download for Windows“,下载安装包(约 100 MB)。
第二步:运行安装向导
下载完成后,双击安装包(.exe 文件),启动安装向导:
-
点击 “Next“ -
阅读许可协议,点 “I accept the agreement“,再点 “Next“ -
选择安装位置(默认即可),点 “Next“ -
⭐ 重要:在”Select Additional Tasks”界面,务必勾选: -
☑️ “Add to PATH”(添加 到系统环境变量,命令行里才能直接用 code命令) -
☑️ “Register Code as an editor for file types supported”(可选,建议勾选) -
点 “Install” 等待安装完成 -
安装完成点 “Finish“
第三步:启动并配置中文界面
安装完成后,VS Code 会自动启动(如果没有,手动双击桌面或开始菜单中的 VS Code 图标)。
首次启动后,如果界面是英文,按以下步骤切换为中文:
-
按 Ctrl + Shift + P,会弹出一个输入框 -
在输入框中输入 “display language“,会看到 “Configure Display Language” 选项 -
点击它,会打开语言选择面板 -
选择 “Chinese (Simplified) (中文简体)” -
VS Code 会提示你安装语言包,点击 “Install and Restart”(安装并重启) -
等待 VS Code 自动重启,界面就变成中文了
⚠️ 常见错误:如果在命令行里输入 code 提示”不是内部或外部命令”,说明安装时没有勾选”Add to PATH”。解决方法:控制面板 → 系统 → 高级系统设置 → 环境变量 → 编辑 PATH → 添加 C:\Program Files\Microsoft VS Codein
3.3 第一个插件:Scala (Metals)
这个插件是做什么的?
Metals 是 Scala 的语言服务器(LSP),它会在你编写 Scala 代码时提供:语法高亮、代码自动补全、错误提示、跳转到定义等功能。没有这个插件,你的 Scala 代码会像记事本一样,没有颜色、没有提示、错误也不知道在哪里。
安装步骤(详细):
-
在 VS Code 中,按 Ctrl + Shift + X 打开扩展面板(左侧边栏有一个方形图标) -
在扩展搜索框中输入 “metals“(注意:输入时不需要引号) -
在搜索结果中,找到 “Scala (Metals)“,发布者为 “Scalameta“(不是其他同名插件) -
点击该插件卡片上的 “Install” 按钮 -
等待安装完成(会显示”重新加载”按钮) -
点击 “重新加载窗口” 以激活插件
安装完成后,VS Code 底部状态栏会显示 “Metals” 字样,表示 Scala 语言服务已启动。如果提示需要安装 JDK,按照下一节的步骤安装即可。
3.4 第二个插件:Scala Syntax(语法高亮)
这个插件是做什么的?
Metals 只提供语言服务,不提供语法高亮。Scala Syntax 插件为 .scala 文件提供专业的语法着色,让代码更容易阅读。这个插件很轻量,和 Metals 配合使用效果最好。
安装步骤:
-
按 Ctrl + Shift + X 打开扩展面板 -
搜索 “scala syntax“ -
找到 “Scala Syntax“(通常显示为官方或相关插件) -
点击 “Install“
3.5 第三个插件:TRAE AI Coding Assistant(重点⭐)
这个插件是做什么的?
这是本文的核心工具!TRAE AI 是 AI 编程助手,可以在 VS Code 中直接和 AI 对话。你只需要描述你想实现的功能,AI 就能帮你生成 Gatling Scala 脚本。你不需要懂 Scala 语法,只需要会复制粘贴提示词。
安装步骤(详细):
-
按 Ctrl + Shift + X 打开扩展面板 -
在搜索框中输入 “trae” 或 “AI coding assistant“ -
在结果中找到 “Coding Assistant by TRAE“,图标是一只狗头(🐶),发布者为 TRAE AI -
点击 “Install” 按钮 -
安装完成后,VS Code 左侧边栏会出现 TRAE 的图标(狗头) -
点击该图标,会提示你登录(GitHub / Google / 邮箱均可) -
登录后,选择模型:推荐选择 Claude 3.5 Sonnet(性价比最高,效果好)
如何打开 TRAE AI 面板?
按 Ctrl + Shift + Y,TRAE AI 面板会在右侧打开。或者直接点击左侧边栏的狗头图标。
TRAE AI 可以做什么?(5个高频使用场景)
- 生成脚本
:描述你的压测需求,AI 生成完整 Gatling 脚本 - 解释代码
:粘贴一段代码,让 AI 解释这段代码在做什么 - 修复报错
:复制报错信息给 AI,AI 给出修复建议 - 优化性能
:AI 分析你的脚本,给出性能优化建议 - 生成测试数据
:让 AI 生成 100 个测试用户名/密码(CSV 格式)
免费额度说明:
TRAE AI 有免费额度(新用户赠送一定数量的消息),用完之后可以购买订阅或配置自己的 API Key(Claude / OpenAI 均可)。设置方法:Ctrl + , 打开设置 → 搜索 “TRAE” → 找到 “API Key” 输入框 → 填入你的密钥。
3.6 三个工具组合的威力
这三个工具组合在一起,形成了一个完整的高效开发闭环:
- VS Code
:代码编辑器,你写代码、读代码的地方 - Metals
:实时检测代码错误,有错误会在代码下方显示红色波浪线 - TRAE AI
:你把报错信息复制给 AI,AI 告诉你怎么修,生成修复代码
日常工作流示例:
-
你在 VS Code 中编写 Gatling 脚本 -
Metals 检测到语法错误,在代码下面显示红色波浪线 -
你把鼠标悬停在错误上,看到报错信息 “not found: value csv” -
按 Ctrl + Shift + Y 打开 TRAE AI,输入:”这个报错是什么意思?怎么修复?” -
AI 回复:”缺少 import 语句,请在文件顶部添加:import io.gatling.core.Predef._” -
你复制代码,粘贴到文件顶部,红色波浪线消失
💡 记住这个组合:VS Code(编辑器)+ Metals(语法检查)+ TRAE AI(代码生成)= 零基础也能写 Gatling 脚本。
四、前置环境安装——JDK + Maven + 创建项目
4.1 工具选择:Maven 项目版 vs 独立版
Gatling 有两种使用方式:
📁 图4:Maven项目目录结构和Gatling数据流向
- 独立版(ZIP 包)
:下载一个 ZIP 文件,解压后直接运行 gatling.sh 或 gatling.bat。适合快速体验,不依赖 Maven。缺点是脚本管理不方便,依赖管理不灵活。 - Maven 项目版(推荐)
:用 Maven 创建项目,所有依赖( Gatling、Scala、Netty 等)通过 pom.xml 自动管理。缺点是需要安装 Maven,但好处多多:和 VS Code + Metals 无缝集成、CI/CD 集成方便、依赖版本管理清晰。
本文选择 Maven 项目版,因为我们要用 VS Code + Metals 开发,Maven 项目是这类工具的最佳拍档。
4.2 安装 JDK(详细步骤)
第一步:先检查是否已安装 JDK
打开 CMD 命令行窗口(按 Win + R,输入 cmd,回车),输入以下命令:
# 检查 Java 版本java -version
openjdk version "21.0.3" 2024-01-16 LTSOpenJDK Runtime Environment (Temurin-21+35) (build 21.0.3+9-LTS)OpenJDK 64-Bit Server VM (build 21.0.3+9-LTS, mixed mode, sharing)
如果提示 “‘java’ 不是内部或外部命令”,请继续安装。
第二步:下载 JDK 安装包
推荐使用 Eclipse Temurin(原 AdoptOpenJDK),免费、无需登录。
浏览器打开:👉 https://adoptium.net/
点击页面上的 “Latest release” 按钮(会自动下载最新 LTS 版本,JDK 21 或 JDK 17)。如果想要特定版本,点击 “Other platforms” 手动选择:
-
Version: JDK 21 或 JDK 17(两个版本都支持 Gatling) -
Operating System: Windows -
Architecture: x64 -
Package type: .msi(推荐,比 ZIP 更方便,自动配置环境变量)
第三步:运行安装向导
下载完成后,双击 .msi 安装包:
-
点 “Next“ -
选择安装目录(默认 C:\Program Files\Eclipse Adoptium\jdk-21.x.x-hotspot\,建议不改) -
⭐ 重要:确保安装界面中有 “Set JAVA_HOME” 或 “Add to PATH” 选项并勾选(大多数版本默认勾选) -
点 “Install“,等待安装完成(约 1-2 分钟) -
点 “Finish“
第四步:验证安装
重要:必须打开一个新的 CMD 窗口(之前的窗口不会刷新环境变量),输入:
# 必须在新窗口中执行java -version
应该看到类似 “openjdk version “21.x.x” 或 “17.x.x” 的输出。
⚠️ 如果 java -version 还是不行:控制面板 → 系统 → 高级系统设置 → 环境变量 → 在”系统变量”中检查:
① 是否有 JAVA_HOME,值应为 C:\Program Files\Eclipse Adoptium\jdk-21.x.x-hotspot
② PATH 中是否有 %JAVA_HOME%in
如果没有,手动添加后重启 CMD。
4.3 安装 Maven(详细步骤)
第一步:下载 Maven
打开浏览器,访问 Maven 下载页面:👉 https://maven.apache.org/download.cgi
滚动到 “Files” 部分,找到 “Binary zip archive”,点击下载 apache-maven-3.9.9-bin.zip(或最新的 3.9.x 版本,约 10 MB)。
🔴 重要提醒:Maven 安装路径中不要有空格和中文。不要装到”Program Files”或”下载”文件夹里。建议放在 D: oolspache-maven-3.9.9 或 C:\mavenpache-maven-3.9.9。
第二步:解压到指定目录
下载完成后:
-
在 D 盘根目录(或 C 盘)创建一个文件夹 tools -
将 ZIP 文件解压到 D: ools\,最终目录结构为:D: oolspache-maven-3.9.9\ -
确认 bin 目录:D: oolspache-maven-3.9.9in
第三步:配置环境变量
-
控制面板 → 系统 → 高级系统设置 → 环境变量 -
在”系统变量”区域,点击”新建“: -
变量名: MAVEN_HOME -
变量值: D: oolspache-maven-3.9.9 -
找到”系统变量”中的 PATH,双击编辑,点击”新建“,添加:%MAVEN_HOME%in -
点击确定保存
第四步:验证 Maven 安装
必须打开一个新的 CMD 窗口,输入:
mvn -version
图片引自微信公众号,扫码关注阅读原文✅ 环境验证清单:运行以下两个命令,两个都成功才能继续:
① java -version → 显示 Java 版本
② mvn -version → 显示 Maven 版本 + Java 版本
4.4 一键创建 Gatling Maven 项目(详细步骤)
第一步:创建项目文件夹
在 D 盘创建一个 projects 文件夹(如果你想统一管理项目),然后在里面创建 gatling-demo 项目文件夹:
# 创建项目目录D:\projects> mkdir gatling-demoD:\projects> cd gatling-demo
第二步:运行 Maven 命令创建项目
在 gatling-demo 目录下,运行以下命令(整个命令是一行,可以复制到记事本去掉换行后复制):
mvn archetype:generate -DarchetypeGroupId=io.gatling -DarchetypeArtifactId=gatling-highcharts-maven-archetype -DarchetypeVersion=3.9.5 -DgroupId=com.perftest -DartifactId=gatling-demo -DinteractiveMode=false
参数说明:
archetypeGroupId
:Gatling 官方提供的项目模板来源,固定为 io.gatlingarchetypeArtifactId
:模板名称, gatling-highcharts-maven-archetype是包含 HTML 报告的版本archetypeVersion
:Gatling 版本号, 3.9.5是稳定版(推荐使用)groupId
:Java 包名,类似于公司域名反写,如 com.你的名字artifactId
:项目名称,即文件夹名 interactiveMode=false
:静默模式,不需要交互,直接生成
第三步:等待 Maven 下载依赖(1-3 分钟)
首次运行 Maven 会自动下载 Scala 库、Gatling 核心、Netty、Maven 插件等大量依赖。耐心等待,看到 “BUILD SUCCESS” 表示成功。
第四步:验证项目结构
命令执行成功后,在 gatling-demo 目录下输入以下命令查看结构:
dir /s /b
正确生成的项目结构应该包含:
src/test/scala/
— 你的测试脚本放这里 src/test/resources/
— 测试数据文件(如 CSV) src/main/resources/
— 应用配置文件 pom.xml
— Maven 依赖配置,非常重要 results/
— 压测报告生成在这里
💡 小提示:打开 VS Code,选择”文件 → 打开文件夹”,选择 D:\projects\gatling-demo,VS Code 会自动识别这是一个 Maven 项目,左侧会显示项目目录结构。你可以在 src/test/scala/ 下看到示例 Simulation 文件(可以删除或重命名)。
五、AI辅助编写Gatling脚本——核心章节(超详细)
5.0 开始前的心理建设
在正式开始之前,我想告诉你三句话:
⏰ 图5:Gatling压测流程 – Ramp-Up + 持续压测阶段
- 「你不需要会编程」
:TRAE AI 会帮你写代码,你只需要描述需求 - 「你只需要会复制粘贴」
:这是本文要求你掌握的唯一技能 - 「遇到报错很正常」
:报错是学习的一部分,我会告诉你如何用 AI 解决报错
本章会用到两个 AI 提示词,我用橙色背景标注。复制后直接粘贴到 TRAE AI 即可。
5.1 实战案例背景
我们选择 httpbin.org 作为被测目标。这是一个公开的免费 API 服务,专门用于测试 HTTP 请求。它收到什么就返回什么,非常适合作为压测练习的目标。
我们的测试需求:
-
测试接口: POST https://httpbin.org/post -
请求类型:表单提交(application/x-www-form-urlencoded) -
请求参数:username(从 CSV 读取,字段名 username),password(固定值 TestPass123) -
虚拟用户:100 人 -
加压方式:10 秒内从 0 均匀加到 100 人 -
测试持续时间:30 秒 -
断言条件:95 分位响应时间 小于 1000 毫秒,成功率大于 99%
5.2 第一步——用 TRAE AI 生成 CSV 测试数据
详细操作步骤:
-
打开 VS Code -
按 Ctrl + Shift + Y,打开 TRAE AI 面板 -
在底部的输入框中,复制粘贴以下内容(可直接复制下面的全部内容):
请帮我生成100个测试用户名,格式为CSV,包含三列:username, email, password
– username格式:testuser001 到 testuser100
– email格式:test001@example.com 到 test100@example.com
– password统一为:TestPass123
– 第一行为表头
– 用英文逗号分隔,不要加引号
-
按 Enter 或点击「发送」按钮,等待 AI 生成(5-15 秒) -
AI 生成完成后,点击输出框右侧的「复制」按钮 -
在 VS Code 中,按 Ctrl + N 新建文件 -
按 Ctrl + V 粘贴内容 -
按 Ctrl + Shift + S(另存为),导航到: D:\projects\gatling-demo\user-files\data\
文件名输入:login_users.csv,编码选择 UTF-8,点保存 -
在 VS Code 左侧资源管理器中,展开 user-files/data/,确认 login_users.csv 文件存在 -
打开文件,确认格式正确(第一行是表头:username,email,password)
✅ CSV 文件格式示例(应该是这样的):
username,email,password
testuser001,test001@example.com,TestPass123
testuser002,test002@example.com,TestPass123
…(共 100 行)
5.3 第二步——用 TRAE AI 生成 Gatling 脚本(核心)
详细操作步骤:
-
按 Ctrl + Shift + Y,重新打开(或确保)TRAE AI 面板 -
在输入框中,复制粘贴以下完整提示词(可直接复制下面的全部内容):
请帮我生成一个Gatling Scala压测脚本,需求如下:
被测信息:
– 接口URL:POST https://httpbin.org/post
– Content-Type: application/x-www-form-urlencoded
– 请求参数:username(从CSV读取,字段名username),password(固定值TestPass123)
压测需求:
– 虚拟用户数:100人
– 加压方式:10秒内从0均匀加到100人
– 测试持续时间:30秒
– 断言条件:95分位响应时间小于1000毫秒,成功率大于99%
请生成完整的Simulation.scala文件代码,每个代码段都要加上详细的中文注释,注释要解释「为什么要这样写」而不是只说「这是什么」。
-
按 Enter 或点击发送,等待 AI 生成(10-30 秒,取决于模型速度) -
AI 生成完成后,点击输出框右侧的「复制」按钮 -
在 VS Code 左侧资源管理器中,右键点击 src/test/scala/文件夹 -
选择「新建文件」,文件名输入: LoginSimulation.scala -
按 Ctrl + V 粘贴代码 -
按 Ctrl + S 保存文件
5.4 脚本逐行解析——让你真正理解代码
生成的脚本大概长这样。下面我把它拆分成若干个部分,逐段解释。每一段都附上了详细的中文注释,确保你不仅知道「怎么写」,更知道「为什么这样写」。
第一部分:包声明和导入
// 第一部分:包声明和导入package computerdatabase// import 语句从指定包导入类/函数,_ 是通配符,导入所有内容import io.gatling.core.Predef._ // Gatling 核心库,几乎所有脚本都要导入import io.gatling.http.Predef._ // HTTP 请求功能,发 GET/POST 请求全靠它import scala.concurrent.duration._ // 时间单位支持,有了它才能写 .seconds
为什么要这样写?
package computerdatabase 是 Maven 模板默认的包名,保持不变即可。三个 import 是 Gatling 的「标准开场白」:核心库提供基础功能,HTTP 库提供网络请求能力,时间库让你能写 `.during(10.seconds)` 这种人类可读的写法。
第二部分:HTTP 协议配置
// 第二部分:HTTP 协议配置val httpProtocol = http.baseUrl("https://httpbin.org") // 所有请求的根地址.acceptHeader("application/json") // 告诉服务器:我们期望返回 JSON.contentTypeHeader("application/x-www-form-urlencoded") // 请求体格式
为什么要这样写?
baseUrl 设置后,后面写 `.post(“/post”)` 就等于 POST https://httpbin.org/post。如果要切换到生产环境,只需要改这一行,所有请求地址自动更新。acceptHeader 和 contentTypeHeader 是 HTTP 请求头,告诉服务器我们发送和接收的数据格式。
第三部分:CSV 数据源配置
// 第三部分:CSV Feeder 数据源配置val csvFeeder = csv("user-files/data/login_users.csv").circular// csv() 读取 CSV 文件// .circular 模式:数据用完后从头循环再用(100 用户,50 行数据,第 51 个用户复用第 1 行)// .queue 模式:数据用完测试停止(不推荐,容易莫名其妙结束)// .random 模式:每次随机选一行(适合模拟真实用户多样性)
// 第四部分:Scenario 场景定义(描述一个用户会做什么)val loginScenario = scenario("登录场景")// feed(csvFeeder):从 CSV 取数据,每次取一行.feed(csvFeeder)// exec() 执行一个 HTTP 请求.exec(http("登录请求").post("/post")// ${username} 中的 $ 表示「引用变量」,花括号内是变量名(来自 CSV 表头).formParam("username", "${username}").formParam("password", "TestPass123")// status.is(200) 断言:期望返回 HTTP 200 才算成功.check(status.is(200))))
// 第五部分:SetUp 配置(控制虚拟用户如何到达)setUp(loginScenario// inject() 控制虚拟用户如何注入:rampUsers(100).during(10.seconds)// 意思是:在 10 秒内均匀加压到 100 人,第 1 秒约 10 人,第 5 秒约 50 人.inject(rampUsers(100).during(10.seconds))// protocols() 引用前面定义的 HTTP 协议配置.protocols(httpProtocol)// maxDuration() 整个测试的最长运行时间,防止意外无限运行.maxDuration(30.seconds))
// 第六部分:断言(满足条件测试才算通过).assertions(// global.responseTime.percentile(95) 表示「95 分位响应时间」// 即:95% 的请求必须在多少毫秒内完成// .lt(1000) 表示必须小于 1000 毫秒(lt = less than)global.responseTime.percentile(95).lt(1000),// global.successfulRequests.percent.gt(99) 表示成功率必须大于 99%(gt = greater than)global.successfulRequests.percent.gt(99))
5.5 保存并检查语法错误
脚本保存后,观察 VS Code 窗口:
- 没有红色波浪线
?很好,语法没问题,可以继续下一步 - 有红色波浪线
?把鼠标悬停在红色部分,读取报错信息: -
复制报错信息(Ctrl + C) -
Ctrl + Shift + Y 打开 TRAE AI -
输入:「这个 Gatling Scala 报错是什么意思?怎么修复?报错内容:[粘贴报错]」 -
AI 会告诉你原因和修复方法,照做即可
⚠️ 常见报错速查:
not found: value csv → 缺少 import,在文件顶部加一行:import io.gatling.core.Predef._
type mismatch → 数据类型错误,检查 ${} 变量引用是否正确
value ${username} → 少了美元符号,检查是否为 ${username}
5.6 小流量验证——先跑 1 个用户确认脚本正确
这是最关键的一步!在跑 100 个用户之前,必须先用 1 个用户验证脚本是否正确。
操作步骤:
-
在 VS Code 中打开 LoginSimulation.scala -
找到 rampUsers(100),临时改为rampUsers(1) -
找到 during(10.seconds),临时改为during(1.seconds) -
按 Ctrl + S 保存 -
打开 CMD,进入项目目录: cd /d D:\projects\gatling-demo -
执行命令:
mvn test -Dgatling.simulationClass=computerdatabase.LoginSimulation
-
观察输出:5 秒内看到 BUILD SUCCESS → 脚本没问题,可以跑正式测试 -
如果看到大量红色 ERROR → 把报错信息复制给 TRAE AI 修复 -
验证成功后,把 rampUsers(1)改回rampUsers(100),during(1.seconds)改回during(10.seconds),保存
六、正式执行测试——mvn test 全流程
6.1 为什么要用 mvn test 而不是 gatling.sh?
前面提到我们用的是 Maven 项目版,所以执行压测的方式也用 Maven 的标准命令:mvn test。
这比独立版的 gatling.sh 有几个优势:
- 标准化
:Maven 是行业标准,所有 CI/CD 工具(Jenkins、GitLab CI 等)都支持 - 依赖管理
:pom.xml 里的依赖自动下载,不需要手动复制 JAR 包 - 参数灵活
:可以通过命令行参数指定运行哪个脚本,不用每次改代码
6.2 执行命令详解
标准执行命令:
mvn test -Dgatling.simulationClass=computerdatabase.LoginSimulation
参数说明:
mvn test
:Maven 测试命令,会编译代码并运行测试 -Dgatling.simulationClass
:指定运行哪个 Simulation 类(Java/Maven 的标准参数格式:-Dkey=value) computerdatabase.LoginSimulation
:类的全限定名(包名.类名)
首次执行时会发生什么?
-
Maven 检测到项目没有编译过,先执行 mvn compile -
编译 Scala 源码(Scala 代码会被编译成 Java 字节码) -
Maven 启动 Gatling 测试引擎 -
Gatling 按配置执行测试(10 秒加压 + 30 秒持续,共约 40 秒) -
测试结束后,Gatling 在 results/ 目录下生成 HTML 报告
预计执行时间:首次约 2-3 分钟(编译),后续约 40-50 秒。
6.3 执行过程中的输出解读
测试执行过程中,命令行窗口会不断输出信息。下面是各阶段的解读:
[] --- scala-maven-plugin:4.8.1:compile (default-compile) @ gatling-demo ---[] Compiling 1 Scala source to ... arget\classes ...[] BUILD SUCCESS ← 编译成功!Select simulation script:0) computerdatabase.LoginSimulation ← 用数字选择(输入 0 回车)================================================================================users: 0 / 100 ← 实时虚拟用户数量Active users: 87 ← 当前并发活跃用户Waiting users: 13 ← 等待中的用户Done: 0 ← 已完成请求数Requests tooltip: OK: 2450 KO: 0 ← 成功/失败请求数Response time tooltip: min: 245ms max: 890ms avg: 412ms ← 响应时间统计percentile 50: 389ms percentile 75: 467mspercentile 95: 678ms percentile 99: 789ms================================================================================Simulation computerdatabase.LoginSimulation completed in 34 seconds---- Assertions Statistics -----------------------------------------------------[] gatling assertion assertions.0 PASSED ← 断言通过![] gatling assertion assertions.1 PASSED ← 断言通过![] BUILD SUCCESS[] Reports generated in: D:\projects\gatling-demo\results\...
当看到 BUILD SUCCESS 且两个断言都 PASSED 时,说明测试全部通过!
6.4 查看 HTML 报告
测试完成后,Gatling 会自动生成一份精美的 HTML 报告,打开方式:
HTML 报告包含以下内容,每一项都是超链接,可以点击进入详细视图:
- Statistics
:总请求数、成功数、失败数、TPS、响应时间分布 - Request Latencies Distribution
:响应时间分布直方图 - Number of requests per second
:每秒请求数折线图 - Response time percentiles over time
:响应时间分位值随时间变化曲线 - Active users over time
:活跃用户数随时间变化 - Response time distribution
:响应时间分布图
6.5 七大核心指标解读
打开 HTML 报告后,关注以下七个核心指标:
|
|
|
|
|
|---|---|---|---|
| Total Requests |
|
|
|
| Success Rate |
|
|
|
| TPS |
|
|
|
| Avg Response Time |
|
|
|
| P95 Response Time |
|
|
|
| P99 Response Time |
|
|
|
| Max Response Time |
|
|
|
6.6 AI 辅助分析报告
你可以把 Gatling 报告的关键数据复制给 TRAE AI,让 AI 帮你解读:
请帮我分析这份Gatling压测报告数据:
– 总请求数:3000
– 成功:2985 (99.5%)
– 失败:15 (0.5%)
– 平均响应时间:412ms
– P50:389ms
– P95:678ms
– P99:789ms
– 最大响应时间:890ms
– TPS峰值:85 req/s
请告诉我:1)整体性能评估(良好/一般/差);2)是否存在问题;3)改进建议。
6.7 升级挑战:把并发提升到 10000
完成第一次压测后,可以尝试更高的并发来挑战系统:
-
修改 rampUsers(100)→rampUsers(10000) -
修改 during(10.seconds)→during(60.seconds)(加压时间更长,系统更容易承受) -
修改 .maxDuration(30.seconds)→.maxDuration(60.seconds) -
确保 CSV 数据有足够的行数(如果有 1000 行,就够用)
💡 10000 并发测试的意义:验证你的系统能否在 10 秒内从 0 平滑扩展到 1 万并发,观察系统是在哪个时间点开始出现性能拐点(响应时间开始飙升)。这个拐点就是系统的实际容量上限。
七、CI/CD集成与自动化
7.1 为什么要把压测加入CI/CD流水线?
手动运行压测的问题是:人可能会忘记、版本可能会遗漏。而把压测集成到 CI/CD 流水线中,可以实现:每次代码提交或合并时,自动运行压测,报告自动生成,数据自动对比。
如果压测结果不达标(成功率低于 99%,95 分位响应时间超过阈值),流水线自动失败,阻止部署到生产环境。这就是「质量门禁」的概念——性能不达标,代码不能合并。
7.2 Jenkins 集成示例
在 Jenkins 中创建一个新的 Pipeline 项目,配置如下:
pipeline {agent anystages {stage('Checkout') {steps {checkout scm}}stage('Gatling Performance Test') {steps {bat 'mvn test -Dgatling.simulationClass=computerdatabase.LoginSimulation'}}}post {always {archive 'results/**'publishHTML target: [allowMissing: false, alwaysLinkToLastBuild: true,reportDir: 'results', reportFiles: '**/index.html', reportName: 'Gatling Report']}}}
这个 Pipeline 的效果是:每次代码提交,Jenkins 自动运行压测,并在构建页面中直接展示 Gatling HTML 报告。
7.3 常见陷阱速查表
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
八、常见问题Q&A
Q1:提示「不是内部或外部命令」,java 或 mvn 无法识别怎么办?
A:环境变量没有配置正确。请检查 PATH 中是否包含 %JAVA_HOME%in 和 %MAVEN_HOME%in。具体操作:控制面板 → 系统 → 高级系统设置 → 环境变量 → 编辑 PATH。
Q2:Metals 插件一直显示「正在下载…」,无法启动怎么办?
A:可能是网络问题(需要访问境外服务器)。可以尝试配置 Maven 国内镜像,在 pom.xml 中添加阿里云镜像源。
Q3:生成的 CSV 文件是乱码怎么办?
A:保存文件时,确保编码选择 UTF-8(不是 ANSI 或 GBK)。VS Code 右下角会显示当前文件编码,如果显示的是 GBK,手动点击改成 UTF-8。
Q4:Trae AI 显示额度用完了怎么办?
A:可以购买订阅(月付约几十元),或者配置自己的 API Key(Claude / OpenAI 的 Key 均可)。
Q5:JMeter 能达到 10 万并发吗?
A:理论上可以通过分布式集群实现,但单机几乎不可能。JMeter 每 1000 并发约消耗 1.5 GB 内存,10 万并发需要约 150 GB 内存。
Q6:我想测试 HTTPS 接口,需要额外配置吗?
A:不需要。Gatling 原生支持 HTTPS,只需要把 baseUrl 从 http:// 改成 https:// 即可。
Q7:测试报告可以导出为 PDF 吗?
A:Gatling 原生不支持 PDF 导出,但可以在浏览器中打开 HTML 报告后,使用浏览器打印功能(Ctrl+P)导出为 PDF。
Q8:如何测试 WebSocket 接口?
A:Gatling 支持 WebSocket 协议,使用 ws() 方法即可。Trae AI 也可以帮你生成 WebSocket 测试脚本。
九、总结
回顾一下今天的学习路径:
第一步:安装工具
VS Code + Scala (Metals) + TRAE AI
第二步:AI生成脚本
TRAE AI 帮你写代码,你只需要复制粘贴
第三步:mvn test 执行
查看精美的 HTML 报告,读懂性能数据
这篇文章的核心观点是:在 AI 时代,写 Gatling 压测脚本不再是程序员的专利。只要你会复制粘贴提示词,你就可以完成专业的性能测试工作。
你现在拥有的技能:
-
能够独立完成 10 万并发压力测试 -
能够用 HTML 报告解读性能瓶颈 -
能够把压测集成到 CI/CD 流水线 -
能够用 AI 工具快速生成和调试脚本
这是测试工程师群体中非常稀缺的能力组合。持续练习,多尝试不同的场景,你会越来越熟练。
