如何以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
相关产品推荐
相关产品推荐

