使用NetBenchmark壓測TCP,HTTP和Websocket服務


NetBenchmark是針對網絡服務壓測訂制的開源組件,組件提供TCP,HTTPWebsocket的壓力測試基礎功能;為了更好的符合業務需求組件不提供UI配置信息源的方式(畢竟這種方式只能作有限制測試),而是由使用者來自己制定相應的邏輯代碼來進行具體的業務測試。組件基於netstandard2.0,除了可以在.NET CORE上運行外還可以在.NET FX接下來介紹一下組的使用。

引用組件

https://www.nuget.org/packages/BeetleX.NetBenchmark/

Github: https://github.com/IKende/NetBenchmark

TCP測試

組件通過Benchmark.Tcp方法來構建一個TCP測壓實例,方法如下:

public static Runner Tcp<Packet, Token>(string host, int port, int connections,
    Func<BeetleX.Clients.AwaiterClient, Token, Task> handler)
    where Packet : BeetleX.Clients.IClientPacket, new()
    where Token : new()

方法帶兩個泛參

  • Packet

    協議分析器,實現BeetleX.Clients.IClientPacket.

  • Token

    測試關聯對象,可以根據業務制定相關對象數據狀態屬性。

參數

  • host

    主機地址

  • port

    服務端口

  • connectins

    並發測試的連接數

  • handler

    測試方法Func<BeetleX.Clients.AwaiterClient, Token, Task>,每次調用的測試邏輯。

構建TCP測試實例

    class Program
    {
        static void Main(string[] args)
        {
            var data = StringPacket.RamdomString(512);
            var runer = Benchmark.Tcp<StringPacket, Program>("192.168.2.19", 9090, 200,
                async (tcp, token) =>
                {
                    tcp.Send(data);
                    await tcp.Receive();
                }
            );
            runer.Run();
            runer.Print();
        }
    }

以上定義了一個基於StringPacket自定義協議測試,它是以4字節頭大小來描述消息長的字符協議解釋器。tcp.Send是向服務器發送一個消息,而await tcp.Receive則等待服務器響應。

測試結果

可以通過runer.Print()方法實時把結果輸出控制台,信息里包括:正確,錯誤和相關網絡並發情況,在最下面輸出不同延時響應的百分比。

HTTP測試

組件通過Benchmark.Http方法來構建一個HTTP測壓實例,方法如下:

public static Runner Http<Token>(Uri host, int connections, Func<IHttpHandler, Token, Task> handler)
    where Token : new()

方法帶一個泛參

  • Token

    測試關聯對象,可以根據業務制定相關對象數據狀態屬性。

參數

  • host

    測試的服務地址

  • connections

    並發測試的連接數

  • handler

    測試方法Func<IHttpHandler, Token, Task>,每次調用的測試邏輯。

IHttpHandler

提供了一些簡單的http調用方法

Task Get(string url, Dictionary<string, string> queryString = null);

Task Get(string url, Dictionary<string, string> queryString, Dictionary<string, string> header = null);

Task Post(string url, Dictionary<string, string> queryString, Dictionary<string, string> heaer, Dictionary<string, string> data);

Task Post(string url, Dictionary<string, string> data);

Task PostJson(string url, Dictionary<string, string> queryString, Dictionary<string, string> heaer, object data);

Task PostJson(string url,object data);

構建HTTP測試實例

    class Program
    {
        static void Main(string[] args)
        {
            var runer = Benchmark.Http<Program>(new Uri("http://192.168.2.19:5000"), 100,
                async (http, token) =>
                {
                    await http.Get("/api/values");
                    await http.PostJson("/api/values", "beetlex.io");
                });
            runer.Run();
            runer.Print();
        }
    }

測試結果

websocket測試

組件通過Benchmark.Websocketxxx方法來構建一個websocket測壓實例,方式有三種分別是DataFrame,TextJson,方法如下:

public static Runner Websocket<Token>(Uri host, int connections, Func<WSClient, Token, Task> handler)
        where Token : new()
public static Runner WebsocketText<Token>(Uri host, int connections, Func<TextClient, Token, Task> handler)
        where Token : new()
public static Runner WebsocketJson<Token>(Uri host, int connections, Func<JsonClient, Token, Task> handler)
        where Token : new()

構建Websocket測試實例

    class Program
    {
        static void Main(string[] args)
        {
            var runer = Benchmark.WebsocketJson<Program>(new Uri("ws://192.168.2.19:8080"), 100,
                async (ws, token) =>
                {
                    ws.TimeOut = 1000 * 5;
                    ws.Send(new { url = "/json" });
                    var result = await ws.Receive();
                });
            runer.Run();
            runer.Print();
        }
    }

測試結果


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM