工欲善其事,必先利其器!在编写服务中首先要有一个好的测试工具,在dontecore下性能测试有BenchmarkDotNet,只需要简单的配置一下就可以对方法的性能进行详细的测试。但有时候需要对不同并发下看其处理效率和延时统计查看,如HTTP服务对应着大量的测试工具如ab
,bombardier
等等。由于找不到类似于测试HTTP服务的工具来测试代码用例,于时就有了ConcurrentTest这个组件的实现.通过ConcurrentTest组件可以运行不同的测试用例,并可以实时查看具体的并发情况和延时分布数据。以下介绍一下如何使用ConcurrentTest运行测试用例并统计运行结果
引用组件
Install-Package BeetleX.ConcurrentTest -Version 0.2.
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();
}
[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>(, );
以上代码是对FastHttpClientTest
的所有测试方法进行一个测试,测试数据是使用10个线程,进行500000万次调用测试。
测试报表
在运行过程中组件会实时显示并发情况和区间响应数量,最终会针对每个测试用例形成一个简要的测试结果;具体结果如下:
***********************************************************************
* https://github.com/IKende/ConcurrentTest.git
* Copyright ? ikende.com email:henryfan@msn.com
* ServerGC:True
***********************************************************************
* AddEmployee test prepping completed
-----------------------------------------------------------------------
* [/]|threads:[]
* Success:[ /s]|total:[ ][min:/s max:/s]
* Error:[ /s]|total:[ ][min:/s max:/s]
-----------------------------------------------------------------------
* 0ms-.1ms:[ ] .1ms-.5ms:[ ,]
* .5ms-1ms:[ ,] 1ms-5ms:[ ,]
* 5ms-10ms:[ ] 10ms-50ms:[ ]
* 50ms-100ms:[ ] 100ms-1000ms:[ ]
* 1000ms-5000ms:[ ] 5000ms-10000ms:[ ]
*********************************************************************** ***********************************************************************
* ListEmployees test prepping completed
-----------------------------------------------------------------------
* [/]|threads:[]
* Success:[ /s]|total:[ ][min:/s max:/s]
* Error:[ /s]|total:[ ][min:/s max:/s]
-----------------------------------------------------------------------
* 0ms-.1ms:[ ] .1ms-.5ms:[ ,]
* .5ms-1ms:[ ,] 1ms-5ms:[ ,]
* 5ms-10ms:[ ] 10ms-50ms:[ ]
* 50ms-100ms:[ ] 100ms-1000ms:[ ]
* 1000ms-5000ms:[ ] 5000ms-10000ms:[ ]
***********************************************************************
组件还具备什么功能
现有的ConcurrentTest的功能还相对简陋,不过应用者还是可以根据实际的需要来制定统计标签,延时区间等相关统计;由于组件的代码也非常少只有几个类,你也根据根据自己的需要来扩展它或在https://github.com/IKende/ConcurrentTest提上相应issues