Gatling 系列专题(第三篇):编写复杂脚本与模拟真实用户行为

Gatling 系列专题(第三篇):编写复杂脚本与模拟真实用户行为

前言

在前两篇中,我们介绍了 Gatling 的背景并完成了安装与初次测试。现在,是时候深入探索它的核心功能——通过脚本模拟真实用户行为。无论是测试登录流程、搜索功能还是下单场景,Gatling 都能帮助你设计贴近现实的测试。本篇将带你从简单请求升级到复杂场景,掌握脚本编写的关键技巧。

脚本基础回顾

Gatling 的测试脚本由三个主要部分组成:

  1. HTTP 协议配置:定义目标地址、请求头等。
  2. 场景(Scenario):描述用户行为,如点击、提交表单。
  3. 负载设置(SetUp):指定用户数量和注入模式。

在第二篇中,我们用一个简单的 GET 请求测试了首页。现在,让我们扩展它,模拟一个完整的用户旅程。

场景设计:模拟用户登录与浏览

假设我们要测试一个电商网站,用户需要登录、浏览商品并查看详情。以下是一个示例脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
import io.gatling.core.Predef._
import io.gatling.http.Predef._
import scala.concurrent.duration._

class UserJourneySimulation extends Simulation {
  // HTTP 协议配置
  val httpProtocol = http
    .baseUrl("https://example-ecommerce.com")
    .acceptHeader("application/json, text/html")
    .userAgentHeader("Mozilla/5.0 (Windows NT 10.0; Win64; x64)")

  // 用户行为场景
  val scn = scenario("UserJourney")
    .exec(http("Visit Home Page")
      .get("/"))
    .pause(2) // 模拟用户停留 2 秒
    .exec(http("Login")
      .post("/api/login")
      .formParam("username", "testuser")
      .formParam("password", "password123")
      .check(status.is(200))) // 检查登录成功
    .pause(1)
    .exec(http("Browse Products")
      .get("/products"))
    .pause(3)
    .exec(http("View Product Detail")
      .get("/products/123"))

  // 负载设置
  setUp(
    scn.inject(
      rampUsers(50).during(30.seconds) // 30 秒内逐步增加到 50 个用户
    )
  ).protocols(httpProtocol)
}

关键功能解析

  1. 请求类型
    • get():发送 GET 请求。
    • post():发送 POST 请求,支持表单参数(如 formParam)或 JSON 负载。
  2. 暂停(pause):模拟用户思考或页面加载的时间,单位为秒。
  3. 检查(check):验证响应状态码、内容等。例如 status.is(200) 确保请求成功。
  4. 负载模式
    • atOnceUsers(n):一次性注入 n 个用户。
    • rampUsers(n).during(t):在 t 时间内逐步增加到 n 个用户。

进阶技巧:动态数据与会话管理

现实中,用户不会都用相同的用户名登录,也不会只访问固定的页面。Gatling 提供了工具来处理动态数据:

  • Feeder(数据源):从 CSV 文件或其他来源读取数据。
  • Session(会话):保存和使用动态变量。

示例:使用 CSV 文件模拟不同用户登录。

  1. user-files/resources 目录下创建 users.csv
    username,password
    user1,pass123
    user2,pass456
    user3,pass789
    
  2. 修改脚本:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    val feeder = csv("users.csv").random // 随机读取用户数据
    
    val scn = scenario("DynamicUserJourney")
      .feed(feeder) // 注入数据
      .exec(http("Login")
        .post("/api/login")
        .formParam("username", "${username}") // 使用 CSV 中的变量
        .formParam("password", "${password}")
        .check(jsonPath("$.token").saveAs("authToken"))) // 保存登录令牌
      .exec(http("Browse Products")
        .get("/products")
        .header("Authorization", "Bearer ${authToken}")) // 使用会话中的令牌
    

测试与调试

  • 运行脚本:在终端运行 gatling.shgatling.bat,选择你的脚本。
  • 日志检查:如果遇到错误,查看 gatling.log(位于 results 目录)。
  • 报告分析:生成的 HTML 报告会显示每个请求的成功率、响应时间等。

第三篇小结

通过本篇,你学会了如何设计复杂的用户行为场景,结合动态数据和会话管理,让测试更贴近真实世界。Gatling 的灵活性在于它既能快速上手,又能满足高级需求。下一期,我们将聚焦测试报告的解读与性能瓶颈分析,助你从数据中挖掘价值。准备好优化你的应用了吗?

updatedupdated2025-03-312025-03-31