我們以一個簡單的 Windows Form 應用程序為例(在 Visual Studio 2005 Team System 下演示,其它版本亦可參考)。 ,這是一個一元二次方程的求解程序。
在 Visual Studio 2005 中加載這個程序的工程,切換到待測試窗體(Form1)的源代碼視圖。添加一個用戶界面測試最簡單的方法是在事件函數聲明代碼上右擊鼠標,在快捷菜單中點擊“Create Unit Tests”。在彈出的對話框中點選待測試的函數(特別是事件函數),確定。當然,手工添加一個單元測試項目也是可以的,但通過快捷菜單自動生成的代碼中包含了一些測試輔助類和對象的聲明,使用起來更加方便。
本例中,我們由 btnWorkOut_Click 創建單元測試,自動生成的代碼如下:
[DeploymentItem("XandY.exe")]
[TestMethod()]
public void btnWorkOut_ClickTest()
{
Form1 target = new Form1();
MyTestProject.XandY_Form1Accessor accessor = new MyTestProject.XandY_Form1Accessor(target);
object sender = null; // TODO: Initialize to an appropriate value
EventArgs e = null; // TODO: Initialize to an appropriate value
accessor.btnWorkOut_Click(sender, e);
Assert.Inconclusive("A method that does not return a value cannot be verified.");
}
熟悉單元測試的朋友應該明白 [TestMethod()] 屬性的含義。在這個測試函數中,target 是待測試窗體的一個實例。sender 和 e 是各個事件函數必備的參數,一般情況下取 null 即可。最重要的是 accessor 對象,它是我們進行用戶界面自動化測試的“總代理”。通過它可以訪問到待測試窗體的各個方法、屬性和控件,并可調用控件已聲明的各個事件。由此,我們可以用 accessor 模擬使用者通過鍵盤、鼠標對用戶界面的各項操作,同時即時獲知程序中各個變量的狀態。有興趣的朋友可以讀讀 XandY_Form1Accessor 類的定義,了解這個“總代理”工作的奧秘。
我們對測試代碼進行以下修改,以便對程序運行的正確性進行測試。
[DeploymentItem("XandY.exe")]
[TestMethod()]
public void btnWorkOut_ClickTest()
{
Form1 target = new Form1();
MyTestProject.XandY_Form1Accessor accessor = new MyTestProject.XandY_Form1Accessor(target);
object sender = null; // TODO: Initialize to an appropriate value
EventArgs e = null; // TODO: Initialize to an appropriate value
target.Show();
target.Refresh();
System.Threading.Thread.Sleep(1000);
accessor.textBox1.Text = "2";
accessor.textBox2.Text = "4";
accessor.textBox3.Text = "2";
target.Refresh();
System.Threading.Thread.Sleep(1000);
accessor.btnWorkOut_Click(sender, e);
target.Refresh();
Assert.IsTrue(accessor.d >= 0);
Assert.IsNotNull(accessor.xx);
Assert.IsNotNull(accessor.xy);
Console.WriteLine("X1 = " + accessor.textBox4.Text);
Console.WriteLine("X2 = " + accessor.textBox5.Text);
System.Threading.Thread.Sleep(1000);
target.Close();
}
以上代碼中,我們通過 target.Show() 呈現窗體,通過 target.Refresh() 可以即時地刷新窗體內容在屏幕的顯示,通過 System.Threading.Thread.Sleep(1000) 來延時。這幾段代碼都不是必需的,加入它們是為了便于程序反應和測試者觀察,我們也完全可以在不顯示用戶界面的情況下更快地運行自動測試。至于用 Assert 來監控變量狀態和用 Console 做輸出,用過單元測試的朋友都應該了解。
此時,我們運行這個測試,就會在屏幕上先后看到窗體被加載,三個文本框被填入數據,計算結果出現在下面的文本框中,最后窗體被關閉。
再來看看測試結果的輸出,符合我們的預期。
Visual Studio 2005 的用戶界面自動化測試就是這么簡單。對于一般的測試,它使測試人員不必深究應用程序底層的實現。當然,對于本例這樣簡單的程序,我們用不著這么麻煩的測試,但是對于用戶界面更加復雜的程序,操作上存在更多的組合方式,手工測試的繁瑣程度以及查找問題的難度便大大上升了。使用 Visual Studio 2005 提供的自動化測試手段將在很大程度上減輕測試人員的負擔。有興趣的朋友甚至可以在這個基礎上進行二次開發,引入自動化測試腳本等專業測試方案,實現通用性更強的用戶界面自動化測試。
延伸閱讀
文章來源于領測軟件測試網 http://www.anti-gravitydesign.com/