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
相关产品推荐
相关产品推荐

