Gatling Session变量替换失败及POST请求URI捕获求助
针对Gatling性能测试问题的解决方案
问题1:Session变量AuctionId在Payload中未替换
Gatling的#{AuctionId} EL表达式仅在Gatling DSL的特定上下文(如直接定义在请求body的字符串中)才会自动解析。如果你的generateSlotNo是普通Scala方法,直接在方法内使用#{AuctionId}占位符不会触发变量替换——因为该方法脱离了Gatling的Session解析流程。
解决方案:
修改generateSlotNo方法,让它接收Session作为参数,手动从Session中提取AuctionId的值:
def generateSlotNo(session: Session): String = { val auctionId = session("AuctionId").as[String] s"slot_${auctionId}" // 按实际Payload格式拼接内容 }
在请求定义中,通过函数式方式调用该方法,确保Session被传入:
.exec(http("POST Request") .post("/your-endpoint") .body(StringBody(session => generateSlotNo(session))) )
这样就能正确从Session中获取AuctionId并生成替换后的Payload。
问题2:捕获POST请求的目标URI
场景1:目标URI提前构造/从CSV读取
如果POST目标URI是从CSV读取或提前通过Session变量构造的,直接在请求前将其存入Session即可:
// 假设CSV包含targetUri字段 .exec(csv("test-data.csv").circular) .exec(session => { val targetUri = session("targetUri").as[String] session.set("requestTargetUri", targetUri) }) .exec(http("POST Request") .post(session => session("requestTargetUri").as[String]) )
场景2:捕获含动态参数的实际请求URI
如果URI包含动态生成的参数,可通过Gatling的check机制或自定义日志输出:
.exec(http("POST Request") .post("/api/auction") .formParam("auctionId", "#{AuctionId}") // 捕获跳转后的URI(若存在跳转) .check(currentLocation.saveAs("responseLocation")) // 直接打印请求URI到日志 .extraInfoExtractor(session => { println(s"Sent POST to: ${session("requestTargetUri").as[String]}") Nil }) )
若需在测试报告中展示URI,可将其存入Session后,通过自定义报告处理器或日志工具提取。
内容的提问来源于stack exchange,提问作者Banu
相关产品推荐
相关产品推荐

