一直對性能測試比較感興趣,因此也寫了很多的測試工具備WebApiBenchmark
和TcpBenchmark
等;但這些工具測試都是有針對性和配置的方式來進行功能有限因此很難適用更多的場景,因此單獨開發一個組件CodeBenchmark
來解決不一樣業務代碼下的性能測試;嚴格來講CodeBenchmark
並不算一個完整的測試工具,它提供一個測試管理功能和測試環境,能夠對實現某一規則業務代碼進行一個併發測試並提供一個最終的測試結果.如下主要介紹如何使用CodeBenchmark
.linux
CodeBenchmark
是基於netstandard2.0
開發,適用於支持這一版本的.net core
和.net framework
環境;運行系統則看狀況須要可部署到linux
或windows
,開發語言c#
.git
能夠經過vs
或vscode
構建一個控制檯項目而後引用組件(引用最新版本的BeetleX.CodeBenchmark
)github
Install-Package BeetleX.CodeBenchmark -Version 0.6.2
引用組件後就能夠編寫具體的測試用例,測試用例編寫必須符合組件測試要求,因此須要實現一個接口來編寫測試代碼,接口描述以下:web
public interface IExample:IDisposable { void Initialize(Benchmark benchmark); Task Execute(); }
Initialize數據庫
方法用於描述併發實例建立時初始化信息執行json
Executec#
併發實例每次執行的代碼邏輯windows
測試代碼能夠針對本身的業務狀況來編寫,具體的業務邏輯能夠是http,數據庫訪問等操做.瀏覽器
[System.ComponentModel.Category("TCP")] public class WebsocketJson : IExample { public async Task Execute() { var request = new { url = "/json" }; var result = await jsonClient.ReceiveFrom(request); } private BeetleX.Http.WebSockets.JsonClient jsonClient; public void Initialize(Benchmark benchmark) { jsonClient = new BeetleX.Http.WebSockets.JsonClient("ws://192.168.2.19:8080"); } public void Dispose() { jsonClient.Dispose(); } }
[System.ComponentModel.Category("TCP")] public class TcpTextLine : IExample { public async Task Execute() { var data = $"henryfan@{DateTime.Now}"; var stream = await mClient.ReceiveFrom(s => s.WriteLine(data)); stream.ReadLine(); } private BeetleX.Clients.AsyncTcpClient mClient; public void Initialize(Benchmark benchmark) { mClient = BeetleX.SocketFactory.CreateClient<BeetleX.Clients.AsyncTcpClient>("192.168.2.19", 9012); } public void Dispose() { mClient.Dispose(); } }
[System.ComponentModel.Category("TCP")] class HttpGet : IExample { public void Dispose() { } public async Task Execute() { var result = await _httpHandler.json(); } public void Initialize(Benchmark benchmark) { if (_httpApi == null) { _httpApi = new BeetleX.Http.Clients.HttpClusterApi(); _httpApi.DefaultNode.Add("http://192.168.2.19:8080"); _httpHandler = _httpApi.Create<IHttpHandler>(); } } static BeetleX.Http.Clients.HttpClusterApi _httpApi; static IHttpHandler _httpHandler; [BeetleX.Http.Clients.FormUrlFormater] public interface IHttpHandler { // http://host/json Task<string> json(); } }
以上基礎的測試用例均可以從https://github.com/IKende/CodeBenchmarkDoc 獲取獲得.websocket
組件在運行用例的時候並不須要配置,只須要構建測試對象並把有測試用例的程序集註冊進去便可完成.
Benchmark benchmark = new Benchmark(); benchmark.Register(typeof(Program).Assembly); benchmark.Start();
以上代碼是加載本項的程序集,並啓動一個測試管理界面.默認開啓的服務端口是9090
,能夠在Start
方法指定服務的端口.啓動日誌以下:
經過日誌能夠查看到服務啓動狀況,運行成功後就能夠經過瀏覽器訪問並進行測試
能夠根據測試狀況選擇須要的測試用例、併發數量和運行時間.
也能夠運行多個測試用例,並對比它們的性能.
若是你對組件有興趣或有意見能夠關注 https://github.com/IKende/CodeBenchmarkDoc