概述:
這篇文章用WF實現一個軟件自動測試框架,這個框架你可以隨意擴展。本這個框架根據WF流程去自動地點擊你的頁面;自動的在你的文 本上輸入值;自動的做一些人為的操作。也就是說WF相當於一個測試用戶,自動地幫你測試軟件。只需要你定制測試流程。
寫一個待測試的軟件:
這裡我寫了一個很簡單的待測試的軟件:一個加法運算。界面如下圖,就一個Form。
後台代碼如下:
1 public partial class MainForm : Form
2 {
3 public MainForm()
4 {
5 InitializeComponent();
6 }
7
8 private void btnAdd_Click(object sender, EventArgs e)
9 {
10 try
11 {
12 int a =int.Parse(txt1.Text);
13 int b =int.Parse(txt2.Text);
14 int c = a + b;
15 txt3.Text = c.ToString();
16 }
17 catch
18 {
19 txt3.Text = "";
20 }
21 }
22
23
24 }
畫測試流程:
1、新建一個Test1流程,如下圖:
2、拖測試活動:
3、修改display屬性,使流程更加形象:
4、設置活動屬性,這裡以幾個個活動為例,看下面的圖:
“設置加數1的值”設置如下:
“點擊計算按鈕”設置如下:
“獲取計算結果”設置如下:
“驗證結果”設置如下:
“關閉表單”設置如下:
4、這個流程分為:
a、設置表單上兩個加數文本的值
b、自動點擊計算按鈕
c、獲取表單上的值
d、判斷從表單上取得的值與正確的值是否相等
e、如果相等輸出正確,否者輸出存在bug。
f、關閉表單
以上6個步驟會自動執行,你可以看見下圖的Output輸出:程序正確。
修改待測試軟件,將下面代碼屏蔽掉。看運行效果:
//int c = a + b;
// txt3.Text = c.ToString();
輸出如下圖:
我們可以看到Output輸出:程序有bug。
框架實現:
類圖如下:
StartFlow用於啟動流程,其余的為自定義活動。
WindowsControlActivity代碼如下,FormType參數是表單的類型(要帶上命名空間),RequiredArgument屬性表示這個參數是必需的。
1 public class WindowsControlActivity : CodeActivity
2 {
3 public delegate void SetControlValueCallback( Control oControl);
4 // Define an activity input argument of type string
5 [RequiredArgument]
6 public InArgument<string> FormType { get; set; }
7
8 // If your activity returns a value, derive from CodeActivity<TResult>
9 // and return the value from the Execute method.
10 protected override void Execute(CodeActivityContext context)
11 {
12 // Obtain the runtime value of the Text input argument
13
14 }
15
16 }
ClickButtonActivity代碼如下,ButtonName參數表示按鈕的名稱,這個活動的父類是WindowsControlActivity,故它也要求有FormType 參數。
1 public sealed class ClickButtonActivity : WindowsControlActivity
2 {
3 // Define an activity input argument of type string
4 [RequiredArgument]
5 public InArgument<string> ButtonName { get; set; }
6
7 // If your activity returns a value, derive from CodeActivity<TResult>
8 // and return the value from the Execute method.
9 protected override void Execute(CodeActivityContext context)
10 {
11 StartFlow.Extensions ext = context.GetExtension<StartFlow.Extensions> ();
12 Form frm = ext.GetForm(FormType.Get(context));
13 Button button = ext.GetControl(frm, ButtonName.Get(context)) as Button;
14 SetControlPropertyValue(button);
15 }
16
17 private void SetControlPropertyValue( Control oControl)
18 {
19 if (oControl.InvokeRequired)
20 {
21 SetControlValueCallback d = new SetControlValueCallback(SetControlPropertyValue);
22 oControl.Invoke(d, new object[] { oControl });
23 }
24 else
25 {
26 Button button = oControl as Button;
27 button.PerformClick();
28 }
29 }
30
31 }
由於工作流運行時是多線程的,故這裡使用了委托。
總結:這個自動測試非常方便。你可以很方便的擴展,具體見代碼。如果你有什麼不明白的地方,歡迎給我留言,我會及時回復你的。
代碼:http://files.cnblogs.com/zhuqil/TestflowFramework.rar