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文件,按迭代顺序取数。
操作步骤
- 准备测试数据文件
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
- 测试脚本实现:
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
相关产品推荐
相关产品推荐

