Load test with K6

Jeff Yen
10 min readSep 27, 2024

--

123

Load test types

當系統承受負載時,許多問題可能會出現。系統必須同時執行多項操作,並回應來自不同數量用戶的各種請求。為了應對這些效能風險,團隊會使用負載測試。

但是,一個優秀的負載測試策略不僅僅是執行單一腳本那麼簡單。不同的流量模式會為應用程式創造不同的風險情況。為了全面準備,團隊必須針對不同的測試類型來測試系統。

Different tests for different goals

smoke tests開始,然後逐步增加負載和持續時間。

主要的測試類型如下。每種類型都有其own文章詳細說明其基本概念。

  • Smoke tests驗證您的腳本是否正常運作,以及系統在最小負載下是否表現適當。
  • Average-load test評估您的系統在預期正常條件下的表現。
  • Stress tests評估當負載超過預期平均值時,系統在極限狀態下的表現。
  • Soak tests評估您的系統在長時間運行下的可靠性和性能。
  • Spike tests驗證您的系統在突然、短暫且大規模活動增加的情況下的行為和生存能力。
  • Breakpoint tests逐步增加負載以識別系統的容量極限。

在 k6 腳本中,使用 optionsscenarios 來配置負載設置。這樣做可以將工作負載配置與迭代邏輯分開。

使用 options 的例子:

export const options = {
vus: 10,
duration: '30s',
};

export default function () {
// 您的測試邏輯放在這裡
}

使用 scenarios 的例子:

export const options = {
scenarios: {
example_scenario: {
executor: 'ramping-vus',
startVUs: 0,
stages: [
{ duration: '20s', target: 10 },
{ duration: '30s', target: 20 },
{ duration: '20s', target: 0 },
],
},
},
};

export default function () {
// 您的測試邏輯放在這裡
}

通過使用這種方法,您可以輕鬆地調整負載參數,而不需要修改測試的核心邏輯。

Test-type cheat sheet

Smoke testing

Smoke tests(冒煙測試)使用最小負載進行。執行這類測試是為了驗證系統在最小負載下運作良好,並收集基準性能值。

這種測試類型包含使用少量虛擬用戶(VU)運行測試 — 超過 5 個 VU 可能就被視為小型負載測試了。

同樣地,測試應該在短時間內執行,可以是較低的迭代次數,或者持續時間從幾秒到最多幾分鐘不等。

Smoke testing in k6

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

export const options = {
vus: 3, // Key for Smoke test. Keep it at 2, 3, max 5 VUs
duration: '1m', // This can be shorter or just a few iterations
};

export default () => {
const urlRes = http.get('https://test-api.k6.io');
sleep(1);
// MORE STEPS
// Here you can have more steps or complex script
// Step1
// Step2
// etc.
};

以下腳本是一個煙霧測試的範例。您可以複製它,更改端點,然後開始測試。如需更全面的測試邏輯,請參考 Examples(範例)部分。煙霧測試的 VU(虛擬用戶)圖表應該類似於這樣。

Average-load testing

平均負載測試模擬反映生產環境中平均行為的並發用戶數和每秒請求數。這種類型的測試通常會逐步增加吞吐量或虛擬用戶(VU)數量,並在一段時間內保持該平均負載。根據系統的特性,測試可能會突然停止或有一個短暫的負載下降期。

Average-load testing in k6

如果這是您第一次運行負載測試,我們建議從小規模開始或配置緩慢的加載過程。您的應用程序和基礎設施可能沒有您想像的那麼穩固。我們曾有數千名用戶運行負載測試,結果迅速使他們的應用程序(或測試環境)崩潰。

平均負載測試的目標是模擬生產環境中典型日子的平均活動量。測試模式遵循以下順序:

  1. 增加腳本的活動量,直到達到預期的用戶數和吞吐量。
  2. 維持該負載一段時間。
  3. 根據測試情況,停止測試或讓負載逐漸下降。

options 對象中配置負載:

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

export const options = {
// Key configurations for avg load test in this section
stages: [
{ duration: '5m', target: 100 }, // traffic ramp-up from 1 to 100 users over 5 minutes.
{ duration: '30m', target: 100 }, // stay at 100 users for 30 minutes
{ duration: '5m', target: 0 }, // ramp-down to 0 users
],
};

export default () => {
const urlRes = http.get('https://test-api.k6.io');
sleep(1);
// MORE STEPS
// Here you can have more steps or complex script
// Step1
// Step2
// etc.
};

這個腳本邏輯只有一個請求(打開一個網頁)。您的測試行為可能會有更多步驟。如果您想查看使用分組(groups)、檢查(checks)、閾值(thresholds)和輔助函數的更複雜測試,請參考 Examples

平均負載測試的虛擬用戶(VU)或吞吐量圖表看起來類似於這樣:

平均負載測試的初步結果在加載期間就會出現,目的是了解隨著負載增加,響應時間是否會惡化。有些系統甚至可能在加載期間就失敗。

測試驗證系統的性能和資源消耗在全負載期間是否保持穩定,因為有些系統可能在這個階段表現不穩定。

一旦您確認系統在典型負載下表現良好並能夠承受,您可能需要進一步推進測試,以確定系統在高於平均水平的條件下如何表現。這些高於平均水平的條件中的一些被稱為壓力測試(Stress tests)。

Stress testing

壓力測試評估系統在負載高於平常時的表現。

壓力測試的負載模式類似於平均負載測試。主要區別在於更高的負載。為了適應更高的負載,加載期會按比例延長。同樣地,在測試達到預期負載後,它可能會比平均負載測試持續稍長時間。

何時進行壓力測試

壓力測試用於驗證系統在重度使用條件下的穩定性和可靠性。系統可能在特殊時刻接收到高於平常的工作負載,例如處理截止日期、發薪日、高峰時段、工作週結束,以及許多其他可能導致頻繁高於平均流量的行為。

當您運行壓力測試時,請考慮以下幾點:

  • 負載應該高於系統平均經歷的水平。 有些測試人員可能為壓力測試設定默認目標 — 比如將平均負載提高50%或100% — 但並沒有固定的百分比。 壓力測試中模擬的負載取決於系統可能面臨的壓力情況。有時這可能只比平均水平高幾個百分點。其他時候,如前所述,可能會高50%到100%。某些壓力情況可能是平均負載的兩倍、三倍,甚至更高數量級。 根據系統可能接收到的風險負載模式來定義負載。
  • 只有在運行過平均負載測試後才進行壓力測試。 在嘗試更具挑戰性的測試之前,先識別平均負載測試下的性能問題。這個順序很重要。
  • 重複使用平均負載測試腳本。 修改參數以獲得更高的負載或虛擬用戶數(VUs)。
  • 預期性能會比平均負載時差。 這個測試確定額外負載會使性能下降多少,以及系統是否能夠承受。一個性能良好的系統應該能在長時間處理恆定工作負載時保持一致的響應時間。

Stress testing in k6

壓力測試中的負載類似於平均負載測試中的負載。區別在於它達到了更高的負載水平。

  1. 在較慢的加載期內進一步增加腳本的活動,直到達到高於平均的用戶數或吞吐量。
  2. 維持該負載一段時間。
  3. 根據測試情況,停止測試或逐漸降低負載。
import http from 'k6/http';
import { sleep } from 'k6';

export const options = {
// Key configurations for Stress in this section
stages: [
{ duration: '10m', target: 200 }, // traffic ramp-up from 1 to a higher 200 users over 10 minutes.
{ duration: '30m', target: 200 }, // stay at higher 200 users for 30 minutes
{ duration: '5m', target: 0 }, // ramp-down to 0 users
],
};

export default () => {
const urlRes = http.get('https://test-api.k6.io');
sleep(1);
// MORE STEPS
// Here you can have more steps or complex script
// Step1
// Step2
// etc.
};

請注意,與平均負載測試類似,壓力測試也是從 0 開始,然後增加到超過平均負載測試中測試的點。加載期和降載期更長,以允許更真實的響應。

只有在完成冒煙測試和平均負載測試後才運行壓力測試。過早運行這種測試類型可能會浪費資源,並且如果問題出現在低負載或平均使用率以下的負載時,可能會難以準確定位問題。

Ref: https://grafana.com/docs/k6/latest/testing-guides/test-types/

--

--

Jeff Yen
Jeff Yen

No responses yet