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

k6负载测试中场景间数据传递的实现方法咨询

解决k6串行场景间共享数据的问题

普通全局变量无法在k6场景间共享,因为每个VU(虚拟用户)拥有独立的内存空间,即便串行执行的场景也可能运行在不同VU实例中。以下是两种可行的解决思路:

方法一:利用globalThis复用VU内存(简单适配串行场景)

由于你设置了每个场景仅1个VU、1次迭代且串行执行,k6大概率会复用同一个VU实例处理后续场景。此时可以用globalThis(全局上下文对象)存储共享数据,它在同一个VU的生命周期内会保留数据。

示例代码:

export let options = {
  scenarios: {
    companyScenario: {
      executor: 'per-vu-iterations',
      exec: 'runCompanyScenario',
      vus: 1,
      iterations: 1,
      maxDuration: '2s',
    },
    employeeScenario: {
      executor: 'per-vu-iterations',
      exec: 'runEmployeeScenario',
      vus: 1,
      iterations: 1,
      maxDuration: '10s',
      startTime: '2s',
    }
  },
};

export function runCompanyScenario() {
  // 模拟创建公司的API请求
  const res = http.post(
    'https://your-api-domain/companies',
    JSON.stringify({ name: '测试公司' }),
    { headers: { 'Content-Type': 'application/json' } }
  );
  // 提取响应中的ID并存储到globalThis
  globalThis.companyId = res.json().id;
}

export function runEmployeeScenario() {
  // 从globalThis读取共享的companyId,构造请求负载
  const payload = {
    name: '测试员工',
    companyId: globalThis.companyId
  };
  http.post(
    'https://your-api-domain/employees',
    JSON.stringify(payload),
    { headers: { 'Content-Type': 'application/json' } }
  );
}

方法二:使用实验性Storage API(跨VU/场景通用)

如果需要确保数据在任意VU、场景间可靠共享,可以使用k6的实验性Storage API,它提供了跨实例的共享存储能力(注意该特性处于实验阶段,后续可能有API变化)。

示例代码:

import { InMemory } from 'k6/experimental/storage';

// 创建全局共享内存存储实例
const sharedStorage = new InMemory('company-shared-data');

export let options = {
  scenarios: {
    companyScenario: {
      executor: 'per-vu-iterations',
      exec: 'runCompanyScenario',
      vus: 1,
      iterations: 1,
      maxDuration: '2s',
    },
    employeeScenario: {
      executor: 'per-vu-iterations',
      exec: 'runEmployeeScenario',
      vus: 1,
      iterations: 1,
      maxDuration: '10s',
      startTime: '2s',
    }
  },
};

export function runCompanyScenario() {
  const res = http.post(
    'https://your-api-domain/companies',
    JSON.stringify({ name: '测试公司' }),
    { headers: { 'Content-Type': 'application/json' } }
  );
  const companyId = res.json().id;
  // 将ID存入共享存储
  sharedStorage.setItem('companyId', companyId);
}

export function runEmployeeScenario() {
  // 从共享存储读取companyId
  const companyId = sharedStorage.getItem('companyId');
  const payload = {
    name: '测试员工',
    companyId: companyId
  };
  http.post(
    'https://your-api-domain/employees',
    JSON.stringify(payload),
    { headers: { 'Content-Type': 'application/json' } }
  );
}

补充方案:合并场景步骤(无需跨场景共享)

如果不需要严格拆分两个场景,也可以将创建公司和创建员工的逻辑合并到同一个执行函数中,按顺序执行,这样直接在函数内部传递ID即可,无需额外的共享机制。

内容的提问来源于stack exchange,提问作者Marinho Brandão

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 07:55:06