如何让Gatling多场景按指定比例随机执行且保持恒定速率
解决方案
要实现按指定比例随机执行场景+每秒1个请求的恒定速率,核心是通过Gatling的权重随机选择机制整合所有子场景,再用单一注入策略控制总请求速率,替代原有的多场景并行/顺序注入方案。
1. 按权重整合子场景
使用weightedRandomSwitch,按照需求的百分比设置对应权重(权重值只需比例匹配即可,比如直接用50、10、20、15、5对应50%、10%等比例),将5个子场景整合为一个主场景:
ScenarioBuilder mainScenario = scenario("RandomWeightedMainScenario") .exec(weightedRandomSwitch( 50.0 -> s1, 10.0 -> s2, 20.0 -> s3, 15.0 -> s4, 5.0 -> s5 ));
2. 设置单一注入策略控制总速率
给主场景设置每秒1个请求的恒定注入速率,持续900秒,这样总请求数刚好为900,各子场景的请求数会自动按权重比例分配:
setUp( mainScenario.injectOpen(constantUsersPerSec(1).during(900)) ).protocols(getSignInHeaders());
完整代码示例
// 定义原有5个子场景 ScenarioBuilder s1 = scenario("S1").exec(getAuthenticationChain()).exec(createProduct(150, "S1")); ScenarioBuilder s2 = scenario("S2").exec(getAuthenticationChain()).exec(createProduct(10, "S2")); ScenarioBuilder s3 = scenario("S3").exec(getAuthenticationChain()).exec(createProduct(30, "S3")); ScenarioBuilder s4 = scenario("S4").exec(getAuthenticationChain()).exec(createProduct(60, "S4")); ScenarioBuilder s5 = scenario("S5").exec(getAuthenticationChain()).exec(createProduct(80, "S5")); // 构建带权重随机选择的主场景 ScenarioBuilder mainScenario = scenario("RandomWeightedMainScenario") .exec(weightedRandomSwitch( 50.0, s1, 10.0, s2, 20.0, s3, 15.0, s4, 5.0, s5 )); // 配置压测执行 setUp( mainScenario.injectOpen(constantUsersPerSec(1).during(900)) ).protocols(getSignInHeaders());
方案说明
weightedRandomSwitch会在每次执行主场景时,按设定权重随机挑选子场景执行,既满足随机顺序要求,又能保证统计上的比例符合预期;- 单一注入策略确保总请求速率严格稳定在每秒1个,不会出现多场景并行注入导致的速率叠加问题;
- 长时间压测下,各子场景的实际请求数会非常接近你计算的数值(s1:450、s2:90、s3:180、s4:135、s5:45)。
补充提示
- 权重值无需强制总和为100,Gatling会自动按比例计算概率,比如用5、1、2、1.5、0.5也能得到相同的比例效果;
- 若需要更精确的固定请求数,可结合
repeat和randomSwitch实现,但weightedRandomSwitch在持续压测场景下的比例精度已足够满足需求。
内容的提问来源于stack exchange,提问作者user3817378
相关产品推荐
相关产品推荐

