在Gatling的ScenarioBuilder中正确使用doSwitch及报错原因排查
Gatling doSwitch 使用${data}报错原因分析
问题描述
在Gatling场景构建代码中,使用doSwitch("${data}")时触发类型错误,报错信息如下:
Expected type was: (Any, io.gatling.core.structure.ChainBuilder).doSwitch("${data}")
对应的代码片段:
val builder: ScenarioBuilder = scenario("Test") .repeat(3) { pace(10.seconds) .feed(new DataFeeder()) .exec { session => val data = session("data").as[String] println(s"data: $data") session } .doSwitch("${data}") { // Define cases for different data values case "P1" => exec(myFunc(1000000)) case "P2" => exec(myFunc(2000000)) } }
报错原因
- doSwitch参数用法错误:Gatling的
doSwitch方法要求传入的是Session中属性的名称(字符串字面量),它会自动从Session中读取该属性的值来匹配分支。而你用"${data}"会被当作一个固定的字符串键(即Gatling会去Session里找名为${data}的属性,而不是名为data的属性),这完全不符合方法的参数要求,直接导致类型不匹配错误。 - 冗余代码干扰理解:你添加的那个打印
data的exec块完全多余,feed操作已经把data放入Session中,这个块只是读取打印,没有修改Session状态,反而容易混淆变量的作用域和传递方式。
修正后的代码
val builder: ScenarioBuilder = scenario("Test") .repeat(3) { pace(10.seconds) .feed(new DataFeeder()) .doSwitch("data") { // 直接传入Session属性名的字符串字面量 case "P1" => exec(myFunc(1000000)) case "P2" => exec(myFunc(2000000)) } }
补充说明
如果需要基于动态计算的表达式做分支判断,可以使用doSwitchOrElse或者switch方法,但针对当前的场景,直接传递Session属性名给doSwitch就可以完美解决问题。
内容的提问来源于stack exchange,提问作者Pigna
相关产品推荐
相关产品推荐

