前言
工欲善其事, 必先利其器! 在编写服务中首先要有一个好的测试工具, 在 dontecore 下性能测试有 https://github.com/dotnet/BenchmarkDotNet , 只需要简单的配置一下就可以对方法的性能进行详细的测试. 但有时候需要对不同并发下看其处理效率和延时统计查看, 如 HTTP 服务对应着大量的测试工具如 ab,bombardier 等等. 由于找不到类似于测试 HTTP 服务的工具来测试代码用例, 于时就有了 https://github.com/IKende/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 请求是 https://github.com/IKende/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
总结
来源: https://www.jb51.net/article/150232.htm