使用Gatling发送请求时doWhile方法出现编译错误如何解决?
问题原因
- Gatling Scala DSL的
doWhile方法参数列表不符合要求:Gatling 3.x及以上版本的doWhile方法签名要求传入两个参数,第一个是循环条件,第二个是循环名称,你只传入了循环条件,缺少第二个参数,直接触发参数缺失的编译错误。 - 代码存在语法错误:你在
exec(session => {})的函数内部写了.doIf(session("scrollId").asOption[String].isEmpty),这个方法调用没有前置的调用主体,属于无效语法,会干扰编译器对doWhile方法的识别。 - 业务逻辑存在隐患:
session("scrollId").asOption[String].get在scrollId不存在时会直接抛出空指针异常,导致压测任务异常中断。
解决方案
修正后的代码
builder // 第二个参数传入下划线作为默认循环名称的占位符,符合方法签名要求 .doWhile("${scrollId.exists()}", _) { exec(http(s"$title") .post(endpoint) .headers(headers) .body(ElFileBody(requestBodyFilePath)) // 加optional修饰,避免响应无scrollId时直接报错 .check(jsonPath("$.scrollId").optional.saveAs("scrollId")) .check(status.is(200))) .pause(1) .exec(session => { // 用模式匹配处理scrollId存在/不存在的场景,避免空指针 session("scrollId").asOption[String] match { case Some(scrollId) => session.set("scrollId", scrollId) case None => session.remove("scrollId") } }) }
改动说明
- 给
doWhile补全第二个参数,用_作为默认循环名称的占位,直接解决参数缺失的编译报错。如果你需要自定义循环名称,也可以传入字符串值,比如doWhile("${scrollId.exists()}", "scrollQueryLoop")。 - 给
jsonPath检查加上optional修饰,响应中没有scrollId时也不会直接抛出检查失败异常。 - 移除session函数中的无效
.doIf调用,改用模式匹配处理scrollId的两种情况,不存在时直接从session中移除,保证${scrollId.exists()}的循环判断逻辑正常生效。
内容的提问来源于stack exchange,提问作者isanma
相关产品推荐
相关产品推荐

