將 k6 從設計測試到開發再到 CI pipeline 整個完整寫一篇。
2024年9月,Grafana 決定把 k6 的icon改色,並於 v0.54.0 發佈。連 result output 也改成紅色了,還加入 Grafana 的字眼。
OTel Demo 專案中本來就有 Python Locust 框架撰寫的測試,我們能翻寫成 k6 的版本來練習。Grafana 有提供一個 OTel demo 電商的線上網站https://otel-demo.field-eng.grafana.net/
,我們能以此網站來進行 k6 的測試。
該Locust測試腳本的主要測試對象與行為︰
API端點測試 ︰
基礎服務檢測
GET / 首頁訪問
loadGeneratorFloodHomepage
值,動態調整請求次數GET /api/products/{id} 商品詳情查詢
GET /api/recommendations 商品推薦系統
GET /api/data/ 廣告推薦系統
購物車流程
GET /api/cart 查看購物車
POST /api/cart 添加商品到購物車。購物車操作包含: 隨機商品選擇(10種預設商品) 數量隨機(1-10件) 用戶ID綁定
結帳系統
POST /api/checkout 結帳操作
兩種結帳模式: 單商品結帳 多商品結帳(2-4件隨機組合)
使用預先載入的100組用戶資料
瀏覽器行為測試 ︰
UI操作驗證
切換貨幣為瑞士法郎(CHF)
點擊「Roof Binoculars」商品
執行加入購物車按鈕操作
流量識別機制
所有請求添加synthetic_request=true header
,方便識別該請求是測試產生的還是其他使用者產生的。
為此我們能根據以上的測試案例,區分成壓力測試
以及功能測試
。
k6 官方有一篇專門關於測試性能的測試入門文章,Test for performance。
主要有,使用 thresholds 確認性能標準(performance criteria)。使用 scenarios 來配置多種負載模型。最重要的是團隊已經定義出 SLO 了,例如 99% 請求應該成功,99%請求應該≦1000ms的延遲,只有定義出 SLO,多種負載模型場景才能測試出系統是否滿足這些 SLO。
因為這裡主要是測試客戶端的性能表現,能參考 R.E.D. 或是 4 Golden Signals 中的 Latency、Traffic、Errors。
這裡我們設定請求失敗率需要小於 1 %,也就是 1000 個請求最多只能有 9 個請求是失誤的。令一個則是 p95 的請求都要在 200ms 內取得回應,也包含了失敗請求的回應(Fail should fast return)。
設定 thresholds 之前我們要先知道 k6 提供了哪些內建指標。
常用內建指標
checks︰rate類型,我們設定的斷言檢查通過比例,這是最重要的資料正確性檢查。
http_req_duration︰trend類型,就所有請請的總時間,等於 http_req_sending + http_req_waiting + http_req_receiving
(即遠端伺服器處理請求並回應所需的時間,不包括初始的 DNS 查詢/連接時間)。
http_req_failed︰rate類型,http 回應 status >= 400的次數。
http_reqs︰counter類型,k6 產生了多少 http 請求。
browser_web_vital_fid,browser_web_vital_lcp︰k6 browser 產生的指標,用來測量瀏覽器多久能看到內容以及跟元件互動。
其他自己看,我幾乎沒在用,除了即時輸出至儀表板會用到,像是收到多少資料大小(data_received)、執行了幾次測試迭代(iterations)、測試持續時間(iteration_duration)、多少 VU 正在執行測試中(vus)。
也能自己定義 metrics 設定於 thresholds 中。
我們就能利用內建指標,設定這次測試對象的 thresholds 作為測試的驗收標準(Criteria)。
export const options = {
thresholds: {
checks: ['rate>0.95'], // the rate of successful checks should be higher than 95%
http_req_failed: ['rate<0.01'], // http errors should be less than 1%
http_req_duration: ['p(95)<150'], // 95% of requests should be below 150ms
},
};