.net core 使用ConcurrentTest组件对方法进行压力测试

工欲善其事,必先利其器!在编写服务中首先要有一个好的测试工具,在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

posted @   beetlex  阅读(1668)  评论(2编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示