如何在Gatling中使用feeder生成随机多值Map并注入POST请求体
Gatling Feeder注入值为null问题修复方案
核心问题原因
你为feeder显式声明的Iterator[Map[String, Unit]]类型是错误根源:
- Scala中
Unit类型代表无返回值,你生成的随机字符串值会被强制转换为Unit,最终Map中存储的所有value都是空值 - 因此Gatling的EL表达式
${userName}读取到的是空值,对应日志中输出的()
修复方案
1. 单字段feeder修复
删除错误的显式类型声明,让Scala自动推导类型,或者显式声明为正确的Iterator[Map[String, String]]类型即可。同时注意如果请求头指定Content-Type: application/json,请求体需要符合JSON格式要求:
// 省略显式类型,由编译器自动推导为Iterator[Map[String, String]] val userFeeder = Iterator.continually(Map("userName" -> ("user_" + Random.alphanumeric.take(15).mkString))) val scn: ScenarioBuilder = scenario("GENERATE USER") .feed(userFeeder) .exec( http("CREATE USER") .post(userBaseUrl) .headers(userHeaders) // 用三重引号避免JSON转义,保证格式合法 .body(StringBody("""{"userName": "${userName}"}""")) ) setUp( scn.inject(atOnceUsers(1)) )
2. 多字段feeder扩展
同样删除错误的类型声明,同时修正你示例代码中的括号不匹配语法问题:
val userFeeder = Iterator.continually(Map( "userName" -> ("user_" + Random.alphanumeric.take(15).mkString), "userEmail" -> (Random.alphanumeric.take(15).mkString + "@random.edu"), "address" -> Random.alphanumeric.take(15).mkString ))
对应的请求体写法:
.body(StringBody(""" { "userName": "${userName}", "userEmail": "${userEmail}", "address": "${address}" } """))
内容的提问来源于stack exchange,提问作者rogue_wombat
相关产品推荐
相关产品推荐

