You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何以Session中的值为键将服务端返回的id存入Session?

问题解决:Gatling中动态Session键存储返回值的问题

问题核心

你在Gatling脚本中尝试将服务端返回的id以动态生成的订单名称(orderName1对应的值,如Name_68hKl90G)作为键存入Session,但实际存储的键是字面量${orderName1},而非预期的动态值。

预期Session存储

orderName1 -> Name_68hKl90G

Name_68hKl90G -> 63d80b25cb6c2a7e7e845e40

实际Session存储

orderName1 -> Name_68hKl90G

${orderName1} -> 63d80b25cb6c2a7e7e845e40

问题原因

Gatling中,StringBody这类方法内置了Session表达式解析逻辑,能识别${}格式的变量并替换为Session中的实际值,但saveAs方法仅接收普通字符串参数,不会自动解析${}表达式。当你传递"${orderName1}"给saveAs时,它会直接把这个字符串当作Session的键,而非解析成对应的订单名称。

解决方案

方案1:使用Session函数动态获取键值

修改create函数,在saveAs中通过Session函数直接提取orderName1的实际值作为存储键:

val generateStr = (symbols: Integer) => Random.alphanumeric.take(symbols).mkString

val prepareData = exec(
  session => {
    val orderName = "Name_" + generateStr(8)
    session.set("orderName1", orderName)
  }
)

def create() = exec(
  http("Create order")
    .post("/shop/order")
    // StringBody仍支持${}解析
    .body(StringBody("""{"name":"${orderName1}"}""".stripMargin)).asJson
    .check(status.is(201))
    // 通过Session函数获取实际订单名称作为存储键
    .check(jsonPath("$.id").saveAs(session => session("orderName1").as[String])) 
)

val userScn = scenario("Scenario")
  .exec(prepareData)
  .exec(create())

setUp(
  userScn.inject(rampUsers(rampUpUserCount) during (rampUpDuration seconds)),
).protocols(httpProtocol)

方案2:提前从Session中提取值再传递

在调用create函数前,先从Session中取出orderName1的实际值,再作为参数传递给create:

val generateStr = (symbols: Integer) => Random.alphanumeric.take(symbols).mkString

val prepareData = exec(
  session => {
    val orderName = "Name_" + generateStr(8)
    session.set("orderName1", orderName)
  }
)

def create(name: String) = exec(
  http("Create order")
    .post("/shop/order")
    .body(StringBody(s"""{"name":"${name}"}""".stripMargin)).asJson
    .check(status.is(201))
    .check(jsonPath("$.id").saveAs(name)) 
)

val userScn = scenario("Scenario")
  .exec(prepareData)
  // 先从Session提取实际订单名称,再调用create
  .exec(session => {
    val orderName = session("orderName1").as[String]
    create(orderName).apply(session)
  })

setUp(
  userScn.inject(rampUsers(rampUpUserCount) during (rampUpDuration seconds)),
).protocols(httpProtocol)

说明

两种方案都能实现将服务端返回的id以动态生成的订单名称作为键存入Session的需求,核心是绕开saveAs不支持表达式解析的限制,直接传递实际的键值字符串。

内容的提问来源于stack exchange,提问作者POMAIIIUK

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 00:52:40