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

k6性能测试中如何实现多用户POST请求并迭代修改参数

k6 实现每次迭代唯一POST请求参数的方案

方案一:动态生成唯一VM名称(无需额外配置文件)

直接利用k6内置的__VU(虚拟用户编号)和__ITER(当前用户的迭代次数)变量拼接唯一名称,实现最简单,适合不需要固定测试数据的场景。

修正后的完整代码

import http from 'k6/http';
import { sleep } from 'k6';

export let options ={
    vus: 5,
    duration: '120s',
    iterations: 5
}

export default function () {
    const url = 'http://myhost:3200/api/v1/vm-inventory'
    // 每次迭代生成新的payload,避免复用同一份数据
    let payload = {
        "VMId": "70c8b578-32ef-40d2-bcc5-81267423d2c4",
        "name": `test_vm_${__VU}_${__ITER}`, // 拼接VU编号和迭代次数,保证全局唯一
        "mem": "4", // 修正原代码中引号未闭合的问题
        "cpu": "2",
        "disk": "50gb"
    }
       
    const header = {
        headers: {
          'Content-Type': 'application/json',
        },
    };
    // 注意:payload是JS对象,直接JSON序列化即可,原代码中payload是字符串再序列化会导致格式错误
    let res = http.post(url, JSON.stringify(payload), header);
    console.log(res.json().name); 
    sleep(5);
}

方案二:读取CSV文件参数化(类JMeter CSV读取逻辑)

如果需要使用固定的预设测试数据,可以通过k6内置的papaparse库读取CSV文件,按迭代顺序取数。

操作步骤

  1. 准备测试数据文件vm_data.csv,放在测试脚本同级目录,格式示例:
VMId,name,mem,cpu,disk
70c8b578-32ef-40d2-bcc5-81267423d2c4,test_vm_001,4,2,50gb
70c8b578-32ef-40d2-bcc5-81267423d2c4,test_vm_002,8,4,100gb
70c8b578-32ef-40d2-bcc5-81267423d2c4,test_vm_003,16,8,200gb
  1. 测试脚本实现:
import http from 'k6/http';
import { sleep } from 'k6';
import papaparse from 'https://jslib.k6.io/papaparse/5.1.1/index.js';
import { SharedArray } from 'k6/data';

export let options ={
    vus: 5,
    duration: '120s',
    iterations: 5
}

// 全局共享CSV数据,所有VU共用同一份数据,避免重复加载
const testData = new SharedArray('vm test data', function () {
  return papaparse.parse(open('./vm_data.csv'), { header: true }).data;
});

export default function () {
    const url = 'http://myhost:3200/api/v1/vm-inventory'
    // 按迭代顺序取数,数据用完后循环取
    const currentData = testData[__ITER % testData.length];
    let payload = {
        "VMId": currentData.VMId,
        "name": currentData.name,
        "mem": currentData.mem,
        "cpu": currentData.cpu,
        "disk": currentData.disk
    }
       
    const header = {
        headers: {
          'Content-Type': 'application/json',
        },
    };

    let res = http.post(url, JSON.stringify(payload), header);
    console.log(res.json().name); 
    sleep(5);
}

注意事项

  • 不要把payload定义在全局作用域,全局作用域的代码只会在VU初始化时执行一次,会导致所有迭代复用同一份payload
  • 原代码中payload是JSON字符串,再次调用JSON.stringify()会导致请求体格式异常,需要直接定义JS对象再序列化
  • 读取大体积CSV时使用SharedArray可以减少内存占用,避免多个VU重复加载同一份数据

内容的提问来源于stack exchange,提问作者Samselvaprabu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:06:01