K6实现每个VU独立使用对应Token的渐变负载测试问询
K6实现每个虚拟用户(VU)绑定专属Token的方案
问题背景
- 需求:每个虚拟用户(VU)需使用独立测试数据,具体为每个VU持有专属Token发起相同HTTP请求
- 测试数据文件
Tokens.json内容:
{ "dev": [ { "token": "test33333"}, { "token": "test2444"}, { "token": "test3333332211"}, { "token": "test4"}, { "token": "test5"}, { "token": "test6"} ] }
- 初始K6测试代码问题:所有VU固定使用第一个Token(
tokens[0].token),无法实现每个VU对应专属Token,初始代码如下:
export const options: Options = { stages: [ { duration: '10s', target: 5 }, // 10秒内将用户数从0提升至5 { duration: '1m', target: 5 }, // 保持5个用户1分钟 { duration: '1m', target: 0 }, // 1分钟内将用户数降至0 ], }; const url: string = constants.api_node_requests + "?limit=1000&offset=0"; console.log(`URL: ${url}`) export default () => { console.log(`${new Date()}: URL: ${url}`); let response = http.get(url, { headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + `${tokens[0].token}`, 'Accept': '*/*', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }, }); }
核心疑问
是否有内置场景参数可在渐变负载下实现每个VU从JSON中获取下一个可用Token发起请求?
实现方案
K6没有直接的内置参数自动分配专属Token,但可以通过VU唯一标识结合SharedArray加载测试数据的方式实现,以下是优化后的完整代码:
// 用SharedArray加载Token数据,避免每个VU重复读取文件 const data = new SharedArray('Bearer tokens', function() { const obj = JSON.parse(open('./tokens.json')) return [obj] }) // 提取dev环境下的所有Token const tokens = data[0].dev.map(item => item.token); export const options: Options = { stages: [ { duration: '1m', target: 2 }, // 1分钟内将用户数提升至2 { duration: '1m', target: Math.round(tokens.length / 4) }, // 保持Token总数25%的用户数 { duration: '1m', target: tokens.length }, // 提升至与Token总数一致的用户数 { duration: '1m', target: 0 }, // 1分钟内将用户数降至0 ], }; const url: string = constants.api_node_requests + "?limit=1000&offset=0"; export default () => { // 获取当前VU在测试中的唯一ID(从1开始递增) const vuId = exec.vu.idInTest; console.log(`VU ${vuId} 使用的Token: ${tokens[vuId - 1]}`); console.log(`${new Date()}: 请求URL: ${url}`); const response = http.get(url, { headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${tokens[vuId - 1]}`, 'Accept': '*/*', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive' }, }); }
关键实现说明
- SharedArray加载数据:
SharedArray是K6提供的共享数据结构,所有VU共享同一份数据副本,避免重复读取JSON文件,提升测试性能 - VU唯一ID关联Token:
exec.vu.idInTest返回当前VU在测试中的唯一标识(从1开始),通过vuId - 1对应Token数组的索引,确保每个VU绑定专属Token - 负载阶段适配Token数量:通过
Math.round(tokens.length / 4)和tokens.length配置目标用户数,避免VU数量超过Token总数导致索引越界
内容的提问来源于stack exchange,提问作者27P
相关产品推荐
相关产品推荐

