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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 13:35:33