源代碼下載:http://www.sufeinet.com/thread-11-1-1.html
上次文章鏈接:http://www.cnblogs.com/sufei/archive/2012/01/12/2320430.html
寫這些並不是不會用測試工具,也並不是無視測試工具,而是做為一個程序員希望用自己寫的東西來完成一些功能,從而更深入的學習一下相關技術
而且這樣的小工具,不是測試工具那樣繁瑣很方便 。
上次文章引言
我們一直在做網站,但在我河南這塊,對測試工作,特別是壓力測試一般都不怎么在意,都是自己訪問一下速度不錯就行了,再就是數據庫訪問速度測試也是同樣情況
程序員在寫Sql代碼時,一般是一個人寫完之后,一運行可快完事
其實這些是不夠的,我們根本沒有進行過多用戶多線程的測試,如果是100個,一千個要同時訪問,還會有這樣的速度嗎?
我們自己反思一下是不是有這樣的經歷呢,我做的網站剛上傳服務器,打開很快,調數據庫1000條以內一秒用不了,感覺非常好,但過了不幾天,就會感覺到網站很慢很慢,於是去檢查測試
其實這些可以提前做的,我下面來實現一個多線程測試網站訪問速度的功能。
上次文章效果
說明:
1.一次可以開N多個線程;
2.可以設置要訪問的地址;
3.可以設置要循環訪問的次數;
相關技術點:
1.C# Winform;
2.httpHelper類;這是我之前自己寫的一個類,大家可以參考一下(帶證書,無視編碼,設置代理等)
3.多線程;
4.線程之間的傳參;
5.委托與匿名委托的使用方法;
接下來看看本次的效果吧,
其實是應在家的需求在原來的基礎之上做了簡單的修改,
源代碼可以下載,大家自己修改吧
我就修改到這里,希望大家多多指教啊
下面的源代碼

using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Net; using System.Threading; using System.Data.SqlClient; namespace AutoFor { public partial class TextFor : Form { private delegate void UpDateDgvDelegate(string msg, int rowId, string columnName); private UpDateDgvDelegate _upDateStateDelegate; public TextFor() { InitializeComponent(); _upDateStateDelegate = new UpDateDgvDelegate(UpDateDgv); } /// <summary> /// 修改表格的行數據 /// </summary> /// <param name="msg">要修改為的數據</param> /// <param name="rowId">行號</param> /// <param name="columnName">列名</param> private void UpDateDgv(string msg, int rowId, string columnName) { try { dgvTextFor.Rows[rowId].Cells[columnName].Value = msg.ToString(); } catch { } } /// <summary> /// 程序執行時間測試 /// </summary> /// <param name="dateBegin">開始時間</param> /// <param name="dateEnd">結束時間</param> /// <returns>返回(秒)單位,比如: 0.00239秒</returns> public static string ExecDateDiff(DateTime dateBegin, DateTime dateEnd) { TimeSpan ts1 = new TimeSpan(dateBegin.Ticks); TimeSpan ts2 = new TimeSpan(dateEnd.Ticks); TimeSpan ts3 = ts1.Subtract(ts2).Duration(); return ts3.TotalMilliseconds.ToString(); } /// <summary> /// 執行數據 /// </summary> /// <param name="dgvrowid"> 線程號行號</param> /// <param name="number">循環總次數</param> private void PingTask(int dgvrowid, int number, string url, int time) { //獲取開始時間 DateTime st = DateTime.Now; //開始時間 this.BeginInvoke(_upDateStateDelegate, st.ToString("hh-mm-ss"), dgvrowid, "開始時間"); for (int i = 0; i < number; i++) { //獲取線程開始時間 DateTime stThread = DateTime.Now; try { HttpHelps hh = new HttpHelps(); //自動訪問百度,主要是延長時間 string strdate = hh.GetHttpRequestStringByNUll_Get(url, null); //當前循環次數 this.BeginInvoke(_upDateStateDelegate, strdate, dgvrowid, "數據"); //當前循環次數 this.BeginInvoke(_upDateStateDelegate, (i+1).ToString(), dgvrowid, "當前循環次數"); //獲取結束時間 DateTime et = DateTime.Now; //結束時間 this.BeginInvoke(_upDateStateDelegate, et.ToString("hh-mm-ss"), dgvrowid, "結束時間"); //總用時(毫秒) this.BeginInvoke(_upDateStateDelegate, ExecDateDiff(st, et), dgvrowid, "總用時(毫秒)"); do { if (stThread.AddSeconds(time) <= DateTime.Now) { break; } } while (true); } catch { } } } /// <summary> /// 創建表格 /// </summary> /// <param name="rows">生成多少行數</param> private void CreateTable(int rows) { DataTable dt_Sale = new DataTable(); DataColumn dc = null; //線程ID dc = new DataColumn(); dc.ColumnName = "線程ID"; dc.DefaultValue = "1"; dc.DataType = Type.GetType("System.String"); dt_Sale.Columns.Add(dc); //循環類型 dc = new DataColumn(); dc.ColumnName = "循環類型"; dc.DefaultValue = " "; dc.DataType = Type.GetType("System.String"); dt_Sale.Columns.Add(dc); //當前循環次數 dc = new DataColumn(); dc.ColumnName = "當前循環次數"; dc.DefaultValue = " "; dc.DataType = Type.GetType(" System.String"); dt_Sale.Columns.Add(dc); //開始時間 dc = new DataColumn(); dc.ColumnName = "開始時間"; dc.DefaultValue = " "; dc.DataType = Type.GetType("System.String"); dt_Sale.Columns.Add(dc); //結束時間 dc = new DataColumn(); dc.ColumnName = "結束時間"; dc.DefaultValue = " "; dc.DataType = Type.GetType("System.String"); dt_Sale.Columns.Add(dc); //總用時(毫秒) dc = new DataColumn(); dc.ColumnName = "總用時(毫秒)"; dc.DefaultValue = " "; dc.DataType = Type.GetType("System.String"); dt_Sale.Columns.Add(dc); //測試數據 dc = new DataColumn(); dc.ColumnName = "數據"; dc.DefaultValue = " "; dc.DataType = Type.GetType("System.String"); dt_Sale.Columns.Add(dc); DataRow dr = dt_Sale.NewRow(); for (int i = 1; i < rows; i++) { dr["線程ID"] = i.ToString(); dr["循環類型"] = "For循環"; dr["當前循環次數"] = "0"; dr["開始時間"] = "00:00:00"; dr["結束時間"] = "00:00:00"; dr["總用時(毫秒)"] = "0"; dr["數據"] = ""; dt_Sale.Rows.Add(dr); dr = dt_Sale.NewRow(); } dgvTextFor.DataSource = dt_Sale; } private void button3_Click(object sender, EventArgs e) { int count = Convert.ToInt32(txtCount.Text.Trim()); int number = Convert.ToInt32(txtNumber.Text.Trim()); CreateTable(count + 1); //開啟number個線程 for (int i = 0; i < count; i++) { Thread pingTask = new Thread(new ThreadStart(delegate { PingTask(i, number, textBox1.Text.Trim(), Convert.ToInt32(txtForTime.Text.Trim())); })); pingTask.Start(); Thread.Sleep(Convert.ToInt32(txtKtime.Text.Trim()) * 1000); } } } }
里面所用的HttpHelps類在打包文件里面有。
也可以參考我的文章C# HttpHelper,Httprequest,請求時無視編碼,無視證書,無視Cookie,網頁抓取