如何在Gatling(Scala)中从Map/JsonPath传值到PebbleStringBody
Gatling + Scala 性能测试传值问题解决方案
核心问题原因
Gatling的会话变量与Pebble模板上下文是独立空间,模板不会自动读取会话中的变量,必须显式将会话变量映射到模板上下文。
具体解决方案
1. 传递Feeder或JsonPath保存的变量到模板
使用PebbleStringBody的重载方法,通过会话对象提取变量并构建模板上下文:
.feed(names) .exec(http("PerfTest") .post("/PerfTest/bulk") // 带Session参数的重载方法,显式传递变量到模板 .body(PebbleStringBody(session => """| [ | {% set Iteratecount = 2 %} | {% for t in range(1,Iteratecount) %} | { | "name": "{{name}}", | "TestID": "9888988FRFRFDD887887ESES", | "typeId": "9888988FRFRFDD887887ESES", | "statusId": "9888988FRFRFDD887887ESES", | "excludedFromAutoHyperlinking": true | } | {% if loop.last %} | {% else %},{% endif %} | {% endfor %} | ]""".stripMargin, // 从会话中提取需要的变量,传入模板上下文 Map("name" -> session("name").as[String]) )).asJson .check(status.is(200)) )
2. 循环内生成不同随机name(可选优化)
如果需要循环中每个对象使用不同的随机name,可直接在模板中生成,无需依赖feeder:
// 先导入scala.util.Random import scala.util.Random // 请求代码 .exec(http("PerfTest") .post("/PerfTest/bulk") .body(PebbleStringBody(session => """| [ | {% set Iteratecount = 2 %} | {% for t in range(1,Iteratecount) %} | { | "name": "PerfTest {{ randomAlphanumeric(10) }}", | "TestID": "9888988FRFRFDD887887ESES", | "typeId": "9888988FRFRFDD887887ESES", | "statusId": "9888988FRFRFDD887887ESES", | "excludedFromAutoHyperlinking": true | } | {% if loop.last %} | {% else %},{% endif %} | {% endfor %} | ]""".stripMargin, // 将随机生成方法传入模板上下文 Map("randomAlphanumeric" -> ((length: Int) => Random.alphanumeric.take(length).mkString)) )).asJson .check(status.is(200)) )
内容的提问来源于stack exchange,提问作者RUDRA GANESH SUBBARAYULU
相关产品推荐
相关产品推荐

