工欲善其事,必先利其器!在编写服务中首先要有一个好的测试工具,在dontecore下性能测试有BenchmarkDotNet,只需要简单的配置一下就可以对方法的性能进行详细的测试。但有时候需要对不同并发下看其处理效率和延时统计查看,如HTTP服务对应着大量的测试工具如ab,bombardier等等。由于找不到类似于测试HTTP服务的工具来测试代码用例,于时就有了ConcurrentTest这个组件的实现.通过ConcurrentTest组件可以运行不同的测试用例,并可以实时查看具体的并发情况和延时分布数据。以下介绍一下如何使用ConcurrentTest运行测试用例并统计运行结果

  1. Install-Package BeetleX.ConcurrentTest -Version 0.2.8
  1. [Route("api/[controller]")]
  2. [ApiController]
  3. public class EmployeeController : ControllerBase
  4. {
  5. [HttpGet("{count}")]
  6. public JsonResult Get(int count)
  7. {
  8. return new JsonResult(Employee.GetEmployees(count));
  9. }
  10. [HttpPost]
  11. public JsonResult Post([FromBody]Employee value)
  12. {
  13. return new JsonResult(value);
  14. }
  15. }

以上是一个简单的dotnet core WebApi服务,主要是提供了雇员获取和添加功能。

  1. public class FastHttpClientTest
  2. {
  3. public FastHttpClientTest()
  4. {
  5. httpApiClient = new HttpApiClient(Host);
  6. clientApi = httpApiClient.CreateWebapi<IHttpClientApi>();
  7. }
  8. private string Host = "http://localhost:8007";
  9. private BeetleX.FastHttpApi.HttpApiClient httpApiClient;
  10. private IHttpClientApi clientApi;
  11. [CTestCase]
  12. public void AddEmployee()
  13. {
  14. clientApi.AddEmployee(Employee.GetEmployee());
  15. }
  16. [CTestCase]
  17. public void ListEmployees()
  18. {
  19. clientApi.ListEmployees(2);
  20. }
  21. [JsonFormater]
  22. public interface IHttpClientApi
  23. {
  24. [Get(Route = "api/employee/{count}")]
  25. List<Employee> ListEmployees(int count);
  26. [Post(Route = "api/employee")]
  27. Employee AddEmployee(Employee item);
  28. }
  29. }

组件使用起来和BenchmarkDotNet差不多,通过CTestCase来标记,具体测试方法通过接口定义。使用接口来描述WebApi请求是FastHttpApi,在这里就不过多说明。

当测试用例编写完成后,就可以使用ConcurrentTest对测试用例进行一个多线程并发测试;只需要简单运行以下代码即可

  1. CTester.RunTest<FastHttpClientTest>(10, 500000);

以上代码是对FastHttpClientTest的所有测试方法进行一个测试,测试数据是使用10个线程,进行500000万次调用测试。

在运行过程中组件会实时显示并发情况和区间响应数量,最终会针对每个测试用例形成一个简要的测试结果;具体结果如下:

  1. ***********************************************************************
  2. * https://github.com/IKende/ConcurrentTest.git
  3. * Copyright ? ikende.com 2018 email:henryfan@msn.com
  4. * ServerGC:True
  5. ***********************************************************************
  6. * AddEmployee test prepping completed
  7. -----------------------------------------------------------------------
  8. * [500000/500000]|threads:[10]
  9. * Success:[ 0/s]|total:[ 500000][min:23448/s max:24561/s]
  10. * Error:[ 0/s]|total:[ 0][min:0/s max:0/s]
  11. -----------------------------------------------------------------------
  12. * 0ms-0.1ms:[ ] 0.1ms-0.5ms:[ 435,604]
  13. * 0.5ms-1ms:[ 59,863] 1ms-5ms:[ 4,356]
  14. * 5ms-10ms:[ 142] 10ms-50ms:[ 35]
  15. * 50ms-100ms:[ ] 100ms-1000ms:[ ]
  16. * 1000ms-5000ms:[ ] 5000ms-10000ms:[ ]
  17. ***********************************************************************
  18.  
  19. ***********************************************************************
  20. * ListEmployees test prepping completed
  21. -----------------------------------------------------------------------
  22. * [500000/500000]|threads:[10]
  23. * Success:[ 0/s]|total:[ 500000][min:28105/s max:28829/s]
  24. * Error:[ 0/s]|total:[ 0][min:0/s max:0/s]
  25. -----------------------------------------------------------------------
  26. * 0ms-0.1ms:[ ] 0.1ms-0.5ms:[ 476,342]
  27. * 0.5ms-1ms:[ 20,641] 1ms-5ms:[ 2,922]
  28. * 5ms-10ms:[ 80] 10ms-50ms:[ 15]
  29. * 50ms-100ms:[ ] 100ms-1000ms:[ ]
  30. * 1000ms-5000ms:[ ] 5000ms-10000ms:[ ]
  31. ***********************************************************************

现有的ConcurrentTest的功能还相对简陋,不过应用者还是可以根据实际的需要来制定统计标签,延时区间等相关统计;由于组件的代码也非常少只有几个类,你也根据根据自己的需要来扩展它或在https://github.com/IKende/ConcurrentTest提上相应issues

版权声明:本文为smark原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/smark/p/9913339.html