1. 程式人生 > >使用CodeBenchmark對邏輯程式碼進行併發測試

使用CodeBenchmark對邏輯程式碼進行併發測試

一直對效能測試比較感興趣,所以也寫了不少的測試工具有WebApiBenchmarkTcpBenchmark等;但這些工具測試都是有針對性和配置的方式來進行功能有限所以很難適用更多的場景,所以單獨開發一個元件CodeBenchmark來解決不同業務程式碼下的效能測試;嚴格來說CodeBenchmark並不算一個完整的測試工具,它提供一個測試管理功能和測試環境,可以對實現某一規則業務程式碼進行一個併發測試並提供一個最終的測試結果.以下主要介紹如何使用CodeBenchmark.

環境要求

CodeBenchmark是基於netstandard2.0開發,適用於支援這一版本的.net core.net framework

環境;執行系統則看情況需要可部署到linuxwindows,開發語言c#.

構建測試專案

可以通過vsvscode構建一個控制檯專案然後引用元件(引用最新版本的BeetleX.CodeBenchmark)

Install-Package BeetleX.CodeBenchmark -Version 0.6.2

引用元件後就可以編寫具體的測試用例,測試用例編寫必須符合元件測試要求,所以需要實現一個介面來編寫測試程式碼,介面描述如下:

    public interface IExample:IDisposable
    {
        void Initialize(Benchmark benchmark);
        Task Execute();
    }

Initialize

方法用於描述併發例項建立時初始化資訊執行

Execute

併發例項每次執行的程式碼邏輯

測試程式碼可以針對自己的業務情況來編寫,具體的業務邏輯可以是http,資料庫訪問等操作.

websocket測試用例

[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();
    }
}

TCP測試用例

[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();
    }
}

Http測試用例

[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 獲取得到.

執行測試用例

元件在執行用例的時候並不需要配置,只需要構建測試物件並把有測試用例的程式集註冊進去即可完成.

     Benchmark benchmark = new Benchmark();
     benchmark.Register(typeof(Program).Assembly);
     benchmark.Start();

以上程式碼是載入本項的程式集,並啟動一個測試管理介面.預設開啟的服務埠是9090,可以在Start方法指定服務的埠.啟動日誌如下:

通過日誌可以檢視到服務啟動情況,執行成功後就可以通過瀏覽器訪問並進行測試

可以根據測試情況選擇需要的測試用例、併發數量和執行時間.

也可以執行多個測試用例,並對比它們的效能. 

 

如果你對元件有興趣或有意見可以關注 https://github.com/IKende/CodeBenchmar