K6 網站壓力效能測試工具

過去做系統壓力測試都是使用Apache JMeter
雖然他的UI有點醜,不過蠻方便使用
但如果測試腳本要上Git會不好閱讀

誤打誤撞看到有一篇文章
https://clouding.city/tool/k6/

才認識 K6 這套工具 Load testing
K6可以在本地端跑測試也可以跑雲端
腳本使用 JavaScript 進行撰寫
上版控可讀性也高,而且安裝方式簡單
https://k6.io/docs

前置作業

使用Windows的朋友需要先安裝 Chocolatey,開啟 PowerShell(超級管理員) > 執行指令

Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

安裝K6

開啟 CMD 執行指令

choco install k6

測試指令

VU (virtual user)為 10,代表這次測試模擬10個 user 在執行這個動作,並反覆執行持續30秒
該參數也可以定義在”Script.js”中

k6 run --vus 10 --duration 30s script.js

執行測試輸出結果為 “test.json”

k6 run script.js --out json=test.json

測試結果

execution: local 執行的模式(local or cloud)
script: script.js 執行的腳本
output: json (test.json) 輸出的結果

scenarios: (100.00%) 1 scenario, 20 max VUs, 2m50s max duration (incl. graceful stop):
* default: Up to 20 looping VUs for 2m20s over 3 stages (gracefulRampDown: 30s, gracefulStop: 30s)
測試情境: 1個場景, 最多20個用戶, 執行最大持續時間 2分50秒, 總共3個階段

測試種類

  • 冒煙測試 Smoke Testing: 用最低系統配置(硬體、網路等等…)進行測試,目的為看是否有 Error
  • 負載測試 Load Testing / 效能測試 Performance testing: 用當前系統配置,目的為預想用戶數量與吞吐量(RPS)狀況下服務效能狀況
  • 壓力測試 Stress Testing: 用當前系統配置,目的測試系統的極限在哪, 流量慢慢的湧入 (請勿在production測試)
  • 峰值測試 Spike Testing: 用當前系統配置,目的測試系統抵擋高併發極限, 流量一瞬間湧入 (請勿在production測試)
  • 浸泡測試 Soak Testing: 主要測試在長時間下,系統的可靠性和效能

報告顯示方式

一開始使用都會想當免費仔,就看到這個組合方案 “InfluxDB + Grafana
而且還是可以直接使用Docker啟動服務

如何啟動?

  • 把整包抓下來 “https://github.com/grafana/k6”
  • 啟動 Docker 服務
    docker-compose up -d influxdb grafana
  • 用瀏覽器 “http://127.0.0.1:3000” 開啟
  • 配置資料庫
    • grafana > Configuration > Add data source > 設定資料來源
      Naem: myk6db
      Http URL: http://xxx.xxx.xxx.xxx:8086 (不要用 127.0.0.1 或 localhost)
      Database: myk6db
      保存與測試,測試通過即可使用
  • 執行測試後結果輸出至 “influxdb”
    k6 run --out influxdb=http://192.168.105.136:8086/myk6db script.js

官方測試腳本範例

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

export let options = {
  stages: [
    { duration: '1s', target: 20 },
    { duration: '1s', target: 10 },
    { duration: '1s', target: 0 },
  ],
};

export default function () {
  for (var id = 1; id <= 20; id++) {
    let res = http.get(`https://test.k6.io/pi.php?decimals=${id}`);
    check(res, { 'status was 200': (r) => r.status == 200 });
  }
}

/**
    情境:
        user 在 30 秒內增加到 20 人
        1 分 30 秒內降至 10 人
        最後 20 秒逐漸退去到 0 人
 */

 

官網有各種測試腳本範例,目前想到的好像都可以做到,未來有機會再來分享

留言

Top