第三方软件测试公司:【Gatling基于Scala的开源高性能负载测试工具】

Gatling是一款基于Scala构建的开源、高性能的负载测试工具。它特别适合进行高并发、高负载的性能测试,并且在 DevOps 和 CI/CD 流程中起了重要的作用。

我将为您介绍一份关于 Gatling 的全面、详细且专业的介绍。

为什么选择 Gatling?
极高的性能和低资源消耗

异步与非阻塞架构:Gatling 基于 Akka 工具包构建,采用异步和非阻塞 I/O 模型。这意味着它不使用传统的"一个用户一个线程"的模式,而是用少量线程处理大量并发用户。这使得它在生成数千甚至数万并发用户时,对硬件资源(CPU、内存)的需求远低于 JMeter 等线程阻塞式工具。

仿真器与报告器分离:负载生成和报告生成是分离的。在测试运行时,Gatling 只专注于产生负载并轻量级地记录数据,待测试结束后再生成详细的 HTML 报告。这进一步保证了测试期间的性能。

易于维护的 DSL语言

Gatling 使用 Scala 语言提供了一套领域特定语言(DSL)。这套 DSL 非常像自然语言,使得测试场景的定义清晰、简洁、易于理解。

示例对比:

Scala 复制代码
// 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 依赖:

Scala 复制代码
// 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"
  1. 编写一个基本的 Simulation

在 src/test/scala 目录下创建你的第一个性能测试类,例如 BasicSimulation.scala:

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)   // 设置测试最大时长
}
  1. 执行测试与查看报告

使用 sbt 命令执行:

bash 复制代码
# 进入项目根目录
cd your-gatling-project

# 只运行 BasicSimulation
sbt "gatling:testOnly BasicSimulation"

# 运行所有 Simulation
sbt gatling:test

# 不运行测试,只生成报告(如果已有日志文件)
sbt gatling:last

执行完成后,Gatling 会在 target/gatling 目录下生成一个带有时间戳的报告文件夹。打开其中的 index.html 即可查看完整的交互式报告。

一些复杂情况

复杂的注入策略:

Gatling 提供了非常灵活的负载模型,可以模拟各种真实的用户到达模式。

Scala 复制代码
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 层级。

Scala 复制代码
// 全局断言:要求所有请求的99%分位响应时间小于100ms,且所有请求失败率低于1%
setUp(...).assertions(
  global.responseTime.percentile(99).lt(100),
  global.failedRequests.percent.lt(1.0)
)

数据驱动与动态数据:

可以从外部文件(如 CSV)中读取数据,并为每个虚拟用户提供不同的测试数据,避免缓存。

Scala 复制代码
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注入与逻辑漏洞

相关推荐
可可南木2 小时前
3070文件格式--15--bootptab文件
功能测试·测试工具·pcb工艺
冬奇Lab5 小时前
一天一个开源项目(第17篇):ViMax - 多智能体视频生成框架,导演、编剧、制片人全包
开源·音视频开发
一个处女座的程序猿7 小时前
AI之Agent之VibeCoding:《Vibe Coding Kills Open Source》翻译与解读
人工智能·开源·vibecoding·氛围编程
一只大侠的侠8 小时前
React Native开源鸿蒙跨平台训练营 Day16自定义 useForm 高性能验证
flutter·开源·harmonyos
生而为虫8 小时前
Selenium打开网页时保持登陆状态
selenium·测试工具
IvorySQL8 小时前
PostgreSQL 分区表的 ALTER TABLE 语句执行机制解析
数据库·postgresql·开源
一只大侠的侠9 小时前
Flutter开源鸿蒙跨平台训练营 Day11从零开发商品详情页面
flutter·开源·harmonyos
我会一直在的9 小时前
Jmeter的基础使用
功能测试·jmeter·压力测试
一只大侠的侠9 小时前
React Native开源鸿蒙跨平台训练营 Day18自定义useForm表单管理实战实现
flutter·开源·harmonyos
一只大侠的侠9 小时前
React Native开源鸿蒙跨平台训练营 Day20自定义 useValidator 实现高性能表单验证
flutter·开源·harmonyos