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