分布式测试工具Beetle.DT的部署并进行HTTP,SQL,TCP压测

由于Beetle.DT是一个分布式压力测试工具,所以在使用上并不像普通工具那样安装运行这么简单;由于工具涉及到测试管理中心,节点和管理端等工具; 所以必须要进行相应的部署才能运行。接下来详解一下如果安装Beetle.DT并进行简单的HTTP,SQL和TCP相关压力测试。

运行环境要求

现有版本的Beetle.DT只能运行在windows+.net 4.5的基础上(暂只支持Console模试运行)在功能完善后会进行win service服务和.net core版的扩展开发。工具运行主要部署两大应用服务(已编译在Public目录下)分别是:测试管理中心和测试运行节点,通过配置相关网络信息确保节点和中心有效地进行交互通讯。

测试管理中心

项目Beetle.DTCenter是测试管理中心的运行程度,中心需要配置两个服务地址分别是节点通讯端口和管理通讯端,对应端口是9091和9092;如果想修改服务地址和端则通过配置文件修改(Beetle.DTCenter.exe)

1
2
3
4
5
6
7
8
9
< appSettings >
   <!-- ... -->
   < add  key="server-host" value=""/>
   < add  key="server-port" value="9091"/>
   < add  key="manager-host" value=""/>
   < add  key="manager-port" value="9092"/>
   <!-- ... -->
</ appSettings >

节点服务

项目Beetle.DTNode是测试节点服务,节点服务除了包括自身的服务外目录下还包括了Beetle.DTProcess;Beetle.DTProcess的主要用途是用于加载运行测试用例;Beetle.DTProcess并不需要配置任何信息,不过它必须存放在Beetle.DTNode对应的目录下。Beetle.DTNode主要是配置Beetle.DTCenter对应的server-host和server-port,确认节点能有效的指向对应的测试中心。


< appSettings >
   <!-- ... -->
   < add  key="server-host" value="127.0.0.1"/>
   < add  key="server-port" value="9091"/>
   <!-- ... -->
</ appSettings >

管理工具

当测试中心和节点都部署完成后,就可以使用管理工具登陆到测试中心进行测试用例的创建,文件上传,节点监控和测试运行等相关操作。 打开管理工具后输入管理端的服务地址,然后连接进入管理端;进入后就可以创建测试目录和上传文件,在选择测试目录和运行节点后点击测试按钮就进行测试界面。 

在测试界面上点击同步即可以把测试用例同步到所选择的节点上,然后输入相应的配置信息点击运行进行测试用例即可;在测试运行过程中下面的图表会显示当前不同时间段内测试请求响应的并发结果 

测试完成后可以通过查看详细报表来查看测试的情况 

HTTP,SQL和TCP测试

Beetle.DT自身只是一个测试工具,所以在没有测试用例的情况工具是完全起不了任何作用。为让大家更好的了解工具的用途,所以编写了几个基础的测试用例,通过这些测试用例可以对http,sql和tcp进行简单的压力测试。 

编写测试用例

实际业务都存在多样性,对于简单的测试用例是不可能满足不同业务的需要,所以在使用工具的时候就不得不进行测试用例编写。由于需要符合工具运行要求所以编写测试用例也需要遵循着工具制定的规则;在编写测试用例的时候必须引用Beetle.DTCore项目,然后承继TestCase重写OnExecute写入需要测试的代码取可;如果测试代码是异步的情况则需要重写Execute的主方法,手动调用Completed方法来告诉工具测试用例什么时候完成。以下是几个基础测试用例的实现代码

  • HTTP


    public  class  HttpGet : TestCase<Config>
         {
             public  override  string  Name
             {
                 get
                 {
                     return  "HTTP_GET" ;
                 }
             }
             private  long  mIndex = 0;
             private  List< string > mUrls =  new  List< string >();
             public  override  void  Init()
             {
                 base .Init();
                 mUrls.AddRange( this .Config.Urls.Split( ';' ));
             }
             public  string  GetUrl()
             {
                 mIndex++;
                 return  mUrls[( int )(mIndex % mUrls.Count)];
             }
             protected  override  void  OnExecute()
             {
                 System.Net.WebRequest wReq = System.Net.WebRequest.Create(GetUrl());
                 System.Net.WebResponse wResp = wReq.GetResponse();
                 System.IO.Stream respStream = wResp.GetResponseStream();
                 using  (System.IO.StreamReader reader =  new  System.IO.StreamReader(respStream, Encoding.UTF8))
                 {
                     reader.ReadToEnd();
                 }
             }
         }
         public  class  Config
         {
             public  string  Urls {  get set ; }
         }
  • SQL


    public  class  MySqlDriver : DriverTemplate<MySqlConnection, MySqlCommand, MySqlDataAdapter, MySqlParameter, MysqlBuilder>
         {
         }
         public  abstract  class  sqlbase : TestCase<SQLConfig>
         {
             public  override  void  Init()
             {
                 Peanut.DBContext.SetConnectionString(DB.DB1, Config.Connection);
                 base .Init();
             }
             protected  override  void  OnExecute()
             {
                 base .OnExecute();
                 Peanut.SQL sql = Config.Sql;
                 sql.Execute();
             }
         }
         public  class  MSSQL : sqlbase
         {
             public  override  void  Init()
             {
                 Peanut.DBContext.SetConnectionDriver<Peanut.MSSQL>(DB.DB1);
                 base .Init();
             }
             public  override  string  Name
             {
                 get
                 {
                     return  "mssql" ;
                 }
             }
         }
         public  class  MYSQL : sqlbase
         {
             public  override  void  Init()
             {
                 Peanut.DBContext.SetConnectionDriver<MySqlDriver>(DB.DB1);
                 base .Init();
             }
             public  override  string  Name
             {
                 get
                 {
                     return  "mysql" ;
                 }
             }
         }
         public  class  SQLConfig
         {
             public  string  Connection {  get set ; }
             public  string  Sql {  get set ; }
         }
  • TCP


    public  class  SocketTcpUtf : Beetle.DTCore.TestCase<TcpConfig>
         {
             public  byte [] mData;
             private  BeetleX.Clients.IClient mClient;
             public  override  void  Init()
             {
                 base .Init();
                 mData = GetData();
                 mClient = BeetleX.ServerFactory.CreateTcpClient(Config.Host, Config.Port);
                 mClient.ClientError = OnNetError;
                 mClient.Receive = OnReceive;
             }
             private  void  OnReceive(IClient c, IBinaryReader reader)
             {
                 foreach  (IBuffer item  in  reader.GetBuffers())
                 {
                     item.Free();
                 }
                 Completed();
             }
             private  void  OnNetError(IClient c, Exception e,  string  message)
             {
                 Completed(e);
             }
             protected  virtual  byte [] GetData()
             {
                 return  Encoding.UTF8.GetBytes(Config.Data);
             }
             public  override  string  Name
             {
                 get
                 {
                     return  "TCP_UTF_DATA" ;
                 }
             }
             public  override  void  Execute()
             {
                 mClient.Send(mData);
             }
         }
         public  class  SocketTcpHex : SocketTcpUtf
         {
             public  override  string  Name
             {
                 get
                 {
                     return  "TCP_HEX_DATA" ;
                 }
             }
             protected  override  byte [] GetData()
             {
                    return  Enumerable.Range(0, Config.Data.Length)
                          .Where(x => x % 2 == 0)
                          .Select(x => Convert.ToByte(Config.Data.Substring(x, 2), 16))
                          .ToArray();
             }
         }
         public  class  TcpConfig
         {
             public  string  Host {  get set ; }
             public  int  Port {  get set ; }
             public  string  Data {  get set ; }
         }

Github https://github.com/IKende/Beetle.DT/

原文地址:http://www.cnblogs.com/smark/p/7505551.html


.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/323672.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常用公有云接入——谷歌

一、概念 1、项目 一个账号有唯一的项目&#xff0c;所有虚拟机都在project里面建。 2、计算引擎 虚拟机资源。 二、创建方式 1、页面控制台 2、gcloud命令行 3、REST API 4、SDK 三、Java SDK 1、创建API服务凭据&#xff0c;并下载P12文件 2、Maven <dependency&…

elementui实现表格单选功能

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 需求是这样的&#xff1a;用户单击购买产品的按钮时&#xff0c;会出现一个产品的列表&#xff0c;但是呢只能买一种产品&#xff0c;暂时不可以多选。效果如下所示&#xff1a; 原来…

element-ui实现表格单选的功能

“大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂”前言现在是&#xff1a;2022年4月20日13:33:23需求是这样的&#xff1a;用户单击购买产品的按钮时&#xff0c;会出现一个产品的列表&#xff0c;但是呢只能买一种产品&#xff0c;暂时不…

ASP.NET Core Razor 视图组件

视图组件简介 在新的ASP.NET Core MVC中&#xff0c;视图组件类似于局部视图&#xff0c;但它们更强大。视图组件不使用模型绑定&#xff0c;仅依赖于您在调用时提供的数据。 视图组件特性&#xff1a; 呈现页面响应的某一部分而不是整个响应包括在控制器和视图之间发现的关…

三个好用的并发工具类

转载自 三个好用的并发工具类 以前的文章中&#xff0c;我们介绍了太多的底层原理技术以及新概念&#xff0c;本篇我们轻松点&#xff0c;了解下 Java 并发包下、基于这些底层原理的三个框架工具类。 它们分别是&#xff1a; 信号量 Semaphore 倒计时门栓 CountDownLatch …

Error Handling in ASP.NET Core

前言 在程序中&#xff0c;经常需要处理比如 404&#xff0c;500 &#xff0c;502等错误&#xff0c;如果直接返回错误的调用堆栈的具体信息&#xff0c;显然大部分的用户看到是一脸懵逼的&#xff0c;你应该需要给用户返回那些看得懂的界面。比如&#xff0c;“当前页面不存在…

基于python的selenium

一.安装 安装WebDriver 查看chrome版本号&#xff0c;设置-帮助-关于Google chrome&#xff0c;找到版本号。 可以到这个网站进行下载对应版本的chromedriver,如果chrome浏览器版本过高,可以下载最新版的chromedriver进行使用 Chrome for Testing availability 下载下来之后…

多信息登录、检测用户信息是否完善且引导补全

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注&#xff1a;穆雄雄的博客 前言 现在是2022年4月28日13:41:29&#xff01; 今天分享两块内容。 1.需求&#xff1a;用户可以通过手机号、邮箱来注册我们的系统&#xff0c;用户完成之后&#xff0c;可以去完善自己的个人信息…

PNG 图片压缩原理解析

转载自 PNG 图片压缩原理解析 什么是PNG PNG的全称叫便携式网络图型&#xff08;Portable Network Graphics&#xff09;是目前最流行的网络传输和展示的图片格式&#xff0c;原因有如下几点&#xff1a; 无损压缩&#xff1a;PNG图片采取了基于LZ77派生算法对文件进行压缩&…

element ui实现多层级复杂表单的操作(添加与回显)之表单操作交互操作

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是2022年5月3日11:47:15&#xff01;劳动节假期已经过去了三天了&#xff0c;今天是被封家里的第7天&#xff0c;也是解封的第一天。 说实话&#xff0c;在家里的工作效率一点都…

TypeScript 2.5 发布,增加语言级重构

在 TypeScript 2.5 版本中&#xff0c;Microsoft 专注于提高开发人员的生产力&#xff0c;其范围已经超出了代码编辑器所提供的常见功能。 习惯于类型语言&#xff08;如 C&#xff03;&#xff09;的开发人员喜欢使用那些可以轻松执行常见重构的工具。现在 TypeScript 可以利…

element ui实现多层级复杂表单的操作(添加与回显)之添加功能实现

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是2022年5月3日13:35:15&#xff01;文接上篇。[element ui实现多层级复杂表单的操作&#xff08;添加与回显&#xff09;之表单操作交互操作](element ui实现多层级复杂表单的操…

Entity Framework Core Like 查询揭秘

在Entity Framework Core 2.0中增加一个很酷的功能&#xff1a;EF.Functions.Like()&#xff0c;最终解析为SQL中的Like语句&#xff0c;以便于在 LINQ 查询中直接调用。 不过Entity Framework 中默认提供了StartsWith、Contains和EndsWith方法用于解决模糊查询&#xff0c;那…

element ui实现多层级复杂表单的操作(添加与回显)之回显功能实现

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是2022年5月3日17:02:30&#xff01;文接上两篇。 [element ui实现多层级复杂表单的操作&#xff08;添加与回显&#xff09;之表单操作交互操作](element ui实现多层级复杂表单…

在Mac的Docker中运行DotNetCore2.0

最近学习Angular4&#xff0c;服务端准备使用DotNetCore API来实现&#xff0c;本文简单介绍下在Mac中怎样将DotNetCore程序部署在Docker中&#xff0c;并使用Nginx做反向代理让程序可以跑起来。 具体步骤如下 安装Docker拉取DotNetCore镜像使用VS For Mac创建DotNetCore应用…

springboot实现复杂业务下的更新操作

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是2022年5月4日19:25:55&#xff01;今天写了个这样的功能&#xff1a; 某用户在一天内有多个训练项目&#xff0c;比如&#xff1a;晨跑&#xff0c;有氧训练&#xff0c;跳绳这…

elementui解决el-dialog不清空内容的问题,el-dialog关闭时销毁子组件

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂 前言 现在是2022年5月5日22:48:21&#xff01; 今天在使用element-ui中的el-dialog的时候遇到了个这样的问题&#xff1a;页面上点击添加的按钮&#xff0c;弹出el-dialog对话框&#xff…

MySQL 中的重做日志,回滚日志以及二进制日志的简单总结

转载自 MySQL 中的重做日志&#xff0c;回滚日志以及二进制日志的简单总结 MySQL中有六种日志文件&#xff0c;分别是&#xff1a;重做日志&#xff08;redo log&#xff09;、回滚日志&#xff08;undo log&#xff09;、二进制日志&#xff08;binlog&#xff09;、错误日志…

c语言分离三位数

#include<stdio.h> main(){ int k,l,m,n;printf("请输入一个三位数"); scanf("%d",&k);lk/100;mk/10%10;nk%10;printf("这个三位数的百位是:%d\n",l);printf("这个三位数的十位是:%d\n",m);printf("这个三位数的个位是…

分布式ID自增算法 Snowflake

近在尝试EF的多数据库移植&#xff0c;但是原始项目中主键用的Sqlserver的GUID。MySQL没法移植了。 其实发现GUID也没法保证数据的递增性&#xff0c;又不太想使用int递增主键&#xff0c;就开始探索别的ID形式。 后来发现twitter的Snowflake算法。 一开始我尝试过直接引用N…