最近接處比較多DevOps相關資訊,對於已經開發好的API,希望能有一個快速且輕量的測試工具,並且能夠集成至DevOps中。
這時開始尋尋覓覓,竟然發現一個好物~K6。
它真的滿足了我大部分的需求,從此可以跟JMeter說bye bye了。

K6優點

直接說一下K6的優點,當然它的優點還有更多,以下只是列出幾個我覺得最吸引我的地方。

  1. 使用Javascript來寫測試腳本
  2. 撰寫方式類似Unit test
  3. 比起其他測試工具輕量許多
  4. 可以整合許多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出自動測試腳本,這些以後有機會再跟大家介紹吧。