由于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)

  <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/


分布式测试工具Beetle.DT的部署并进行HTTP,SQL,TCP压测的更多相关文章

  1. .net分布式压力测试工具(Beetle.DT)

    肯定有人会问为什么会写这样一个开源工具?和现有的有什么差别?不过对于一个程序员来说写东西还真不需要理由的:),主要原因是工作有点闲(开玩笑),不过说实话一个程员怎可能会停止写代码呢(作为一个奔4的程序 ...

  2. Centos下分布式跟踪工具Pinpoint的完整部署记录

    一.Pinpoint简单介绍Pinpoint是一款对Java编写的大规模分布式系统的APM工具,有些人也喜欢称呼这类工具为调用链系统.分布式跟踪系统.一般来说,前端向后台发起一个查询请求,后台服务可能 ...

  3. 分布式压测系列之Jmeter4.0第一季

    1)Jmeter4.0介绍 jmeter是个纯java编写的开源压测工具,apache旗下的开源软件,一开始是设计为web测试的软件,由于发展迅猛,现在可以压测许多协议比如:http.https.so ...

  4. web压测工具http_load原理分析

    一.前言 http_load是一款测试web服务器性能的开源工具,从下面的网址可以下载到最新版本的http_load: http://www.acme.com/software/http_load/ ...

  5. 面向Web应用的并发压力测试工具——Locust实用攻略

    1. 概述 该方案写作目的在于描述一个基于Locust实现的压力测试,文中详细地描述了如何利用locustfile.py文件定义期望达成的测试用例,并利用Locust对目标站点进行并发压力测试. 特别 ...

  6. 为什么 jmeter 分布式测试,一定要设置 java.rmi.server.hostname

    之前总结了 jmeter 分布式测试的过程,在部署过程中提到,要在 system.properties 中配置自己的 IP. 至于为什么要这么做,源于这一次 debug 的过程. 运行环境 mint, ...

  7. 渗透测试工具SQLmap

    一.简介 SQLmap 是一款用 Python 编写的开源渗透测试工具,用来自动检测和利用 SQL 注入漏洞. 二.Windows 下安装 2.1 安装 Python 环境 注:Python 3.0会 ...

  8. 性能工具之JMeter+InfluxDB+Grafana打造压测可视化实时监控【转】

    概述 本文我们将介绍如何使用JMeter+InfluxDB+Grafana打造压测可视化实时监控. 引言 我们很多时候在使用JMeter做性能测试,我们很难及时察看压测过程中应用的性能状况,总是需要等 ...

  9. jmeter压测、操作数据库、分布式、 linux下运行的简单介绍

    一.jmeter压测 1.如何压测 常规性能压测:10-15分钟 稳定性测试:一周.2天等 如果想要压测10分钟,勾选永远,勾选调度器,填写600秒.也可以使用固定启动时间. 2.tps.响应时间 ( ...

随机推荐

  1. C# 接口基础学习

    什么是接口  接口,在表面上是由几个没有主体代码的方法.属性.索引器.事件,或者它们的组合的集合体,有唯一的名称,可以被类或结构或者其他接口所实现(或者也可以说继承).它在形式上可能是如下的样子: i ...

  2. [js高手之路] es6系列教程 - 箭头函数详解

    箭头函数是es6新增的非常有意思的特性,初次写起来,可能会觉得别扭,习惯之后,会发现很精简. 什么是箭头函数? 箭头函数是一种使用箭头( => )定义函数的新语法, 主要有以下特性: 不能通过n ...

  3. NYOJ--241--字母统计

    /* Name: NYOJ--241--字母统计 Date: 18/04/17 17:12 Description: 水过,C++11特性不能用,尴尬 */ #include<bits/stdc ...

  4. Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求

    Java过滤器处理Ajax请求,Java拦截器处理Ajax请求,拦截器Ajax请求 >>>>>>>>>>>>>>&g ...

  5. centos7下nginx安装

    http://www.linuxidc.com/Linux/2016-09/134907.htm 安装所需环境 Nginx 是 C语言 开发,建议在 Linux 上运行,当然,也可以安装 Window ...

  6. 纯JavaScript实现异步Ajax的基本原理

      Ajax实际就是XMLHttpRequest对象和DOM.(X)HTML和CSS的简称,用于概括异步加载页面内容的技术. Ajax实例 HTML代码如下,包含一个h5标题和一个按钮: JS代码如下 ...

  7. JS正则密码复杂度校验之:至少有多种字符中的其中几种

    概述 续接上文的密码校验要求: 这个需求有两个难点,一,是如何使用正则匹配所有半角英文标点符号,二,是如何验证密码段中在要求的四种(大写字母,小写字母,数字,标点符号)类型中至少存在三种. 第一个难点 ...

  8. Orleans稍微复杂的例子—互动

    这是Orleans系列文章中的一篇.首篇文章在此 我费力费心的翻译过官方的教程,但是本人英语词汇量不高,可是架不住电子词典啊-只要肯花时间,我这些内容谁都可以做出来.所以这个事例告诉我们一个道理,那就 ...

  9. Slave_SQL_Runing:NO 复制出现问题的解决办法

    --Slave_SQL_Runing:NO 复制出现问题的解决办法 -------------------------------------------------------2014/05/21 ...

  10. Android绘画板(普通绘画模式和缩放平移绘画模式)

    ScaleSketchPadDemo 项目地址: demo apk体验下载 demo2 apk体验下载 用法: 进入项目根目录:https://github.com/ShaunSheep/ScaleS ...