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


簡要說明


    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 已經開發了個大概,借着寫月度反思的機會,就把這篇文檔寫了寫。歡迎交流。 :)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM