Web 應用程序日漸復雜,對它們的測試工作也變得越來越重要。有很多測試技術可供你選擇使用。例如,在 2005 年 4 月份的 MSDN 雜志中,我描述了一個基于 JScript 的簡單系統,它使用 IE 的文檔對象模型(Internet Explorer Document Model)來完整地測試某個 Web 應用程序的用戶界面。這個技術很有效,但是在幾個方面存在著缺陷。我的一些同事問我是否能使用 .Net 框架編寫功能更強,但仍然是輕量級的 Web 應用程序用戶界面自動化測試程序。在這個月的專欄文章中,我將向你們展示怎樣達到這個目的。這個低層技術要求直接調用 fmshtml.dll 和 shdocvw.dll 動態鏈接庫來訪問和操縱 IE 瀏覽器客戶區中的 HTML 對象。
讓我們從一個屏幕截圖開始,如圖1所示。圖1表明我正在測試一個虛構的 Web 應用程序,它搜索一個雇員信息數據倉庫。用戶能通過雇員的姓和名進行搜索。應用程序顯示雇員的姓、名,如果大小寫都匹配,那么顯示相應的生日。通過手工測試這個 Web 應用程序的用戶界面是非常沉悶的、低效的,并且可能錯誤百出。更好的一種方法是通過測試自動化。該自動化啟動一個IE實例,裝載正在進行的測試,操縱應用程序,并檢查應用程序的正確性狀態。
圖1 測試執行例子
當然,一個實際的 Web 應用程序肯定比這更加復雜,但是我向你們展示的技術能夠用來測試基于 IE 的 Web 應用程序。在接下來的一節中,我將簡要介紹正進行測試的 Web 應用程序,這樣你就能理解我在測什么和怎么測。我也會詳細解釋產生圖1的測試場景代碼,也會描述怎樣改編和擴展這里描述的技術。
被測試的 Web 應用程序
我的 Web 應用程序,WebForm1.aspx,是一個ASP.NET程序,但是本專欄描述的技術能夠應用于任何類型的 Web 應用程序中。我的程序包括:兩個單選按鈕控件來告訴應用程序的控制邏輯要搜索的是哪一種字段;一個文字輸入控件來接受用戶的搜索項;一個按鈕控件來啟動搜索;以及一個文本區,用來顯示結果。在文本區的下方,有一個標志欄,它顯示“搜索完成”,它的初始狀態是隱藏。我這里闡述的技術的兩個優點是:我不用對該Web應用程序進行插裝,也不需要接觸應用程序的源代碼。但是,我需要知道Web應用程序中各種HTML元素的ID號,通過View/Source,我能輕易做到這一點(不過要求ID必須是靜態的,不能是動態的)。例如,按鈕控件有ID號“Button1”,而“Last Name單選按鈕”控件有ID號“RadioButtonList1_0”。當然,如果你能夠接觸程序的源代碼,你肯定已經有了這些控件的ID信息。
我使用Visual Studio.NET來創建這個用來測試的虛構的Web應用程序。從Visual Studio.NET的設計角度來看,我添加了三個標簽控件、一個單選按鈕、一個文本區、一個按鈕控件和一個列表框控件。為簡化起見,我使用了控件的默認名稱“Label1”、“TetBox1”等。相關代碼列在圖2中。我聲明了一個Employee類和一個ArrayList對象來存放Employee對象。在方法Page_Load中,我向ArrayList中增加了虛構的雇員數據。在實際的應用程序中,你的數據可能來自于SQL Server數據庫或XML文件。但就用戶界面測試自動化來說,數據來自哪里是無關緊要的。
圖2
Figure 2 Code for Web Application Under Test
public class WebForm1 : System.Web.UI.Page { ... // controls declared here public class Employee { public string last; public string first; public string dob; public Employee(string last, string first, string dob) { this.last = last; this.first = first; this.dob = dob; } } private ArrayList al = new System.Collections.ArrayList(); private void Page_Load(object sender, System.EventArgs e) { Employee e1 = new Employee("Adams","Terry","01/01/1971"); Employee e2 = new Employee("Burke","Brian","02/02/1972"); Employee e3 = new Employee("Ciccu","Alice","03/03/1973"); al.Add(e1); al.Add(e2); al.Add(e3); Label3.Visible = false; } ... // Web Form Designer generated code private void Button1_Click(object sender, System.EventArgs e) { ListBox1.Items.Clear(); string filter = TextBox1.Text; if (RadioButtonList1.SelectedValue == "Last Name") { foreach (Employee emp in al) { if (emp.last.IndexOf(filter) >= 0) ListBox1.Items.Add( emp.last + ", " + emp.first + ", " + emp.dob); } } else if (RadioButtonList1.SelectedValue == "First Name") { foreach (Employee emp in al) { if (emp.first.IndexOf(filter) >= 0) ListBox1.Items.Add( emp.last + ", " + emp.first + ", " + emp.dob); } } Label3.Visible = true; } |
方法Button1_Click中清空列表框控件,從文本框控件中獲取過濾子串,檢查單選按鈕以便確定是搜索姓還是搜索名,在內存數據中搜索相匹配的,并把匹配的雇員信息顯示出來。我得強調一下,為了使應用程序例子簡單,我在這里可能用了一些不好的編碼技術。這與你可能遇到的某種情況非常類似——你所處理的應用程序是發布前的,代碼可能并沒有經過優化。我的Web應用程序顯然是虛構的,但是通過用戶界面來測試任何Web應用程序的基本要素是應用程序隨著每一個HTTP請求-應答對的狀態轉換。換句話說,就算你打算測的Web應用程序要求訪問SQL Server數據庫或者進行了非常復雜的處理,它只是一種狀態轉換,并且這種轉換會在HTTP應答和用戶界面中顯示出來。
原文轉自:http://www.anti-gravitydesign.com