第三方软件测试公司:【Gatling基于Scala的开源高性能负载测试工具】
Gatling是一款基于Scala构建的开源、高性能的负载测试工具。它特别适合进行高并发、高负载的性能测试,并且在 DevOps 和 CI/CD 流程中起了重要的作用。
我将为您介绍一份关于 Gatling 的全面、详细且专业的介绍。
为什么选择 Gatling?
极高的性能和低资源消耗
异步与非阻塞架构:Gatling 基于 Akka 工具包构建,采用异步和非阻塞 I/O 模型。这意味着它不使用传统的"一个用户一个线程"的模式,而是用少量线程处理大量并发用户。这使得它在生成数千甚至数万并发用户时,对硬件资源(CPU、内存)的需求远低于 JMeter 等线程阻塞式工具。
仿真器与报告器分离:负载生成和报告生成是分离的。在测试运行时,Gatling 只专注于产生负载并轻量级地记录数据,待测试结束后再生成详细的 HTML 报告。这进一步保证了测试期间的性能。
易于维护的 DSL语言
Gatling 使用 Scala 语言提供了一套领域特定语言(DSL)。这套 DSL 非常像自然语言,使得测试场景的定义清晰、简洁、易于理解。
示例对比:
// Gatling DSL - 非常直观
scenario("Standard User Flow").exec(http("Get Homepage").get("/")).pause(2).exec(http("Search for Product").get("/search?term=gatling")).pause(1, 5) // 随机停顿,更真实.exec(http("View Product Detail").get("/product/1234"))
相比于 JMeter 的 GUI 或 XML,Gatling 的脚本更易于版本控制(Git)、代码评审和重构。
强大的报告能力
Gatling 默认生成非常详细、专业且可视化的 HTML 报告。报告包含了所有关键性能指标,如响应时间分布、请求成功率、吞吐量等,并以动态图表形式展示。
报告能清晰地展示测试过程中性能指标的变化趋势,便于快速定位性能瓶颈。
原生 CI/CD 集成支持
由于测试脚本是代码,Gatling 可以轻松地集成到持续集成/持续部署流程中(如 Jenkins, GitLab CI, GitHub Actions)。
你可以将性能测试作为流水线的一个阶段,自动执行并收集结果,实现"性能左移"。
概念和工作流程
工作流程:
录制或编写脚本:使用 Recorder 或直接编写 Scala DSL 脚本。
编译:使用构建工具(sbt, Maven, Gradle)将 Scala 脚本编译成 JVM 字节码。
执行:Gatling 引擎加载编译后的代码,根据配置的负载模型(如用户注入策略)执行测试。
生成报告:测试结束后,引擎根据内存中的统计信息生成详细的 HTML 报告。
常用概念:
Scenario(场景): 定义了一个虚拟用户的行为流程,即一系列的动作(如 HTTP 请求、思考时间等)。
Simulation(仿真): 这是 Gatling 测试的入口点。一个 Simulation 类定义了:
要执行的 Scenario(s)
虚拟用户的注入策略(如何到达并发用户数)
测试的全局配置(如协议、断言等)
Protocol(协议): 主要定义要测试的目标系统协议,最常见的是 HttpProtocol。
快速入门:编写\执行
1. 项目设置(使用 sbt - Scala 构建工具)
创建一个标准的 sbt 项目,build.sbt 文件需要包含 Gatling 依赖:
// build.sbt
enablePlugins(GatlingPlugin)name := "gatling-performance-test"version := "1.0"scalaVersion := "2.13.12" // 请使用Gatling官方支持的Scala版本val gatlingVersion = "3.9.5"libraryDependencies += "io.gatling.highcharts" % "gatling-charts-highcharts" % gatlingVersion % "test"
libraryDependencies += "io.gatling" % "gatling-test-framework" % gatlingVersion % "test"
2. 编写一个基本的 Simulation
在 src/test/scala 目录下创建你的第一个性能测试类,例如 BasicSimulation.scala:
import io.gatling.core.Predef._ // 导入核心DSL
import io.gatling.http.Predef._ // 导入HTTP DSL
import scala.concurrent.duration._ // 导入时间单位class BasicSimulation extends Simulation {// 1. 定义HTTP协议配置val httpProtocol = http.baseUrl("https://jsonplaceholder.typicode.com") // 基础URL.acceptHeader("application/json") // 公共请求头.userAgentHeader("Gatling Performance Test")// 2. 定义测试场景val scn = scenario("Get Posts and Comments").exec(http("Get All Posts") // 请求名称,会显示在报告中.get("/posts") // HTTP GET 方法.check(status.is(200)) // 断言:检查响应状态码是否为200).pause(1.second) // 思考时间:暂停1秒.exec(http("Get First Post Comments").get("/posts/1/comments").check(status.is(200), jsonPath("$[0].email").exists) // 多个断言,检查JSON路径)// 3. 在Simulation中注入负载,定义测试策略setUp(scn.inject(nothingFor(4.seconds), // 开始前等待4秒atOnceUsers(10), // 立即注入10个用户rampUsers(50).during(30.seconds) // 在30秒内逐渐注入50个用户// constantUsersPerSec(5).during(1.minute) // 每分钟持续注入5个用户)).protocols(httpProtocol) // 绑定协议配置.maxDuration(1.minute) // 设置测试最大时长
}
3. 执行测试与查看报告
使用 sbt 命令执行:
# 进入项目根目录
cd your-gatling-project# 只运行 BasicSimulation
sbt "gatling:testOnly BasicSimulation"# 运行所有 Simulation
sbt gatling:test# 不运行测试,只生成报告(如果已有日志文件)
sbt gatling:last
执行完成后,Gatling 会在 target/gatling 目录下生成一个带有时间戳的报告文件夹。打开其中的 index.html 即可查看完整的交互式报告。
一些复杂情况
复杂的注入策略:
Gatling 提供了非常灵活的负载模型,可以模拟各种真实的用户到达模式。
setUp(scn.inject(rampUsersPerSec(1).to(10).during(2.minutes), // 2分钟内从1用户/秒逐渐增加到10用户/秒constantUsersPerSec(10).during(5.minutes), // 随后5分钟保持10用户/秒rampUsersPerSec(10).to(1).during(2.minutes) // 最后2分钟内逐渐减少).protocols(httpProtocol)
)
检查点与断言:
检查(Checks):用于验证响应内容,如状态码、响应体中的字段。
断言(Assertions):用于验证全局性能指标是否达标,定义在 Simulation 层级。
// 全局断言:要求所有请求的99%分位响应时间小于100ms,且所有请求失败率低于1%
setUp(...).assertions(global.responseTime.percentile(99).lt(100),global.failedRequests.percent.lt(1.0)
)
数据驱动与动态数据:
可以从外部文件(如 CSV)中读取数据,并为每个虚拟用户提供不同的测试数据,避免缓存。
val feeder = csv("users.csv").circular // 循环使用数据val scn = scenario("Data Driven Test").feed(feeder).exec(http("Get User ${userid}") // 使用CSV文件中的userid列.get("/users/${userid}"))
代码组织:
对于复杂的测试,可以将公共配置、场景、数据等分离到不同的 Scala 对象或类中,保持代码的整洁和可复用。
Gatling 是一款为现代高性能需求而生的负载测试工具。 它的优势在于:能够用更少的资源模拟更高的并发,可维护的代码,开箱即用的专业级报告。对DevOps 友好性:完美契合CI/CD流程。
如果你的团队具备一定的编程能力(尤其是 Scala/JVM 生态),并且需要进行大规模、高频率的性能测试,Gatling 是一个非常理想的选择。对于需要测试多种协议(如数据库、消息队列)或者团队技术栈以 GUI 操作为主的情况,JMeter 可能仍是更合适的选择。
文章来源:卓码软件测评
精彩推荐:点击蓝字即可
▲大语言模型(LLM)应用安全:Prompt提示词注入攻击测试与防御.
▲WebAPP应用第三方JavaScript库安全风险检测
▲WEB应用搜索功能的安全测试SQL注入与逻辑漏洞