iT邦幫忙

2022 iThome 鐵人賽

DAY 24
0
Software Development

QA 三十天養成日記系列 第 24

[Day24][負載測試] K6 使用上常見的參數設定(options)有哪些?

  • 分享至 

  • xImage
  •  

K6 提供的參數很多,以下主要介紹幾個較常用的為主

vus

虛擬用戶數量,最少必須要 1 個,和 duration 搭配使用。

duration

指定測試運行的總持續時間,與 vus 一起使用。

sample code

import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
  vus: 1,
  duration: '1s',
};

export default function () {
  http.get('https://test.k6.io');
  sleep(1);
}

CLI

k6 run --vus 1 --duration 1s script.js

表示「模擬 10 個用戶,在 1 秒內不管 request 幾次,就是盡量去執行就對了」


iterations

腳本中的函數被執行的次數。

sample code

import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
  vus: 10,
  duration: '5s',
  iterations: 50
};

export default function () {
  http.get('https://test.k6.io');
  sleep(1);
}

CLI

k6 run --vus 10 --duration 5s  --iterations 50 script.js

表示「模擬 10 個用戶,此次腳本最多就是執行 50 次,如果 50 次腳本沒執行完,時間卻到了,那此次測試會顯示 default ✗(如下圖)」

所以會建議若要限制腳本次數,盡量把時間拉滿,不然這樣的測試也沒有效果


Stages

可以指定在特定時間內增加或減少 用戶 數量的執行方式,也就是說可以模仿更精準的測試情境。

sample code

import http from 'k6/http';
import { sleep } from 'k6';
export let options = {
    stages: [
        { duration: '30s', target: 10 },
        { duration: '1m30s', target: 30 },
        { duration: '20s', target: 0 },
    ],
};

export default function () {
  http.get('https://test.k6.io');
  sleep(1);
}****

CLI

k6 run --stage 30s:10, -s 1m30s:30, -s 20s:0 .\script.js

第一階段就是在 30 秒間逐步把用戶加到 10 個
第二階段就是在一分半內逐步從 10 個用戶追加到 30 個用戶
第三階段是在 20 秒內逐步從 30 個用戶 降到 0 個用戶個用戶


rps

用戶每秒可以發送最大的 request 數量
其實就是為了更好模擬用戶流量,再測試前須確認好測試範疇
多數平台應該都是在某些時間點流量會增大
但這個流量增大並非是無上限的增大
一定會落在某個數值

只要將數值取出來後並換算

e.g.
查看數據後,發現這個時段會有 100000 個 request 數量
那我們要測試的是 60 秒能要達到 100000
那就是 100000/60 = 1666
1666 出來後,我們都會多估 10-20% 以防萬一,所以總計大約 2000 即是 rps 的數量

若要更準確的符合真實數據,也可以以下這樣計算

用戶量 100 vus
執行時間 60s
request 條件是 100000
那就是一位 user rps 就是 100000/100/60 = 16
通常 rps 的範疇會多估 10-20% 以防萬一,所以湊個整數 20 就是較符合的數值

sample code

import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
  vus: 100,
  duration: '60s',
  rps: 20
};

export default function () {
  http.get('https://test.k6.io');
  sleep(1);
}

group

主要就是將按照【功能】進行組裝在同一個測試腳本。

可以針對測試方法做調整,通常在測試 API 時可能是一個行為,但是是會多個 API 連續調用的情況。

這時候可以使用 group 方法來實現,以下是官網的例子。

Smaple Code

import { group } from 'k6';

export default function () {
    group('user flow: returning user', function () {
        group('visit homepage', function () {
            // load homepage resources
        });
        group('login', function () {
            // perform login
        });
    });
}

如上方例子,可以將整個登入流程加入一個群組,測試結果會多一個指標 group_duration,就可方便得知這一個 group 平均執行時間。

另外,官方也寫到

Discouraged: one group per request
Wrapping each request within a group might add unnecessary boilerplate.

意味著這個 group 功能不建議僅拿來組裝單一 API,它不是一個像單回傳 api module 的般的使用。
這樣就失去 group 功能真正的涵義了。

Smaple Code

import { group, check } from 'k6';
import http from 'k6/http';

const id = 5;

// reconsider this type of code
group('get post', function () {
  http.get(`http://example.com/posts/${id}`);
});
group('list posts', function () {
  const res = http.get(`http://example.com/posts`);
  check(res, {
    'is status 200': (r) => r.status === 200,
  });
});

scenarios

顧名思義,就是測試的情境的參數

在做效能測試前,通常都會先擬定好要測試的情境,蒐集真實數據進行評估,再進一步評估預期達到的目標再哪。

所以可以先將一些常用的測試寫好。只要引用一下,設定一下立刻可以達到我們想要測試的結果。

只要針對每個情境實作好了一些 Executors,最後只要呼叫它即可。

Smaple Code

import http from 'k6/http';

export let options = {
  discardResponseBodies: true,
  scenarios: {
    contacts: {
      executor: 'constant-arrival-rate',
      rate: 200, // 200 RPS, since timeUnit is the default 1s
      duration: '1m',
      preAllocatedVUs: 50,
      maxVUs: 100,
    },
  },
};

export default function () {
  http.get('https://test.k6.io/contacts.php');
}

使用這個範例,K6會盡所能在 duration 內去達到 200 RPS。

所以只要使用這個方法,可以很快找到你 API 的極限瓶頸在哪。

group vs scenarios

group: 通常一套 業務邏輯 且 會被重複使用
scenarios: 純粹一個情境一個故事,為了要讓單一邏輯或 group 能夠被相互組合應用,需要多種不同的參數,用戶數量(vus)、持續時間(duration)等等,以便達到該情境的預期結果。

參考來源


上一篇
[Day23][負載測試] K6 基本介紹、安裝及實作,輕鬆上手!
下一篇
[Day25][負載測試] K6 常看的指標(Metrics)有哪些?
系列文
QA 三十天養成日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言