Gatling使用feeder取10条数据重复发请求报嵌套属性错误如何解决
问题根因
Gatling内置的表达式语言(EL)不支持嵌套属性解析,你代码中写的${product_code${counter}}属于嵌套语法,会直接触发nested attribute definition is not allowed报错,无法通过EL本身实现动态拼接属性名的逻辑。
修复方案
你一次性读取10条feeder数据的逻辑本身没问题,只需要把动态拼接属性名的逻辑从EL层移到Session处理层,不要在URL路径里写嵌套EL即可,修正后的代码如下:
feed(products, 10) .repeat(10, "index") { exec(session => { // repeat内置的index从0开始计数,+1后对应feeder批量写入的product_code1~product_code10属性 val counter = session("index").as[Int] + 1 // 直接通过Scala代码拼接属性名,取出对应商品编码存入session val targetProductCode = session(s"product_code$counter").as[String] session.set("targetProductCode", targetProductCode).set("counter", counter) }) .exec(productIdsRequest()) } private def productIdsRequest() = { http("ProductId${counter}") // 直接取提前算好的商品编码,不需要嵌套EL .get(path + "products/${targetProductCode}") .check(jsonPath("$..code").count.gt(2)) }
更简洁的可选写法
如果没有强制要求必须一次性批量读取10条feeder数据,完全可以把feeder读取放到循环内部,每次循环读取1条商品数据,不需要手动处理下标拼接,代码更简洁不易出错:
repeat(10) { // 每次循环从feeder取1条数据,自动将product_code注入session feed(products) .exec(productIdsRequestSimple()) } private def productIdsRequestSimple() = { http("Get Product") .get(path + "products/${product_code}") .check(jsonPath("$..code").count.gt(2)) }
两种写法最终实现的效果完全一致:发起10次请求,每次请求对应1条feeder中的商品数据。
内容的提问来源于stack exchange,提问作者mismas
相关产品推荐
相关产品推荐

