使用NetBenchmark壓測TCP,HTTP和Websocket服務
NetBenchmark
是針對網路服務壓測訂製的開源元件,元件提供TCP
,HTTP
和Websocket
的壓力測試基礎功能;為了更好的符合業務需求元件不提供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
,Text
和Json
,方法如下:
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(); } }