You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:30:58