負載壓力測試工具 - NBomber

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 請參考

https://nbomber.com/docs/general-concepts/#step

Scenario

  • Scenario 把 Step 依照順序組合起來和負載策略 (Load strategy),也就是並行執行緒 Thread 的控制,要執行多久的時間。
  • 場景是並行運行,您應該將 Scenario 視為系統執行緒,代表一個執行緒(Task<T>),NBomber 允許創建此類場景的許多副本來模擬並發執行(模擬並發虛擬用戶)。
  • 擴充行為,WithWarmUpDuration、WithoutWarmUp、WithInit、WithClean

更多的 Scenario 可以參考

https://nbomber.com/docs/general-concepts#scenario-init

 

Runner

顧名思義就是執行測試以及測試報告的呈現,支援注入 Josn Config

更多的設定,請參考

https://nbomber.com/docs/general-concepts#nbomberrunner

 

除了主要的區塊之外還有幾個選項

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,請參考

https://nbomber.com/docs/grafana-dashboard


 

整合測試專案Specflow

只要在測試專案加入 NBomber 套件,再用 dotnet test  c -Release 就可以了,這跟 Console App 有一些不同,

  1. cli 上不會呈現報表
  2. 報表路徑在 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

Image result for microsoft+mvp+logo