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

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

環境要求

CodeBenchmark是基於netstandard2.0開發,適用於支持這一版本的.net core.net framework環境;運行系統則看狀況須要可部署到linuxwindows,開發語言c#.git

構建測試項目

能夠經過vsvscode構建一個控制檯項目而後引用組件(引用最新版本的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,數據庫訪問等操做.瀏覽器

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

運行測試用例

組件在運行用例的時候並不須要配置,只須要構建測試對象並把有測試用例的程序集註冊進去便可完成.

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

以上代碼是加載本項的程序集,並啓動一個測試管理界面.默認開啓的服務端口是9090,能夠在Start方法指定服務的端口.啓動日誌以下:

經過日誌能夠查看到服務啓動狀況,運行成功後就能夠經過瀏覽器訪問並進行測試

能夠根據測試狀況選擇須要的測試用例、併發數量和運行時間.

也能夠運行多個測試用例,並對比它們的性能. 

若是你對組件有興趣或有意見能夠關注 https://github.com/IKende/CodeBenchmarkDoc

相關文章
相關標籤/搜索