簡要說明
OEA 1.0-2.0 框架中,界面都是以 WPF 技術作為基礎平台開發的。我們需要對開發出來的系統進行自動化測試,而 .NET 平台的自動化測試平台在公司內部還沒有其它部門完成,所以我們在 2010 年的時候使用 Ruby + VS UIUnitTest 開發了一個 UI 自動化(UI Automation,以下簡稱為UIA)框架,估且稱其為 UIA 1.0。UIA 1.0 完全由周金根搭建,相關的內容,大家可以參考他寫的這幾篇文章:
《使用VS2010的CodedUI來做自己的自動化測試框架》
《信息系統開發平台OpenExpressApp:【OpenTest】 之 如何實現自動化測試框架》
該測試平台已經實現了由測試人員編寫易讀的 UI 自動化測試代碼以完成日常的自動化測試需求,已經比較易用。部門用了大概1年左右,隨着時間的推移,也顯露了它的一些的不足:
- 調試困難,維護成本大,難以添加新的 UIA 支持。
- 過程式的代碼,不結構化。
- 測試人員開發不易,不支持編譯期檢查錯誤,重復代碼過多。
- 一些語句性能較低。
例如,許多類似於:"頁簽.頁簽.按鈕"的代碼,導致多次查找、進入頁簽,性能較低。 - 不支持客戶化。
- 測試環境部署困難。
只有一台測試服務器搭建了該環境,開發人員不能使用 UIA 來輔助自己進行自測。
鑒於以上缺點,11年10月份我們決定使用 .NET 環境來搭建整個 UIA 框架,而不再使用 Ruby,同時盡量兼容測試人員編寫的歷史代碼以及 API 風格。
使用演示
接下來,簡單以我們目前的一個模塊來說明一下 OEA 中的 UIA 是如何使用的。
測試人員會在 UIA 相應的工程中加入某個模塊的 UIA 測試類,例如下圖中的 PBS模板.cs 就是這個模塊對應的測試:
其對應的代碼如下:
class PBS模板 : GIX4測試用例 { protected override void 運行() { 打開當前測試模塊("模板管理.PBS模板"); 添加(); 進入窗口("添加記錄", 添加記錄窗口 => { 屬性編輯器("編碼").輸入("AutoTest01"); 屬性編輯器("名稱").輸入("自動化測試-PBS模板"); 屬性編輯器("備注").輸入("測試模板"); 點擊按鈕("確定"); 保存(); }); //# 3 編輯PBS樹>>>>>等待對樹當前行的支持<<<<< 進入頁簽("PBS", PBS頁簽 => { 樹型操作按鈕通用測試(); 保存(); 進入頁簽("屬性", 屬性頁簽 => { 樹型操作按鈕通用測試(); 保存(); 進入頁簽("可選值", 可選值頁簽 => { 添加(); 列表().當前行().屬性編輯器("可選值").輸入("AutoTest"); 保存(); 復制添加(); 保存(); 按住Ctrl(); 列表().選擇行(0); 釋放Ctrl(); 刪除(); 保存(); }); }); //#6 載入標准模板窗口中各頁簽 點擊按鈕("載入標准模板"); 進入窗口("載入標准模板", 載入標准模板窗口 => { 頁簽("分部分項").單擊(); 頁簽("措施項目").單擊(); 頁簽("其它項目").單擊(); 頁簽("規費稅金").單擊(); 點擊按鈕("確定"); }); }); //#6 修改PBS模板信息 點擊按鈕("修改"); 進入窗口("修改", 修改窗口 => { 屬性編輯器("編碼").輸入("AutoTest01-1"); 屬性編輯器("名稱").輸入("自動化測試-PBS模板-1"); 屬性編輯器("備注").輸入("測試模板-1"); 點擊按鈕("確定"); }); 保存(); 刪除並確定(); } }
UIA 測試環境就是一個簡單的 WPF Applicatoin:
之前代碼對應的軟件運行時界面:
UIA 框架結構及相關重點
在整個 OEA 框架中,UIA 框架是一個重要的組成部分。目前只是實現了 WPF 客戶端的 UIA,Web 的 UIA 將會在需要時添加:
OEA-UIA 的設計主要是基於 VS CodedUITest 中的核心類庫,進行二次封裝,提供更方便 OEA、更方便測試人員的的許多接口。引入如下類庫:
其中的代碼也不復雜,主要是在 WpfControl(繼承自 UITestControl)的相關類型上添加一系列擴展方法,以下以一個按鈕的點擊為例:
public static WpfButton 按鈕(this WpfControl context, string title = null) { return context.Find<WpfButton>(title); } public static WpfControl 單擊(this WpfControl control) { control.EnsureClickable(); control.WaitForControlEnabled(); Mouse.Click(control); return control; } public static TControl Find<TControl>(this WpfControl context, string title = null) where TControl : WpfControl, new() { //if (TestContext.Current.NeedCancel) Playback.Cancel(); if (TestContext.Current.NeedCancel) throw new StopUIAException("停止自動化測試!"); var control = new TControl(); if (context != null) { control.Container = context; } if (!string.IsNullOrEmpty(title)) { control.SearchProperties[WpfControl.PropertyNames.Name] = title; } return control; }
這樣,就可以在任何一個 WpfControl 容器上使用(例如頁簽 A) A.按鈕(“添加”).單擊() 了。
這里,需要特別說明的是,其實 UIAutomationClient 以及 UIAutomationTypes 並不是 VS CodedUITest 獨有的程序集,而是 Windows 平台上的自動化框架程序集,相關的內容,可以看 MSDN 中的《MSDN - Accessibility》。基於這個框架,理論上可以做 windows 平台上所有的應用程序的自動化測試。
在我們 UIA 中,Windows Automation API 用於一些更加底層的控件查找場景。這是因為使用 VS CodedUITest 的類庫,有時候並不能找到想要的控件,同時也不能為 OEA WPF 程序做一些深度的定制。OEA 中目前現在開發的 Web 框架,也同樣會使用它來構建 UIA。
總結
其實這次重構並沒有修改 UIA 1.0 版本的整個結構,主要是修改了語言環境為 .NET 環境,使得可以更加方便地添加各種功能,以及更好地和 OEA 框架整合。
BTW: 其實 OEA-UIA 已經在去年 11 月份就完成並應用,但是由於一直在開發 OEA 在 B/S 模式下的框架,所以遲遲沒有發上來。不過最近 OEA-B/S 已經開發了個大概,借着寫月度反思的機會,就把這篇文檔寫了寫。歡迎交流。 :)