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 在这里是为了任何面临同样情况的人。