Gatling多虚拟用户场景下如何分配每次迭代的唯一测试数据
Gatling 多虚拟用户分片分配唯一测试数据方案
实现逻辑
通过Gatling内置的全局唯一userId定位每个虚拟用户的专属数据分片,每个用户在自己的分片范围内按迭代顺序取数,即可保证所有用户各次迭代拿到的数据完全唯一,且完全匹配你要求的分配规则。
代码实现(Scala DSL示例)
前置准备
假设你的测试数据存放在test_data.csv中,示例格式如下:
testData data1 data2 data3 data4 data5 data6 data7 data8 data9
核心代码
import io.gatling.core.Predef._ import io.gatling.http.Predef._ class UniqueDataTest extends Simulation { // 加载全量测试数据,跳过表头转为序列存储 val allTestData = csv("test_data.csv").readRecords.toSeq // 配置参数,可根据实际需求修改 val totalUserCount = 3 // 虚拟用户数 val perUserIteration = 3 // 每个用户迭代次数 val perUserDataCount = perUserIteration // 每个用户分配的测试数据条数 val scn = scenario("唯一数据分配测试场景") // 初始化用户专属分片信息 .exec(session => { val currentUserId = session.userId.toInt // 计算当前用户的分片起始索引 val userDataStartIndex = currentUserId * perUserDataCount session .set("userDataStartIndex", userDataStartIndex) .set("currentIterOffset", 0) }) // 每个用户迭代对应次数,每次取自己分片内的下一条数据 .repeat(perUserIteration) { exec(session => { val startIndex = session("userDataStartIndex").as[Int] val offset = session("currentIterOffset").as[Int] // 取对应位置的测试数据,将csv列自动注入session val currentRow = allTestData(startIndex + offset) session .setAll(currentRow) .set("currentIterOffset", offset + 1) }) // 替换为你实际的业务请求逻辑 .exec(http("业务测试请求") .post("/your/api/path") .body(StringBody("""{"param": "${testData}"}""")) .asJson ) } setUp( scn.inject(atOnceUsers(totalUserCount)) ) }
分配规则验证
以你的示例参数(3用户、9条数据)为例,最终分配结果和你要求的完全一致:
- 用户ID 0 → 对应数据行1、2、3
- 用户ID 1 → 对应数据行4、5、6
- 用户ID 2 → 对应数据行7、8、9
注意事项
- 需提前保证测试数据总条数 = 虚拟用户数 × 单用户迭代次数,避免数组越界,如有特殊需求可自行添加取模、空值兜底逻辑
- 若使用Java DSL实现,逻辑完全一致,仅需替换为对应Java语法即可
- 不要使用Gatling默认的
queue/shuffle等共享feeder策略,该类策略是所有用户共享遍历数据,无法实现严格的分片隔离
内容的提问来源于stack exchange,提问作者Lusitha
相关产品推荐
相关产品推荐

