分散式測試工具Beetle.DT的部署並進行HTTP,SQL,TCP壓測

smark發表於2017-09-11

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




相關文章