k6性能测试如何运行post请求多用户?
How to run post request for multiple user in k6 performance test?
我们 运行 获取具有多个用户 (vus) 和多个迭代 (iterations) 特定持续时间的 http 请求。
就像下面这样简单。
import http from 'k6/http';
import { sleep } from 'k6';
export let options ={
vus:'10',
duration: '20s',
iterations: '10'
}
export default function (){
const baseUri = 'http://Myhost:3200'
let response = http.get(`${baseUri}/api/v1/vm-inventory`)
let body = JSON.parse(response.body)
body.items.forEach(element => {
if (element.datastoreIds.length != 0 ){
console.log(JSON.stringify(element))
console.log(`Name of the vm is ${element.name}`)
}
});
sleep(1);
}
我还需要 运行 post 多个用户和多次迭代的请求。但是我看到的所有示例都与单个 post 请求有关。当我们 运行 多个 post 请求时,我们的数据需要在每次迭代中更改。 k6怎么可能?下面是我的 post 请求。
import http from 'k6/http';
import { sleep } from 'k6';
export let options ={
vus:'5',
duration: '120s',
iterations: '5'
}
let payload = `{
"VMId": "70c8b578-32ef-40d2-bcc5-81267423d2c4",
"name": "test_vm_1",
"mem": "4,
"cpu": "2",
"disk": "50gb"
}`
export default function () {
const url = 'http://myhost:3200/api/v1/vm-inventory'
var header = {
headers: {
'Content-Type': 'application/json',
},
};
let res = http.post(url, JSON.stringify(payload),header);
console.log(res.json().json.name);
sleep(5);
}
我需要为每次迭代更改负载中的 Vm 名称,以便请求是唯一的。
如何在k6中实现这一点?在 Jmeter 中,他们从每次迭代中使用不同数据的 csv 中读取它并实现它。但是我找不到K6的样片。
我们需要在导出默认函数中创建有效负载,以便我们可以在发送之前对其进行修改。如果 VMId 只需要是唯一的 UUID,请查看 jslib utils 库,其中包含用于生成 uuidv4 的函数:
export function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
放在一起:
import http from 'k6/http';
import { sleep } from 'k6';
export let options = {
vus: '5',
duration: '120s',
iterations: '5'
}
export default function () {
let payload = {
VMId: uuidv4(),
name: `test_vm_${Date.now()}`,
mem: 4,
cpu: 2,
disk: "50gb"
};
const url = 'http://myhost:3200/api/v1/vm-inventory'
var header = {
headers: {
'Content-Type': 'application/json',
},
};
let res = http.post(url, JSON.stringify(payload), header);
console.log(res.json().json.name);
sleep(5);
}
export function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
(请注意,我已将负载更改为 JS 对象,这样它就不会被字符串化两次)。
我们也可以像下面这样使用 payload。
let payload = {
VMId: uuidv4(),
name: `test_vm_vu_${__VU}`,
mem: 4,
cpu: 2,
disk: "50gb"
};
__VU 将提供虚拟用户号,以便我们可以创建 test_vm_vu_1,test_vm_vu_3, test_vm_vu_2 。 (会运行并列,所以不会按顺序来)
我从 K6 slack 社区组得到了这个答案。我 post 在这里是为了任何面临同样情况的人。
我们 运行 获取具有多个用户 (vus) 和多个迭代 (iterations) 特定持续时间的 http 请求。 就像下面这样简单。
import http from 'k6/http';
import { sleep } from 'k6';
export let options ={
vus:'10',
duration: '20s',
iterations: '10'
}
export default function (){
const baseUri = 'http://Myhost:3200'
let response = http.get(`${baseUri}/api/v1/vm-inventory`)
let body = JSON.parse(response.body)
body.items.forEach(element => {
if (element.datastoreIds.length != 0 ){
console.log(JSON.stringify(element))
console.log(`Name of the vm is ${element.name}`)
}
});
sleep(1);
}
我还需要 运行 post 多个用户和多次迭代的请求。但是我看到的所有示例都与单个 post 请求有关。当我们 运行 多个 post 请求时,我们的数据需要在每次迭代中更改。 k6怎么可能?下面是我的 post 请求。
import http from 'k6/http';
import { sleep } from 'k6';
export let options ={
vus:'5',
duration: '120s',
iterations: '5'
}
let payload = `{
"VMId": "70c8b578-32ef-40d2-bcc5-81267423d2c4",
"name": "test_vm_1",
"mem": "4,
"cpu": "2",
"disk": "50gb"
}`
export default function () {
const url = 'http://myhost:3200/api/v1/vm-inventory'
var header = {
headers: {
'Content-Type': 'application/json',
},
};
let res = http.post(url, JSON.stringify(payload),header);
console.log(res.json().json.name);
sleep(5);
}
我需要为每次迭代更改负载中的 Vm 名称,以便请求是唯一的。 如何在k6中实现这一点?在 Jmeter 中,他们从每次迭代中使用不同数据的 csv 中读取它并实现它。但是我找不到K6的样片。
我们需要在导出默认函数中创建有效负载,以便我们可以在发送之前对其进行修改。如果 VMId 只需要是唯一的 UUID,请查看 jslib utils 库,其中包含用于生成 uuidv4 的函数:
export function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
放在一起:
import http from 'k6/http';
import { sleep } from 'k6';
export let options = {
vus: '5',
duration: '120s',
iterations: '5'
}
export default function () {
let payload = {
VMId: uuidv4(),
name: `test_vm_${Date.now()}`,
mem: 4,
cpu: 2,
disk: "50gb"
};
const url = 'http://myhost:3200/api/v1/vm-inventory'
var header = {
headers: {
'Content-Type': 'application/json',
},
};
let res = http.post(url, JSON.stringify(payload), header);
console.log(res.json().json.name);
sleep(5);
}
export function uuidv4() {
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
let r = Math.random() * 16 | 0, v = c === 'x' ? r : (r & 0x3 | 0x8);
return v.toString(16);
});
}
(请注意,我已将负载更改为 JS 对象,这样它就不会被字符串化两次)。
我们也可以像下面这样使用 payload。
let payload = {
VMId: uuidv4(),
name: `test_vm_vu_${__VU}`,
mem: 4,
cpu: 2,
disk: "50gb"
};
__VU 将提供虚拟用户号,以便我们可以创建 test_vm_vu_1,test_vm_vu_3, test_vm_vu_2 。 (会运行并列,所以不会按顺序来)
我从 K6 slack 社区组得到了这个答案。我 post 在这里是为了任何面临同样情况的人。