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)) )
问题原因
- 变量提前生成:代码中
generateRandomNumber()和generateRandomUUID()是在定义Scenario阶段直接调用的,属于初始化执行逻辑,而非每个虚拟用户运行时动态生成,导致所有用户共用同一组固定值。 - 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
相关产品推荐
相关产品推荐

