Gatling压测如何为每个虚拟用户会话调用不同的大体积JSON请求文件
Gatling多静态JSON请求体参数化实现方案
你要的参数化形式完全可以实现,以下是两种常用实现方案:
方案1:基于Feeder实现(推荐,可灵活切换随机/循环策略)
- 准备一个CSV配置文件(比如命名为
json_files.csv),内容如下:
filePath magnus/SendMedication_request_2021_1.json magnus/SendMedication_request_2021_2.json magnus/SendMedication_request_2021_3.json ... magnus/SendMedication_request_2021_10.json
- 代码中定义Feeder并绑定到场景:
// 随机读取模式 val jsonFeeder = csv("json_files.csv").random() // 循环顺序读取模式,替换上面一行即可 // val jsonFeeder = csv("json_files.csv").circular() val scn = scenario("用药推送压测场景") .feed(jsonFeeder) .exec(http("sendMedication") .post("/Patient/$sendMedication") .body(ElFileBody("${filePath}")) .check(status.is(200)) )
方案2:直接生成序号拼接路径(无需额外配置文件)
完全符合你提到的类似SendMedication_request_2021(#1).json的参数化需求,直接通过动态生成序号变量拼接路径即可,代码示例:
import java.util.concurrent.ThreadLocalRandom // 随机生成1-10的文件序号feeder val seqFeeder = Iterator.continually( Map("fileSeq" -> ThreadLocalRandom.current().nextInt(1, 11)) ) // 循环顺序生成序号的feeder,替换上面即可 // val seqFeeder = Iterator.iterate(1)(_ % 10 + 1).map(num => Map("fileSeq" -> num)) val scn = scenario("用药推送压测场景") .feed(seqFeeder) .exec(http("sendMedication") .post("/Patient/$sendMedication") .body(ElFileBody("magnus/SendMedication_request_2021_${fileSeq}.json")) .check(status.is(200)) )
注意事项
- ElFileBody原生支持EL表达式解析路径,所以可以直接通过session变量拼接路径,不需要额外处理文件加载逻辑
- 如果需要每个虚拟用户全局固定使用同一个文件,可以把feeder的逻辑放到用户初始化阶段,避免同个用户多次请求切换文件
内容的提问来源于stack exchange,提问作者Magnus Jensen
相关产品推荐
相关产品推荐

