NBomber 是一個將自身定位為獨立於協議的輕量型的壓力測試套件,使用 F# 中開發的,測試可以用 F# 和 C# 編寫。它是真的開 C# 專案編寫負載測試,JMeter 和 K6 都是編譯好的二進位檔,寫測試時,需要使用他們規定的腳本語言;如果你是 C# 開發者,NBomber 就能夠很輕鬆的客製化你想要的功能
開發環境
- Windows 11
- Rider 2022.2.3
- .NET 6
快速建立一個壓力測試
新增 console 應用程式
dotnet new console -n Lab.NBomberTest.App -lang "C#" --framework net6.0
安裝套件
cd Lab.NBomberTest.App
dotnet add package NBomber
dotnet add package NBomber.Http
在 Program.cs 添加以下代碼
using NBomber.Contracts;
using NBomber.CSharp;
using NBomber.Plugins.Http.CSharp;
var httpFactory = HttpClientFactory.Create();
var step = Step.Create("fetch_html_page",
clientFactory: httpFactory,
execute: async context =>
{
var response = await context.Client.GetAsync("https://test.k6.io/", context.CancellationToken);
return response.IsSuccessStatusCode
? Response.Ok(statusCode: (int)response.StatusCode)
: Response.Fail(statusCode: (int)response.StatusCode);
});
var scenario = ScenarioBuilder
.CreateScenario("simple_http", step)
.WithWarmUpDuration(TimeSpan.FromSeconds(5))
.WithLoadSimulations(new[]
{
Simulation.InjectPerSec(rate: 100, during: TimeSpan.FromSeconds(30))
});
NBomberRunner.RegisterScenarios(scenario).Run();
最後執行專案
dotnet run -c Release
運行結果
最後在 .\Lab.NBomberTest.App\reports\2022-10-20_15.07.49_session_af5674cf
文件夾下有有 4 種格式(txt、csv、html、md)的報告,Html 頁面如下:
這樣很快地就完成了一個壓力測試
如何在 NBomber 編寫壓力測試
每一個測試都會有三個主要的區塊
Step
Step 用來定義想要執行的動作,還有定義這個動作成功或失敗。例如,HTTP 請求,跟上面的例子一樣
除此之外,還可以建立 Pause、Timeout
Pause 範例如下:
var pause = Step.CreatePause(TimeSpan.FromMinutes(1));
Timeout 範例如下:
var login = Step.Create("login",
timeout: TimeSpan.FromMilliseconds(200),
execute: async context =>
{
return Response.Ok();
});
更多的 Step 請參考
Scenario
- Scenario 把 Step 依照順序組合起來和負載策略 (Load strategy),也就是並行執行緒 Thread 的控制,要執行多久的時間。
- 場景是並行運行,您應該將 Scenario 視為系統執行緒,代表一個執行緒(Task<T>),NBomber 允許創建此類場景的許多副本來模擬並發執行(模擬並發虛擬用戶)。
- 擴充行為,WithWarmUpDuration、WithoutWarmUp、WithInit、WithClean
更多的 Scenario 可以參考
Runner
顧名思義就是執行測試以及測試報告的呈現,支援注入 Josn Config
更多的設定,請參考
除了主要的區塊之外還有幾個選項
DataFeed
注入資料到測試步驟,如果只是想要單純的讓資料看起來像是那麼一回事,就可以直接透過他來幫你產生資料
更多的資參考官方資料
General concepts | NBomber
ClientFactory
建立測試用的 Client,基本上,可以將 ClientFactory 用於需要 API 客戶端的 Client:WebSocketClient、RedisClient、SqlClient、HttpClient 等。以下的例子是建立 HttpClient
var httpFactory = ClientFactory.Create(
name: "http_factory",
clientCount: 1,
initClient: (number,context) => Task.FromResult(new HttpClient())
);
Scenario Load strategy
從官方的範例程式註解得知
RampConstant
是執行緒數在設定時間內線性增加。也就是說,如果將執行緒數設置為 10,時間設置為 10 秒,則每秒會創建一個新執行緒。
KeepConstant
將工作一段時間的執行緒。也就是說,如果將執行緒數設置為 10,時間設置為 10 秒,那麼將一次創建 10 個執行緒,它們將運行 10
RampPerSec
是每秒執行緒數與設定執行緒數的線性相加。例如,如果您將執行緒數設置為 10,時間設置為 60 秒,那麼前 6 秒將每秒啟動一個新執行緒,從第 7 秒開始,每秒將啟動 2 個執行緒,從第 13 秒開始– 每秒 3 個執行緒。
InjectPerSec
表示設定的執行緒數將在設定的時間內每秒運行一次。
InjectPerSecRandom
與 InjectPerSec 相同,但新執行緒的數量將隨機選擇
參考
https://nbomber.com/docs/general-concepts#load-simulations-intro
Report
除了上面提到的靜態檔案報告,NBomber 還提供了可以導入 Grafana 的性能儀表板,可以在這裡即時的觀察到壓測相關資訊。
更多的 Report,請參考
整合測試專案Specflow
只要在測試專案加入 NBomber 套件,再用 dotnet test c -Release 就可以了,這跟 Console App 有一些不同,
- cli 上不會呈現報表
- 報表路徑在 Lab.NBomberTest\bin\Debug\net6.0\reports 底下
Feature: test
Scenario: 壓力測試
Given 準備以下 Header 參數
| Key | Value |
| x-api-key | 123456 |
Given 準備 HttpRequest 'GET', "http://test.k6.io"
Then 執行測試
壓測主要是在找出系統的瓶頸,讓我們能知道接下來要如何應對,通常會觀察報告得知,使用測試或 Cucumber/Gerkin 描述案例意義不大
範例位置
sample.dotblog/Test/nbomber/Lab.NBomberTest at master · yaochangyu/sample.dotblog (github.com)
更多專案範例
PragmaticFlow/NBomber.Enterprise.Examples (github.com)
NBomber/examples/CSharpProd at dev · PragmaticFlow/NBomber (github.com)
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET