Gatling Recorder 是一款专为性能测试脚本快速开发设计的本地HTTP/HTTPS代理服务器。重要作用是,将传统繁琐的手动编写脚本过程,转化为自动化捕获用户操作并生成高性能、可读性强的Gatling Scala脚本,极大提升脚本创建效率。
一、 架构和工作原理
Gatling Recorder 本质上是一个中间人代理:
流程详解:
流量导向:你将浏览器或被测应用的网络代理设置为Recorder(默认 localhost:8000)。
请求拦截:Recorder启动一个代理服务器,监听指定端口,捕获所有流经的HTTP/HTTPS请求和响应。
解码和重组:对于HTTPS请求,Recorder会使用其自签名的CA证书(需手动信任)进行SSL/TLS解密,从而能读取明文内容。随后将原始的请求头、请求体、URL、响应等数据重组为结构化数据。
脚本生成:Recorder内部有一套模板引擎,将这些结构化数据映射为 Gatling的领域特定语言 代码。并不是简单记录,而是智能地生成包含exec、pause、check等语义化结构的脚本。
二、 配置和操作
1. 启动和方式选择
启动Gatling Recorder一般有两种方式:
通过Gatling Bundle:执行 bin/gatling-recorder.sh (Linux/Mac) 或 bin/gatling-recorder.bat (Windows)。
通过IDEA插件:在IntelliJ IDEA中安装Gatling插件后,有图形化入口。
方式:
HTTP代理方式:最常用。Recorder作为系统/浏览器代理。
HAR转换方式:不直接录制,而是导入浏览器开发者工具导出的 .har 文件,将其转换为Gatling脚本。适用于复杂或难以直接录制的情形。
2. 配置面板分析
在Recorder的GUI界面中,以下配置非常重要:
代理配置:端口默认8000。保证不和本地其他服务冲突。
HTTP/HTTPS方式:必须和被测协议一致。录制HTTPS网站必须启用HTTPS方式。
证书配置:生成CA证书,首次使用HTTPS必须操作:点击生成,会创建 gatlingCACert.pem。必须手动将其导入到操作系统或浏览器的“受信任的根证书颁发机构”,否则浏览器会报安全错误。
过滤器方法:黑名单:默认。录制“除了”列表外的所有请求。白名单:仅录制列表中的请求。精炼脚本第一选择,可过滤掉大量静态资源(如图片、CSS、JS)和分析器请求。
一致方式:支持Java正则表达式。如,白名单方式可设为:.*https://yourapp.zmtests.com/api/.* 仅录制API。
输出配置:包名 & 类名,定义生成脚本的Scala包结构和主类名,关系到项目结构。
格式:选择生成脚本的语言,一般为默认的 Scala 3。
Simulation文件夹:指定脚本输出目录,需指向Gatling项目的 user-files/simulations/ 对应包途径下。
请求体缓存:启用,建议启用。对于POST/PUT等含请求体的操作,能保证录制的脚本在回放时发送完全相同的负载数据。
3. HTTPS录制专项配置
HTTPS录制失败是最常见问题,请严格按流程操作:
在Recorder中点击 “生成CA证书”,保存到已知位置。
信任证书:
Windows:双击.pem文件,选择“安装证书”->“本地计算机”->“将所有证书放入下列存储”->“浏览”->“受信任的根证书颁发机构”。
macOS:双击.pem文件,打开“钥匙串访问”,将证书拖入“系统”钥匙串,然后双击该证书,在“信任”部分设置为“始终信任”。
浏览器:有些浏览器(如Firefox)使用独立证书库,需在其设置中手动导入并信任。
在Recorder中勾选“启用HTTPS代理”。
配置浏览器系统代理为localhost:8000 (或使用SwitchyOmega等插件)。
三、 脚本分析优化
Recorder生成的是可直接运行的脚本,但一般需要优化以提高性能和可维护性。
原始录制脚本示例:
scala
.exec(
http("请求首页")
.get("/")
.headers(headers_0)
.check(status.is(200))
)
.pause(1) // 录制时操作间隔
.exec(
http("登录API")
.post("/api/login")
.headers(headers_1)
.formParam("username", "testUser") // 硬编码数据
.formParam("password", "testPass")
.check(jsonPath("$.token").saveAs("authToken")) // 提取令牌
)
专业优化:
数据剥离和参数化:
移除硬编码:将testUser等数据移至Feeder (CSV、JSON) 或使用Session变量,实现多用户迭代。
动态参数处理:对于CSRF令牌、时间戳等,使用正则表达式或JSON Path提取器 (check) 从响应中捕获,并作为参数传递到后续请求。
请求清理:
删除静态资源请求:通过白名单过滤后,手动清理剩余的无关请求(如.png, .css)。
合并重点API序列:将思路上连续的一组API调用(如:添加商品->修改库存)保留在一个脚本中,保证业务流完整。
检查点和断言:
增加业务断言:在重点请求后,不仅检查HTTP状态码,更应使用 jsonPath、css、substring 等检查响应体内容,证实业务正确性(如:check(jsonPath("$.success").is("true")))。
暂停时间合理化:
将录制的固定pause时间,替换为 pace(控制迭代节奏)或更符合真实用户思考时间的随机停顿(如:pause(2 seconds, 5 seconds))。
四、 配置故障排除
HTTPS连接错误:浏览器提示“不安全连接”或“证书无效”。
1. 保证证书已正确生成并导入到系统根信任库。
2. 重启浏览器。
3. 尝试在Recorder中删除旧证书并重新生成。
捕获不到请求:Recorder无任何请求流入。
1. 确定代理配置正确(IP: 127.0.0.1, Port: 8000)。
2. 关闭浏览器所有插件或其他代理工具。
3. 检查系统防火墙是不是阻止了Recorder。
脚本回放失败:录制成功,但回放时报错(如404、参数错误)。
1. 检查动态参数是不是成功提取并传递。
2. 检查请求头是不是完整(如 Content-Type、Referer)。
3. 启用requestbodies文件夹,对比录制和回发的请求体差别。
性能考虑:录制大量请求时Recorder卡顿。
1. 必须使用白名单,精确过滤。
2. 关闭不必要的浏览器标签。
3. 对于超长流程,考虑分段录制,再用代码整合。
白名单:录制开始前,优先规划并设置白名单规则,从源头保证脚本精简。
一次流程,一个脚本:针对一个完整的业务情形(如“用户从登录到下单”)进行录制,保持脚本的业务独立性。
录制后必优化:录制生成的脚本是毛坯,必须进行数据参数化、检查点强化、无关请求清理才能成为生产可用的精装性能脚本。
版本控制:将优化后的脚本纳入Git等版本控制系统,和测试数据分离管理。