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

