工欲善其事,必先利其器!在編寫服務中首先要有一個好的測試工具,在dontecore下效能測試有BenchmarkDotNet,只需要簡單的配置一下就可以對方法的效能進行詳細的測試。但有時候需要對不同併發下看其處理效率和延時統計檢視,如HTTP服務對應著大量的測試工具如ab
,bombardier
等等。由於找不到類似於測試HTTP服務的工具來測試程式碼用例,於時就有了ConcurrentTest這個元件的實現.通過ConcurrentTest元件可以執行不同的測試用例,並可以實時檢視具體的併發情況和延時分佈資料。以下介紹一下如何使用ConcurrentTest執行測試用例並統計執行結果
引用元件
Install-Package BeetleX.ConcurrentTest -Version 0.2.8
WebAPI服務
[Route("api/[controller]")] [ApiController] public class EmployeeController : ControllerBase { [HttpGet("{count}")] public JsonResult Get(int count) { return new JsonResult(Employee.GetEmployees(count)); } [HttpPost] public JsonResult Post([FromBody]Employee value) { return new JsonResult(value); } }
以上是一個簡單的dotnet core WebApi
服務,主要是提供了僱員獲取和新增功能。
測試用例
public class FastHttpClientTest { public FastHttpClientTest() { httpApiClient = new HttpApiClient(Host); clientApi = httpApiClient.CreateWebapi<IHttpClientApi>(); } private string Host = "http://localhost:8007"; private BeetleX.FastHttpApi.HttpApiClient httpApiClient; private IHttpClientApi clientApi; [CTestCase] public void AddEmployee() { clientApi.AddEmployee(Employee.GetEmployee()); } [CTestCase] public void ListEmployees() { clientApi.ListEmployees(2); } [JsonFormater] public interface IHttpClientApi { [Get(Route = "api/employee/{count}")] List<Employee> ListEmployees(int count); [Post(Route = "api/employee")] Employee AddEmployee(Employee item); } }
元件使用起來和BenchmarkDotNet差不多,通過CTestCase
來標記,具體測試方法通過介面定義。使用介面來描述WebApi請求是FastHttpApi,在這裡就不過多說明。
使用ConcurrentTest進行壓力測試
當測試用例編寫完成後,就可以使用ConcurrentTest對測試用例進行一個多執行緒併發測試;只需要簡單執行以下程式碼即可
CTester.RunTest<FastHttpClientTest>(10, 500000);
以上程式碼是對FastHttpClientTest
的所有測試方法進行一個測試,測試資料是使用10個執行緒,進行500000萬次呼叫測試。
測試報表
在執行過程中元件會實時顯示併發情況和區間響應數量,最終會針對每個測試用例形成一個簡要的測試結果;具體結果如下:
*********************************************************************** * https://github.com/IKende/ConcurrentTest.git * Copyright ? ikende.com 2018 email:henryfan@msn.com * ServerGC:True *********************************************************************** * AddEmployee test prepping completed ----------------------------------------------------------------------- * [500000/500000]|threads:[10] * Success:[ 0/s]|total:[ 500000][min:23448/s max:24561/s] * Error:[ 0/s]|total:[ 0][min:0/s max:0/s] ----------------------------------------------------------------------- * 0ms-0.1ms:[ ] 0.1ms-0.5ms:[ 435,604] * 0.5ms-1ms:[ 59,863] 1ms-5ms:[ 4,356] * 5ms-10ms:[ 142] 10ms-50ms:[ 35] * 50ms-100ms:[ ] 100ms-1000ms:[ ] * 1000ms-5000ms:[ ] 5000ms-10000ms:[ ] *********************************************************************** *********************************************************************** * ListEmployees test prepping completed ----------------------------------------------------------------------- * [500000/500000]|threads:[10] * Success:[ 0/s]|total:[ 500000][min:28105/s max:28829/s] * Error:[ 0/s]|total:[ 0][min:0/s max:0/s] ----------------------------------------------------------------------- * 0ms-0.1ms:[ ] 0.1ms-0.5ms:[ 476,342] * 0.5ms-1ms:[ 20,641] 1ms-5ms:[ 2,922] * 5ms-10ms:[ 80] 10ms-50ms:[ 15] * 50ms-100ms:[ ] 100ms-1000ms:[ ] * 1000ms-5000ms:[ ] 5000ms-10000ms:[ ] ***********************************************************************
元件還具備什麼功能
現有的ConcurrentTest的功能還相對簡陋,不過應用者還是可以根據實際的需要來制定統計標籤,延時區間等相關統計;由於元件的程式碼也非常少只有幾個類,你也根據根據自己的需要來擴充套件它或在https://github.com/IKende/ConcurrentTest提上相應issues