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

Gatling多用户Session变量重复、Karate获取为null的问题咨询

问题排查与解决方法

问题现象

使用Karate 1.3.1及Gatling插件4.2.9编写Scala代码时,出现两个核心问题:

  • 所有虚拟用户的randomNumber、randomUUID变量值完全相同
  • 在test.feature中通过karate.get("randomNumber")获取到的值为null

原始代码示例:

val TestScenario = scenario("MultipleUser")
    .exec { session =>
      session.setAll(Map(
          "randomNumber" -> generateRandomNumber(),
          "randomUUID" -> generateRandomUUID()))}
    .exec { session =>
      if (session.contains("randomNumber")) {
        println("myVariable exists")
        println("randomNumber: " + session("randomNumber").as[Long])
        println("randomUUID: " + session("randomUUID").as[String])
      } else {
        println("myVariable does not exist")
      }
      session
    }
    .exec(karateFeature("classpath:com/test/karate-gatling/features/test.feature"))

  setUp(
    TestScenario.inject(atOnceUsers(5))
)

问题原因

  1. 变量提前生成:代码中generateRandomNumber()和generateRandomUUID()是在定义Scenario阶段直接调用的,属于初始化执行逻辑,而非每个虚拟用户运行时动态生成,导致所有用户共用同一组固定值。
  2. Session上下文隔离:Gatling的Session与Karate的运行上下文是完全独立的,直接存储在Gatling Session中的变量,Karate无法直接读取,必须手动同步到Karate的上下文中。

解决方法

1. 修正变量生成时机

将随机值的生成逻辑放到exec的函数内部,确保每个虚拟用户执行时才动态生成独立的随机值:

.exec { session =>
  // 每个用户执行时才触发随机值生成
  val randomNum = generateRandomNumber()
  val randomUuid = generateRandomUUID()
  session.setAll(Map(
    "randomNumber" -> randomNum,
    "randomUUID" -> randomUuid
  ))
}

2. 同步变量到Karate上下文

修改karateFeature的调用,通过withSession方法将Gatling Session中的变量同步到Karate的运行上下文:

.exec(karateFeature("classpath:com/test/karate-gatling/features/test.feature")
  .withSession(gatlingSession => 
    gatlingSession.setAll(Map(
      "randomNumber" -> gatlingSession("randomNumber").as[Long],
      "randomUUID" -> gatlingSession("randomUUID").as[String]
    ))
  )
)

完整修正后代码

val TestScenario = scenario("MultipleUser")
    .exec { session =>
      val randomNum = generateRandomNumber()
      val randomUuid = generateRandomUUID()
      session.setAll(Map(
        "randomNumber" -> randomNum,
        "randomUUID" -> randomUuid
      ))
    }
    .exec { session =>
      if (session.contains("randomNumber")) {
        println("myVariable exists")
        println("randomNumber: " + session("randomNumber").as[Long])
        println("randomUUID: " + session("randomUUID").as[String])
      } else {
        println("myVariable does not exist")
      }
      session
    }
    .exec(karateFeature("classpath:com/test/karate-gatling/features/test.feature")
      .withSession(gatlingSession => 
        gatlingSession.setAll(Map(
          "randomNumber" -> gatlingSession("randomNumber").as[Long],
          "randomUUID" -> gatlingSession("randomUUID").as[String]
        ))
      )
    )

setUp(
  TestScenario.inject(atOnceUsers(5))
)

验证效果

  • 每个虚拟用户会生成独立的randomNumber和randomUUID值
  • 在test.feature中通过karate.get("randomNumber")可以正常获取到对应用户的变量值

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:25:30