一直对性能测试比较感兴趣,所以也写了不少的测试工具有WebApiBenchmark
和TcpBenchmark
等;但这些工具测试都是有针对性和配置的方式来进行功能有限所以很难适用更多的场景,所以单独开发一个组件CodeBenchmark
来解决不同业务代码下的性能测试;严格来说CodeBenchmark
并不算一个完整的测试工具,它提供一个测试管理功能和测试环境,可以对实现某一规则业务代码进行一个并发测试并提供一个最终的测试结果.以下主要介绍如何使用CodeBenchmark
.
环境要求
CodeBenchmark
是基于netstandard2.0
开发,适用于支持这一版本的.net core
和.net framework
环境;运行系统则看情况需要可部署到linux
或windows
,开发语言c#
.
构建测试项目
可以通过vs
或vscode
构建一个控制台项目然后引用组件(引用最新版本的BeetleX.CodeBenchmark
)
Install-Package BeetleX.CodeBenchmark -Version 0.6.2
引用组件后就可以编写具体的测试用例,测试用例编写必须符合组件测试要求,所以需要实现一个接口来编写测试代码,接口描述如下:
public interface IExample:IDisposable
{
void Initialize(Benchmark benchmark);
Task Execute();
}
Initialize
方法用于描述并发实例创建时初始化信息执行
Execute
并发实例每次执行的代码逻辑
测试代码可以针对自己的业务情况来编写,具体的业务逻辑可以是http,数据库访问等操作.
websocket测试用例
[System.ComponentModel.Category("TCP")]
public class WebsocketJson : IExample
{
public async Task Execute()
{
var request = new { url = "/json" };
var result = await jsonClient.ReceiveFrom(request);
}
private BeetleX.Http.WebSockets.JsonClient jsonClient;
public void Initialize(Benchmark benchmark)
{
jsonClient = new BeetleX.Http.WebSockets.JsonClient("ws://192.168.2.19:8080");
}
public void Dispose()
{
jsonClient.Dispose();
}
}
TCP测试用例
[System.ComponentModel.Category("TCP")]
public class TcpTextLine : IExample
{
public async Task Execute()
{
var data = $"henryfan@{DateTime.Now}";
var stream = await mClient.ReceiveFrom(s => s.WriteLine(data));
stream.ReadLine();
}
private BeetleX.Clients.AsyncTcpClient mClient;
public void Initialize(Benchmark benchmark)
{
mClient = BeetleX.SocketFactory.CreateClient<BeetleX.Clients.AsyncTcpClient>("192.168.2.19", 9012);
}
public void Dispose()
{
mClient.Dispose();
}
}
Http测试用例
[System.ComponentModel.Category("TCP")]
class HttpGet : IExample
{
public void Dispose()
{
}
public async Task Execute()
{
var result = await _httpHandler.json();
}
public void Initialize(Benchmark benchmark)
{
if (_httpApi == null)
{
_httpApi = new BeetleX.Http.Clients.HttpClusterApi();
_httpApi.DefaultNode.Add("http://192.168.2.19:8080");
_httpHandler = _httpApi.Create<IHttpHandler>();
}
}
static BeetleX.Http.Clients.HttpClusterApi _httpApi;
static IHttpHandler _httpHandler;
[BeetleX.Http.Clients.FormUrlFormater]
public interface IHttpHandler
{
// http://host/json
Task<string> json();
}
}
以上基础的测试用例都可以从https://github.com/IKende/CodeBenchmarkDoc 获取得到.
运行测试用例
组件在运行用例的时候并不需要配置,只需要构建测试对象并把有测试用例的程序集注册进去即可完成.
Benchmark benchmark = new Benchmark();
benchmark.Register(typeof(Program).Assembly);
benchmark.Start();
以上代码是加载本项的程序集,并启动一个测试管理界面.默认开启的服务端口是9090
,可以在Start
方法指定服务的端口.启动日志如下:
通过日志可以查看到服务启动情况,运行成功后就可以通过浏览器访问并进行测试
可以根据测试情况选择需要的测试用例、并发数量和运行时间.
也可以运行多个测试用例,并对比它们的性能.
如果你对组件有兴趣或有意见可以关注 https://github.com/IKende/CodeBenchmarkDoc