搭建 WPF 上的 UI 自動化測試框架

weixin_34304013發表於2012-02-14

簡要說明


    OEA 1.0-2.0 框架中,介面都是以 WPF 技術作為基礎平臺開發的。我們需要對開發出來的系統進行自動化測試,而 .NET 平臺的自動化測試平臺在公司內部還沒有其它部門完成,所以我們在 2010 年的時候使用 Ruby + VS UIUnitTest 開發了一個 UI 自動化(UI Automation,以下簡稱為UIA)框架,估且稱其為 UIA 1.0。UIA 1.0 完全由周金根搭建,相關的內容,大家可以參考他寫的這幾篇文章:

使用VS2010的CodedUI來做自己的自動化測試框架

IronRuby - 編寫自動化測試指令碼

資訊系統開發平臺OpenExpressApp:【OpenTest】 之 如何實現自動化測試框架

該測試平臺已經實現了由測試人員編寫易讀的 UI 自動化測試程式碼以完成日常的自動化測試需求,已經比較易用。部門用了大概1年左右,隨著時間的推移,也顯露了它的一些的不足:

  1. 除錯困難,維護成本大,難以新增新的 UIA 支援。
  2. 過程式的程式碼,不結構化。
  3. 測試人員開發不易,不支援編譯期檢查錯誤,重複程式碼過多。
  4. 一些語句效能較低。
    例如,許多類似於:"頁籤.頁籤.按鈕"的程式碼,導致多次查詢、進入頁籤,效能較低。
  5. 不支援客戶化。
  6. 測試環境部署困難。
    只有一臺測試伺服器搭建了該環境,開發人員不能使用 UIA 來輔助自己進行自測。

鑑於以上缺點,11年10月份我們決定使用 .NET 環境來搭建整個 UIA 框架,而不再使用 Ruby,同時儘量相容測試人員編寫的歷史程式碼以及 API 風格。

 

使用演示


    接下來,簡單以我們目前的一個模組來說明一下 OEA 中的 UIA 是如何使用的。

測試人員會在 UIA 相應的工程中加入某個模組的 UIA 測試類,例如下圖中的 PBS模板.cs 就是這個模組對應的測試:

image

其對應的程式碼如下:

 

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:

image

之前程式碼對應的軟體執行時介面:

image

 

UIA 框架結構及相關重點


     在整個 OEA 框架中,UIA 框架是一個重要的組成部分。目前只是實現了 WPF 客戶端的 UIA,Web 的 UIA 將會在需要時新增:

image image

OEA-UIA 的設計主要是基於 VS CodedUITest 中的核心類庫,進行二次封裝,提供更方便 OEA、更方便測試人員的的許多介面。引入如下類庫:

image

其中的程式碼也不復雜,主要是在 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 已經開發了個大概,藉著寫月度反思的機會,就把這篇文件寫了寫。歡迎交流。 :)

相關文章