K6 提供的參數很多,以下主要介紹幾個較常用的為主
虛擬用戶數量,最少必須要 1 個,和 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 幾次,就是盡量去執行就對了」
腳本中的函數被執行的次數。
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 ✗(如下圖)」
所以會建議若要限制腳本次數,盡量把時間拉滿,不然這樣的測試也沒有效果
可以指定在特定時間內增加或減少 用戶 數量的執行方式,也就是說可以模仿更精準的測試情境。
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 個用戶個用戶
用戶每秒可以發送最大的 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);
}
主要就是將按照【功能】進行組裝在同一個測試腳本。
可以針對測試方法做調整,通常在測試 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,
});
});
顧名思義,就是測試的情境的參數
在做效能測試前,通常都會先擬定好要測試的情境,蒐集真實數據進行評估,再進一步評估預期達到的目標再哪。
所以可以先將一些常用的測試寫好。只要引用一下,設定一下立刻可以達到我們想要測試的結果。
只要針對每個情境實作好了一些 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: 通常一套 業務邏輯
且 會被重複使用
scenarios: 純粹一個情境
、一個故事
,為了要讓單一邏輯或 group 能夠被相互組合應用,需要多種不同的參數,用戶數量(vus)、持續時間(duration)等等,以便達到該情境的預期結果。