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

k6多场景负载测试中实现场景独立参数化数据访问的方法

解决k6多场景参数化数据混淆问题

核心问题是多场景下VU ID是全局共享的,不管哪个场景的VU,vu.idInTest都会按全局顺序递增,用它索引数据必然会跨场景干扰。下面是几个实用的解决办法:

方法一:按场景独立迭代计数索引数据

利用scenario.iterationInTest(每个场景的迭代计数独立),给登录场景分配专属的数据索引逻辑,确保每个迭代取唯一数据:

export const options = {
  scenarios: {
    anonymous_browse: {
      executor: 'constant-vus',
      vus: 5,
      duration: '10s',
    },
    logged_in_update: {
      executor: 'constant-vus',
      vus: 2,
      duration: '10s',
      // 限制迭代数不超过数据长度,避免索引越界
      maxIterations: ddd.length,
    },
  },
};

const ddd = new SharedArray(
  'ddd',
  () => JSON.parse(open('./data.json')).ddd
);

export default function () {
  let d;
  // 通过环境变量区分当前场景
  if (__ENV.SCENARIO === 'logged_in_update') {
    const idx = scenario.iterationInTest - 1;
    if (idx >= ddd.length) {
      throw new Error('登录场景迭代数超过数据总量');
    }
    d = ddd[idx];
    // 执行登录用户的数据更新操作
    console.log(`登录用户更新数据: ${JSON.stringify(d)}`);
  } else {
    // 匿名场景无需唯一数据,随机或循环取数即可
    d = ddd[Math.floor(Math.random() * ddd.length)];
    // 执行匿名浏览操作
    console.log(`匿名用户浏览数据: ${JSON.stringify(d)}`);
  }
}

方法二:给场景分配独立数据集

如果两个场景不需要共用数据,直接在JSON文件中拆分数据集,脚本里分别读取:

修改data.json:

{
  "anonymous_data": [
    {"page": "/home"},
    {"page": "/products"}
  ],
  "logged_in_data": [
    {"a": 1, "b": 2},
    {"a": 3, "b": 4}
  ]
}

脚本中读取并使用:

const testData = new SharedArray(
  'test-data',
  () => JSON.parse(open('./data.json'))
);
const anonymousData = testData.anonymous_data;
const loggedInData = testData.logged_in_data;

export default function () {
  if (__ENV.SCENARIO === 'logged_in_update') {
    const idx = scenario.iterationInTest - 1;
    if (idx >= loggedInData.length) {
      throw new Error('登录场景迭代数超过数据总量');
    }
    const d = loggedInData[idx];
    // 执行更新操作
  } else {
    const d = anonymousData[Math.floor(Math.random() * anonymousData.length)];
    // 执行浏览操作
  }
}

方法三:使用场景内VU ID(k6 0.43+版本支持)

k6 0.43及以上版本提供vu.idInScenario,这个是场景内唯一的VU ID,不会跨场景共享,直接用它索引数据即可:

const ddd = new SharedArray(
  'ddd',
  () => JSON.parse(open('./data.json')).ddd
);

export default function () {
  if (__ENV.SCENARIO === 'logged_in_update') {
    // 场景内VU ID从1开始,减1转为数组索引
    const idx = vu.idInScenario - 1;
    if (idx >= ddd.length) {
      throw new Error('登录场景VU数量超过数据总量');
    }
    const d = ddd[idx];
    // 执行更新操作
  } else {
    // 匿名场景逻辑
  }
}

注意事项

  • 若使用迭代计数索引,务必限制场景的maxIterations不超过数据长度,避免索引越界;
  • 匿名场景无需唯一数据时,优先用随机或循环取数,不要占用登录场景的专属索引;
  • __ENV.SCENARIO是k6内置的环境变量,可直接获取当前运行的场景名称,用于区分场景逻辑。

内容的提问来源于stack exchange,提问作者kaskelotti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 18:33:35