Gatling的andThen()未执行,预热后无法运行正式负载测试
问题:Gatling预热场景执行后正式测试场景未启动
我希望在单个Simulation中依次执行两个场景:
- 预热场景:从0 RPS逐步提升至目标RPS,并保持该RPS数秒;
- 正式负载测试场景:预热完成后直接跳转至目标RPS,并保持流量一段时间。
以下是我的代码实现:
import io.gatling.javaapi.core.CoreDsl.* import io.gatling.javaapi.core.OpenInjectionStep.atOnceUsers import io.gatling.javaapi.core.Simulation import io.gatling.javaapi.http.HttpDsl.http import java.time.Duration class ComputerDatabaseSimulation : Simulation() { private val warmUp = scenario("WarmUp") .forever() .on(exec(http("[WarmUp] GET /computer-database.gatling.io").get("https://computer-database.gatling.io/computers"))) private val testScn = scenario("TestScn") .forever() .on(exec(http("[TestScn] GET /computer-database.gatling.io").get("https://computer-database.gatling.io/computers"))) init { setUp( warmUp .injectOpen(atOnceUsers(5)) .throttle( reachRps(2).during(Duration.ofSeconds(5)), holdFor(Duration.ofSeconds(10)) ) .andThen( testScn .injectOpen(atOnceUsers(5)) .throttle( jumpToRps(2), holdFor(Duration.ofSeconds(10)) ) ) ) } }
但实际运行时仅执行了WarmUp场景,TestScn完全被跳过,运行日志如下:
gradle gatlingRun --simulation=ComputerDatabaseSimulation > Task :load-tests:gatlingRun Simulation ComputerDatabaseSimulation started... ================================================================================ 2024-11-17 15:33:13 GMT 5s elapsed ---- Requests ------------------------------------------------------------------ > Global (OK=4 KO=0 ) > [WarmUp] GET /computer-database.gatling.io (OK=4 KO=0 ) ---- WarmUp -------------------------------------------------------------------- [--------------------------------------------------------------------------] 0% waiting: 0 / active: 5 / done: 0 ---- TestScn ------------------------------------------------------------------- [ ] 0% waiting: 5 / active: 0 / done: 0 ================================================================================ ================================================================================ 2024-11-17 15:33:18 GMT 10s elapsed ---- Requests ------------------------------------------------------------------ > Global (OK=14 KO=0 ) > [WarmUp] GET /computer-database.gatling.io (OK=14 KO=0 ) ---- WarmUp -------------------------------------------------------------------- [--------------------------------------------------------------------------] 0% waiting: 0 / active: 5 / done: 0 ---- TestScn ------------------------------------------------------------------- [ ] 0% waiting: 5 / active: 0 / done: 0 ================================================================================ ================================================================================ 2024-11-17 15:33:18 GMT 10s elapsed ---- Requests ------------------------------------------------------------------ > Global (OK=14 KO=0 ) > [WarmUp] GET /computer-database.gatling.io (OK=14 KO=0 ) ---- WarmUp -------------------------------------------------------------------- [--------------------------------------------------------------------------] 0% waiting: 0 / active: 5 / done: 0 ---- TestScn ------------------------------------------------------------------- [ ] 0% waiting: 5 / active: 0 / done: 0 ================================================================================ Parsing log file(s)... Parsing log file(s) done in 0s. Generating reports... ================================================================================ ---- Global Information -------------------------------------------------------- > request count 14 (OK=14 KO=0 ) > min response time 118 (OK=118 KO=- ) > max response time 428 (OK=428 KO=- ) > mean response time 215 (OK=215 KO=- ) > std deviation 121 (OK=121 KO=- ) > response time 50th percentile 130 (OK=130 KO=- ) > response time 75th percentile 360 (OK=360 KO=- ) > response time 95th percentile 428 (OK=428 KO=- ) > response time 99th percentile 428 (OK=428 KO=- ) > mean requests/sec 1.4 (OK=1.4 KO=- ) ---- Response Time Distribution ------------------------------------------------ > t < 800 ms 14 ( 100%) > 800 ms <= t < 1200 ms 0 ( 0%) > t >= 1200 ms 0 ( 0%) > failed 0 ( 0%) ================================================================================ BUILD SUCCESSFUL in 15s 4 actionable tasks: 4 executed
我使用的是Gatling 3.13.1,请问问题出在哪里?
解决方案
问题根源
warmUp场景使用了.forever()循环,导致该场景永远不会结束。Gatling的.andThen()方法要求前置场景完全终止(所有用户执行完毕)后,才会启动后续场景。而.forever()会让注入的用户无限循环执行请求,永远不会进入"done"状态,因此testScn永远无法被触发。
修复方法
需要让warmUp场景在节流周期结束后自动终止,有两种常用方式:
方式1:用.during()替代.forever()
直接指定warmUp场景的总运行时长,与节流的总时长(5s预热+10s保持=15s)匹配,时间到后用户自动停止执行:
import io.gatling.javaapi.core.CoreDsl.* import io.gatling.javaapi.core.OpenInjectionStep.atOnceUsers import io.gatling.javaapi.core.Simulation import io.gatling.javaapi.http.HttpDsl.http import java.time.Duration class ComputerDatabaseSimulation : Simulation() { private val warmUp = scenario("WarmUp") // 运行时长与节流总周期一致:5s+10s=15s .during(Duration.ofSeconds(15)) .on(exec(http("[WarmUp] GET /computer-database.gatling.io").get("https://computer-database.gatling.io/computers"))) private val testScn = scenario("TestScn") .forever() .on(exec(http("[TestScn] GET /computer-database.gatling.io").get("https://computer-database.gatling.io/computers"))) init { setUp( warmUp .injectOpen(atOnceUsers(5)) .throttle( reachRps(2).during(Duration.ofSeconds(5)), holdFor(Duration.ofSeconds(10)) ) .andThen( testScn .injectOpen(atOnceUsers(5)) .throttle( jumpToRps(2), holdFor(Duration.ofSeconds(10)) ) // 测试场景结束后自动终止 .forceExit(true) ) ) } }
方式2:保留循环但添加.forceExit(true)
如果需要保留循环逻辑,可以在warmUp的节流配置后添加.forceExit(true),强制节流规则结束后终止所有用户的执行:
warmUp .injectOpen(atOnceUsers(5)) .throttle( reachRps(2).during(Duration.ofSeconds(5)), holdFor(Duration.ofSeconds(10)) ) .forceExit(true) // 节流结束后强制终止用户 .andThen(...)
说明
.during(Duration):让用户在指定时长内循环执行请求,时间到达后自动停止,场景正常结束;.forceExit(true):确保节流规则执行完毕后,立即终止所有用户的执行,避免用户继续循环发送请求;- 两种方式都能让warmUp场景正常结束,触发
.andThen()后的testScn开始执行。
内容的提问来源于stack exchange,提问作者tesladev
相关产品推荐
相关产品推荐

