最近接處比較多DevOps相關資訊,對於已經開發好的API,希望能有一個快速且輕量的測試工具,並且能夠集成至DevOps中。
這時開始尋尋覓覓,竟然發現一個好物~K6。
它真的滿足了我大部分的需求,從此可以跟JMeter說bye bye了。
K6優點
直接說一下K6的優點,當然它的優點還有更多,以下只是列出幾個我覺得最吸引我的地方。
- 使用Javascript來寫測試腳本
- 撰寫方式類似Unit test
- 比起其他測試工具輕量許多
- 可以整合許多DevOps pipeline工具
當然也是有一些缺點的,例如:不支援GUI控制,沒有圖形監控(可以結合 InfluxDB + Grafana 來實現),沒有錄製功能。但是這些功能對我來說都不是太重要。
安裝
安裝相當簡單,這裡給出它的Github網站即可,裡面有安裝教學
如何使用
事實上,官網的教學已經非常清楚了,這邊只教大家如何快速測試你的API。
STEP 1
寫一個K6的js file,如何撰寫這裡就不敘述了,官網已經寫得非常清楚,但我覺得值得提一下life cycle:
// 1. init code
export function setup() {
// 2. setup code
}
export default function (data) {
// 3. VU code
}
export function teardown(data) {
// 4. teardown code
}
需要注意的是,只有default方法會被loop調用執行,其他每次run都只會執行一次。
STEP 2
可以針對測試方法做調整,通常在測試API時可能是一個行為,但是是多個API連續調用。這時候可以使用Group方法來實現,以下是官網的例子。
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,就可方便得知這一群組的平均時間。
STEP 3
接下來這步驟,也是我覺得最好用且最重要的一步,就是使用K6的Scenarios功能,它已將一些常用的測試歷程寫好。只要引用一下,設定一下立刻可以達到我們想要測試的結果。針對每個情境K6已經實作好了一些Executors,只要呼叫它即可。這邊介紹一個Executor:constant-arrival-rate,這個Executor可以快速得到一個API或是一個Group的QPS界線。
範例如下:
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 time內去達到200 QPS,在此K6稱它為RPS。
所以只要使用這個方法,可以很快的得到你API的極限在哪裏喔。
如何閱讀結果
當跑完K6會得到一個metric,如下圖:
裡面個別參數的意義,都已經在官網上說明。
我這邊只提兩個參數,也是我認為一定要看的參數。
- http_req_duration
- iterations
http_req_duration => 平均每個 http reqests 所花費的時間。
iterations => 完成了幾次reqests,以及每秒完成幾次。
對於一個API的好壞,工程師比較關心Response Time,其實就是http_req_duration這個參數所顯示的。另外,對於SRE工程師,最關心的就是QPS,就是iterations後面第二個數值:每秒能完成幾次。希望每位工程師看到測試後的數值是笑臉,而不是(ಥ﹏ಥ)
其他使用方法
K6還有許多使用技巧,例如:Checks、Threshlods、Tags、Stages、Executors…或是整合IDE、Grafana、CI pipeline,也可以快速gen出自動測試腳本,這些以後有機會再跟大家介紹吧。