Gatling是否支持按指定用户比例分配执行不同测试流程
Gatling 实现固定用户占比执行不同操作组的方案
完全可以实现该测试场景。你对randomSwitch的缺陷判断准确:randomSwitch是单次动作维度的概率选择,执行到该逻辑块时才按配置概率随机挑选执行链,测试过程中同一个虚拟用户可能多次命中不同操作链,仅能保证长期运行下各操作的总触发次数趋近配置比例,无法实现固定比例用户全程执行对应专属操作组的效果。
下面是两种可落地的实现方案:
- 方案1:会话标记固定分组(灵活通用)
核心逻辑是在虚拟用户启动时生成一次分组标记存入用户会话,整个用户生命周期内都根据这个固定标记匹配对应操作分支,不会跨组跳转。
示例代码:
// 预先定义三组操作对应的执行链 val opChainGroup1 = exec(/* 20%用户执行的操作逻辑 */) val opChainGroup2 = exec(/* 10%用户执行的操作逻辑 */) val opChainGroup3 = exec(/* 70%用户执行的操作逻辑 */) val coreScenario = scenario("按用户占比分流测试") // 场景入口仅执行一次,为当前用户生成0-99的随机分组标识存入会话 .exec(session => session.set("userGroup", scala.util.Random.nextInt(100))) // 按固定分组标识分配操作链 .doSwitch("${userGroup}")( 0 until 20 -> opChainGroup1, 20 until 30 -> opChainGroup2, 30 until 100 -> opChainGroup3 )
该方案配置灵活,无需拆分多场景,用户规模较大时分组占比偏差可忽略;注意生成分组标识的逻辑必须放在所有业务操作之前,保证每个用户仅执行一次。
- 方案2:拆分场景精准注入(零随机偏差)
如果测试总用户规模、目标并发值固定,可直接拆分三个独立场景,按比例配置各场景的用户注入规则,从注入层实现严格的用户占比分配,无任何随机偏差。
示例代码:
val scenario1 = scenario("20%用户组").exec(opChainGroup1) val scenario2 = scenario("10%用户组").exec(opChainGroup2) val scenario3 = scenario("70%用户组").exec(opChainGroup3) setUp( // 以总并发1000、运行30分钟为例,按比例拆分各场景并发数 scenario1.inject(constantConcurrentUsers(200) during (30.minutes)), scenario2.inject(constantConcurrentUsers(100) during (30.minutes)), scenario3.inject(constantConcurrentUsers(700) during (30.minutes)) ).protocols(httpProtocol)
该方案占比精度100%,适合对用户分流精度要求极高的测试场景;缺点是调整占比时需要同步修改三个场景的注入参数。
内容的提问来源于stack exchange,提问作者mismas
相关产品推荐
相关产品推荐

