本文展示如何利用 WF 4.0 打造一個自動化測試框架。透過設計工作流來定義測試步驟——如點擊按鈕、輸入文字、驗證結果——讓工作流引擎扮演「測試使用者」自動執行測試案例。框架採用活動庫方式封裝 UI 操作,極易擴充新的測試動作。
一個簡單的 WinForms 表單,包含兩個輸入框、一個計算按鈕與結果顯示區:

public partial class MainForm : Form
{
public MainForm() { InitializeComponent(); }
private void btnAdd_Click(object sender, EventArgs e)
{
try
{
int a = int.Parse(txt1.Text);
int b = int.Parse(txt2.Text);
int c = a + b;
txt3.Text = c.ToString();
}
catch { txt3.Text = ""; }
}
}
Test1 流程圖。DisplayName 讓流程更易讀。流程圖示意:

活動屬性設定範例:





正常情況下,輸出視窗顯示「程式正確」:

若將計算邏輯註解掉(製造 Bug),流程會輸出「程式有 bug」:


StartFlow:啟動工作流宿主。WindowsControlActivity:基底活動,持有 FormType 參數。ClickButtonActivity、SetTextActivity、GetTextActivity、VerifyActivity 等衍生活動封裝具體 UI 操作。public class WindowsControlActivity : CodeActivity
{
public delegate void SetControlValueCallback(Control oControl);
[RequiredArgument]
public InArgument<string> FormType { get; set; }
protected override void Execute(CodeActivityContext context)
{
// 取得表單實例邏輯(透過擴充服務)
}
}
public sealed class ClickButtonActivity : WindowsControlActivity
{
[RequiredArgument]
public InArgument<string> ButtonName { get; set; }
protected override void Execute(CodeActivityContext context)
{
var ext = context.GetExtension<StartFlow.Extensions>();
Form frm = ext.GetForm(FormType.Get(context));
Button btn = ext.GetControl(frm, ButtonName.Get(context)) as Button;
SetControlPropertyValue(btn);
}
private void SetControlPropertyValue(Control oControl)
{
if (oControl.InvokeRequired)
{
var d = new SetControlValueCallback(SetControlPropertyValue);
oControl.Invoke(d, new object[] { oControl });
}
else
{
(oControl as Button).PerformClick();
}
}
}
註:因工作流執行緒與 UI 執行緒不同,必須使用 Invoke 封送呼叫。
此框架展現 WF 4.0 在自動化測試領域的優勢:測試邏輯可視化、步驟可重用、擴充性極高。測試人員只需拖拉拽即可組合新測試案例,大幅降低腳本維護成本。