如何在Gatling Java中通过GEL解析请求体中的嵌套会话变量?
Gatling Java:如何解析请求体中的会话变量表达式
问题描述
我用Gatling Java编写性能测试,会话变量VAR_X的值为Jerry。我写了一个发送请求的post()方法,尝试用自定义feeder提供请求体,但当前生成的请求体是"my_config { x: #{VAR_X} }",没能把#{VAR_X}替换成实际的会话变量值Jerry。原代码如下:
public ChainBuilder post() { List<String> requestBodyList = new ArrayList<String>(); Iterator<Map<String, Object>> feeder =requestBodyList.add(Collections.singletonMap("REQUEST_BODY", (Object) "my_config { x: #{VAR_X} }")).iterator(); return feed(feeder) .exec(http("Post request")) .post("x_resource/") .body(StringBody("#{REQUEST_BODY}")) }
问题分析
原代码存在语法错误和逻辑问题:
- 泛型不匹配:
requestBodyList定义为ArrayList<String>,但添加的是Map对象,编译会直接报错; - 语法错误:
List.add()返回的是boolean类型,无法直接调用iterator()方法; - 表达式解析限制:Gatling的表达式语言(GEL)只会解析最外层的
#{REQUEST_BODY},不会递归解析字符串内部嵌套的#{VAR_X},因此直接返回带嵌套表达式的字符串无法被解析。
解决方案
根据需求,提供两种可行的修改方式:
方式一:直接通过会话构造请求体(无需feeder)
如果请求体模板固定,仅需替换会话变量,完全可以不用feeder,直接用StringBody的函数式API从会话中取值拼接:
public ChainBuilder post() { return exec(http("Post request") .post("x_resource/") .body(StringBody(session -> "my_config { x: " + session.getString("VAR_X") + " }"))); }
方式二:保留feeder并手动解析变量(适用于多模板场景)
如果需要用feeder管理多个请求体模板,可以在feeder中存放带占位符的模板,然后在构造请求体时从会话中取值替换:
import io.gatling.javaapi.core.FeederBuilder; public ChainBuilder post() { // 正确构造feeder:存放带占位符的请求体模板 List<Map<String, Object>> requestBodyTemplates = new ArrayList<>(); requestBodyTemplates.add(Collections.singletonMap("REQUEST_TEMPLATE", "my_config { x: %s }")); Feeder<Object> feeder = FeederBuilder.from(requestBodyTemplates).build(); return feed(feeder) .exec(http("Post request") .post("x_resource/") .body(StringBody(session -> { // 从会话中获取模板和变量值,完成替换 String template = session.getString("REQUEST_TEMPLATE"); String varXValue = session.getString("VAR_X"); return String.format(template, varXValue); }))); }
说明
两种方式都能让会话变量VAR_X的值Jerry正确插入到请求体中,最终生成"my_config { x: Jerry }"的请求内容。
内容的提问来源于stack exchange,提问作者Taserface
相关产品推荐
相关产品推荐

