Gatling如何实现场景内请求并发?模拟A->B->[C,D,E]加载流程
首页加载场景请求时序模拟的最优实现方案
现有尝试方案的问题定位
你之前采用的两种实现方式,都错配了Gatling的调度层级,和真实浏览器的单用户请求逻辑不匹配:
- 方案1的核心问题:Gatling中注入阶段的
andThen是全局场景级的调度规则,会等待前一个场景的所有虚拟用户完全执行完毕、全部退出后,才会启动下一个场景,根本无法实现“单个用户完成A请求后立刻启动B”的单用户维度流程要求。 - 方案2的核心问题:Gatling中链式串联的单个
exec调用是串行执行逻辑,每个请求必须等待上一个请求的响应完全返回后才会触发,做不到“B响应完成后C、D、E并发启动”的要求。
适配需求的最优实现
完全匹配目标时序的实现思路,是把全流程整合为单场景内的虚拟用户独立执行链路,所有流程衔接都基于单个用户的自身状态触发,不依赖跨场景的全局调度:
- 流程拆分逻辑:
- 强依赖串行段:发起A请求 → 等待A响应返回 → 发起B请求 → 等待B响应返回,这部分必须串行执行
- 无依赖并发段:B响应返回后,由同一个虚拟用户并发发起C、D、E三个请求,三个请求之间无先后等待、无依赖
- 核心实现代码参考:
val homePageLoadTest = scenario("Home Page Load Time Test") // 串行执行A请求,等待完整响应 .exec(http("Request A").get("/endpoint/a")) // 串行执行B请求,A响应返回后立刻触发,等待完整响应 .exec(http("Request B").get("/endpoint/b")) // B响应返回后,同一用户并发触发C、D、E三个请求 .exec( http("Request C").get("/endpoint/c"), http("Request D").get("/endpoint/d"), http("Request E").get("/endpoint/e") ) // 配置50并发用户注入,无跨场景全局等待 .inject(constantUsersPerSec(50).during(60))
- 匹配性校验:
- 每个虚拟用户独立跑完全链路:用户发完A、收到响应后立刻发B,不需要等待其他用户完成A请求,彻底解决方案1的全局等待问题
- 同一个exec块内的多个请求会被虚拟用户并发发起:三个请求不存在先后依赖,不会出现D等C、E等D的串行等待问题,完全匹配并发要求
- 链路总耗时从用户发起A开始,到C、D、E全部响应返回为止,刚好覆盖首页完整加载的全周期,匹配加载耗时的测试目标
实现注意事项
- 不要把C、D、E拆成单独的exec链式调用,否则会退回到方案2的串行执行问题
- 不要把单个请求拆成独立场景用andThen做全局衔接,否则会退回到方案1的跨用户等待问题
内容的提问来源于stack exchange,提问作者John Subas
相关产品推荐
相关产品推荐

