当前位置: 首页 > 质量专栏 > 软件测试工具Gatling中的关联与动态参数提取:JSONPath、CSS选择器、正则表达式和Session API详解
软件测试工具Gatling中的关联与动态参数提取:JSONPath、CSS选择器、正则表达式和Session API详解
2025-11-28 作者cwb 浏览次数54

Gatling中主要的动态参数提取方式及其特点:

JSONPath :提取JSON格式响应中的字段,jsonPath("$.data.userId"),语法简洁,专为JSON设计,支持复杂嵌套查询

正则表达式:处理非结构化文本、HTML或复杂文本,regex("""<input type="hidden" value="(.*?)">"""),灵活性高,适用于任何文本模式匹配

CSS选择器 :解析HTML/XML文档,提取元素属性或文本,css("input[name='csrfToken']", "value"),针对HTML/XML结构,类似jQuery选择器

Session API:在代码中编程式访问已存储的Session变量,session("userId") 提供最大灵活性,用于复杂逻辑处理


主要提取方式详解

JSONPath 提取

JSONPath是处理JSON响应时最直接的工具。


基础提取和保存:

scala

.exec(http("Get User Info")

  .get("/api/user")

  .check(jsonPath("$.data.userId").saveAs("userId")) // 提取userId并存入Session

  .check(jsonPath("$.friends[0].id").saveAs("firstFriendId")) // 提取嵌套数组中的值

)


这里的 $.data.userId 是一个JSONPath表达式,用于定位JSON中特定字段。



条件提取和验证:

scala

.check(jsonPath("$.projects[?(@.status == 'active')].projectName").findAll.optional.saveAs("activeProjects"))


此表达式使用过滤器 [?(@.status == 'active')] 来查找所有状态为"active"的项目名。


正则表达式提取

当响应内容为非结构化文本,或者需要匹配特定文本模式时,正则表达式非常有用。


基础模式匹配:

scala

.exec(http("Login Request")

  .post("/login")

  .formParam("username", "testuser")

  .formParam("password", "testpass")

  .check(regex("""authToken":\s*"([^"]+)""").saveAs("authToken")) // 提取authToken

)


这个正则表达式匹配 authToken": " 后面的非引号字符序列。


多重匹配和验证:


scala

.check(regex("""productId=(\d+)""").findAll.saveAs("productIds")) // 查找所有productId

.check(regex("""Welcome, (\w+)""").exists) // 验证"Welcome"后跟用户名是否存在


findAll 用于获取所有匹配项,exists 仅验证模式存在。


CSS 选择器提取

主要用于HTML响应内容的元素提取。

提取元素属性和文本:


scala

.exec(http("Get Homepage")

  .get("/")

  .check(css("form input#csrfToken", "value").saveAs("csrfToken")) // 提取CSRF令牌

  .check(css("div#userProfile", "data-user-role").saveAs("userRole")) // 提取data属性

  .check(css("title").find.transform(_.toUpperCase).saveAs("pageTitle")) // 提取标题并转换

)


css("selector", "attribute") 中,若省略属性参数,则默认提取元素的文本内容。


Session API 编程式处理

对于无法通过声明式检查器处理的复杂场景,可直接操作Session对象。


复杂数据转换和验证:


scala

.exec { session =>

  // 从Session获取提取的值

  val userId = session("userId").as[String]

  val timestamp = System.currentTimeMillis()

  

  // 生成动态值(如时间戳或哈希)

  val dynamicParam = s"${userId}_${timestamp}_${hash(userId + timestamp)}"

  

  // 将新值存入Session供后续使用

  session.set("dynamicParam", dynamicParam)

}

.exec(http("Request with Dynamic Param")

  .get(s"/api/data?signature=${dynamicParam}") // 使用动态参数

)


这种方式在处理需要计算的动态参数(如签名、时间戳)时非常有用。


组合应用和流程控制

将提取的参数组合使用,并加入条件逻辑,可以模拟真实的用户业务流程。


scala

val complexScenario = scenario("Complex User Journey")

  .exec(

    http("Initial Page Load")

      .get("/home")

      .check(css("meta[name=csrf-token]", "content").saveAs("csrfToken"))

      .check(regex("""sessionId:\s*'([^']+)""").saveAs("sessionId"))

  )

  .exec(

    http("API Data Request")

      .post("/graphql")

      .header("X-CSRF-Token", "${csrfToken}") // 使用之前提取的CSRF令牌

      .body(StringBody(

        """{

          "query": "query { user(id: \"${sessionId}\") { profile { email, preferences } } }"

        }"""

      )).asJson

      .check(jsonPath("$.data.user.profile.email").saveAs("userEmail"))

  )

  .doIf(session => session("userEmail").as[String].contains("@company.com")) { // 条件判断

    exec(

      http("Internal API Call")

        .get("/internal/api?user=${userEmail}")

        .check(jsonPath("$.accessLevel").saveAs("accessLevel"))

    )

  }

  .exec(

    http("Final Submission")

      .post("/submit")

      .formParam("sessionId", "${sessionId}")

      .formParam("userEmail", "${userEmail}")

      .formParam("accessLevel", "${accessLevel}")

      .check(status.is(200))

  )


实战技巧和排错

提取器组合:对一个请求可应用多个 .check,提取多个参数。

空值处理:对可能不存在的字段使用 .optional,避免因提取失败而终止测试。

会话调试:在开发测试脚本时,可以使用 session => { println(session); session } 打印会话内容,帮助诊断提取问题。

优先级选择:对于JSON响应,优先选用JSONPath;对于HTML内容,CSS选择器通常比正则表达式更可靠;仅在处理特定文本模式或上述方法不适用时,才使用正则表达式。


掌握Gatling中的关联和动态参数提取,主要在于根据响应数据的类型和结构,选择最合适的提取方式:JSONPath用于JSON,CSS选择器用于HTML/XML,正则表达式用于模式匹配,Session API用于复杂逻辑。将它们灵活组合,就能模拟出各种真实的用户场景。

文章标签: 软件测试用例 软件测试 软件测试机构 软件测试需求 第三方软件测试中心 软件测试报告
咨询软件测试