在本月的專欄中,我將為您介紹如何使用新的 Microsoft UI 自動化庫(包含在 .NET Framework 3.0 中,是 Windows Presentation Foundation (WPF) 的一部分)開始進行 UI 測試自動化。您可以將其看作是 Microsoft Active Aclearcase/" target="_blank" >ccessibility (MSAA) 庫的后繼產品,后者最初設計用于可訪問性功能,但同時發現它對 UI 自動化很有用也很適合。另一方面,UI 自動化庫從一開始就是為可訪問性和 UI 測試自動化任務而專門設計的。您可以使用 UI 自動化庫來測試運行支持 .NET Framework 3.0 的操作系統(例如 Windows XP、Windows Vista®、Windows Server® 2003 和 Windows Server 2008)的主機上的 Win32 應用程序、.NET Windows 窗體應用程序和 WPF 應用程序。
言歸正傳,我認為 UI 自動化庫的開發是迄今為止測試自動化領域中最重大的一項進步,并將迅速成為 Windows 應用程序 UI 測試自動化方面最常用的技術。與其他用于 UI 自動化的可選方法相比,UI 自動化庫功能更強大、往往更易于使用并且更加一致。就像 .NET Framework 改變了軟件應用程序開發一樣,我認為 UI 自動化庫極有可能會徹底改變 UI 測試自動化。
向您闡述我的觀點的一個好方法是通過屏幕快照。圖 1 顯示的是我將要測試的一個簡單的 Windows 應用程序。該應用程序被稱為 StatCalc,它可以計算一組整數的算術平均數、幾何平均數或調和平均數。算術平均數只是簡單的平均。例如,30 英寸和 60 英寸的算術平均數是 45 英寸。幾何平均數用于比例。例如,30:1 和 60:1 的幾何平均數是 42.4264:1。調和平均數用于比率。例如,在超過某一固定距離時 30 英里/小時和 60 英里/小時的平均數為 40 英里/小時。
圖 1 UI 測試自動化中的示例應用程序)
圖 1 中所示的 UI測試自動化是一個控制臺應用程序,它可以啟動所測試的應用程序,使用 UI 自動化庫獲取對應用程序中的應用程序控件和用戶控件的引用,模擬用戶輸入 30 和 60,以及模擬單擊“Calculate”(計算)按鈕控件。然后測試自動化通過檢查結果 TextBox 控件是否為預期值來查看應用程序的最終狀態,并在隨后輸出“通過”或“失敗”結果。我在測試自動化關閉所測試的應用程序之前捕獲屏幕快照。
在本專欄的其余部分中,我將簡要介紹所測試的 StatCalc Windows 應用程序,并將說明如何啟動所測試的應用程序;如何使用 UI 自動化庫獲得對應用程序控件和用戶控件的引用;以及如何模擬用戶操作和查看應用程序狀態。我還將為您介紹如何擴展和修改此處介紹的測試系統以滿足您的自身需求。我相信您會發現能夠使用此新的 UI 自動化庫對您的測試工具集是一個很好的補充。
了解 StatCalc
讓我們簡要了解一下所測試的應用程序,從而使您了解測試自動化的目標。您還將了解為什么說在編寫 UI 測試自動化時能夠訪問應用程序源代碼很有用,而又不是絕對必要的。
StatCalc 應用程序是一個簡單的基于 Windows 的窗體。我使用 C# 為應用程序編寫代碼,不過 UI 自動化庫也可以與 Win32 應用程序和 WPF 應用程序配合工作。為了簡單起見,我接受 Visual Studio® 的默認控件名稱,包括 Form1、label1、textBox1、groupBox1、radioButton1、radioButton2、radioButton3、 button1 和 textBox2。我使用 MenuStrip 控件(在 .NET Framework 2.0 及更高版本中提供),而非早期的 MainMenu 控件,增加了頂層菜單項:“File”(文件)和“Help”(幫助)。StatCalc 應用程序的功能包含在 button1_Click 方法中,如Figure 2 所示。
Figure 2 StatCalc 應用程序代碼
private void button1_Click(object sender, EventArgs e) {
string[] sVals = textBox1.Text.Split(' ');
int[] iVals = new int[sVals.Length];
for (int i = 0; i < iVals.Length; ++i)
iVals[i] = int.Parse(sVals[i]);
if (radioButton1.Checked) {
double sum = 0.0;
foreach (int v in iVals)
sum += v;
double result = (double)(sum / iVals.Length);
textBox2.Text = result.ToString("F4");
}