Gatling中如何正确将List作为函数参数传递?
解决Gatling中Session列表参数传递问题
问题根源
- 直接传递
"${userNames}"是Gatling特定场景(如HTTP请求URL、参数)的字符串插值语法,本质是字符串类型,与produceTestMessage要求的List[String]参数类型不匹配。 - 从Session中提取自定义类型(如List)的变量,必须通过Session函数(接收Session对象的lambda表达式)来获取。
修正方案
方案1:直接修正Scenario中的调用
将Scenario最后一行的错误调用:
.exec(produceTestMessage("A", "${userNames}"))
替换为通过Session函数提取列表的写法:
.exec(session => produceTestMessage("A", session("userNames").as[List[String]]))
方案2:修正封装的方法
如果需要保留封装方法,修正produceTestMessage方法中的Session取值逻辑(去掉多余的${}):
// 重命名方法避免与原函数冲突 def produceTestMessageWrapper(): ChainBuilder = exec(session => produceTestMessage("A", session("userNames").as[List[String]]))
然后在Scenario中调用这个封装方法:
.exec(produceTestMessageWrapper())
额外语法修正
你的类定义存在多余大括号的语法错误,将:
class MyScenario extends KafkaChainBuilder { {
改为:
class MyScenario extends KafkaChainBuilder {
完整修正后代码示例
import io.gatling.core.structure.ChainBuilder import io.gatling.http.Predef._ class MyScenario extends KafkaChainBuilder { def produceTestMessageWrapper(): ChainBuilder = exec(session => produceTestMessage("A", session("userNames").as[List[String]])) // 设置Session变量的函数 def setSessionVariables(): ChainBuilder = exec(session => session .set("userId", "12345") .set("userNames", List("john_doe", "jane_doe", "bob_smith")) // 将userNames设为List[String] ) // 在其他链式调用中使用Session变量的函数 def useSessionVariables(): ChainBuilder = exec(http("Example Request") .get("/user/${userId}/${userNames(0)}") // 访问列表中的第一个userName .check(status.is(200)) ) val httpConf = http.baseUrl("http://example.com") // 配置基础URL val scn = scenario("My Scenario") .exec(setSessionVariables()) // 调用设置Session变量的函数 .exec(useSessionVariables()) // 调用使用Session变量的函数 .exec(produceTestMessageWrapper()) setUp( scn.inject(atOnceUsers(1)) // 模拟1个用户 ).protocols(httpConf) } // 原函数定义(假设已正确实现) def produceTestMessage(prop1: String, propLines: List[String]): ChainBuilder = { // 函数实现逻辑 ??? }
内容的提问来源于stack exchange,提问作者Pigna
相关产品推荐
相关产品推荐

