測試一個 Gui-heavy WPF 應用程序
我們(我的同事)有一個凌亂的 12 歲成熟的基於 GUI 的應用程序,目前的計劃是在 WPF 中添加新的對話框和其他 GUI,以及替換 WPF 中的一些舊對話框。同時,我們希望能夠以可維護的方式測試 Monster - GUI 自動化。一些挑戰:
- 應用程序是巨大的。
- 它不斷獲得新功能。
- 它正在改變(錯誤修復,更新檔)。
- 它有一個後端,中間有一層。如果你把它打死,它的狀態可能會失控。
我們想要的是:
- 一些可以自動測試 WPF 的工具。
- 自動發現對話框的輸入和輸出是什麼。如果您添加一個什麼都不做的標籤,舊的測試應該仍然有效。但是,如果您刪除必要的文本欄位,它應該會失敗。如果測試套件易於維護,如果它執行並且大部分時間沒有中斷,那將是非常好的。
- 創建每個新對話框時都應考慮到可測試性。
在這一點上,我並不確切知道我想要什麼,所以我將其標記為社區 wiki。如果不得不測試一個巨大的基於 GUI 的應用程序敲響了警鐘(即使不是在 WPF 中),那麼請在這里分享您的好、壞和醜陋的體驗。
好的,你的應用聽起來很大!我可以圍繞我們最近設計的一個應用程序分享我的經驗;它是一個與伺服器對話的 GUI,該伺服器又與多個數據庫和其他 Web 服務聯繫。客戶群大約有 15,000 名使用者……無論哪種方式 - 無論您如何處理,這都是很多工作;好處是它可以幫助你在每次發佈時不會咬掉你的指甲!
MVVM
一般來說,我也會推薦 MVVM 模式,並在沒有 GUI 的情況下進行盡可能多的測試。GUI 測試簡直太難了!我喜歡 Josh Smith 在 MSDN 上的文章:“具有模型-視圖-視圖模型設計模式的 WPF 應用程序”(<http://msdn.microsoft.com/en-us/magazine/dd419663.aspx>)
測試腳本
這個應用程序的訣竅是我們有很多東西要測試,它的核心在不斷變化,而且(奇怪的是)沒有足夠的人來完成每次迭代的測試工作。
我的解決方案是想出一個利用現有庫的自定義測試工具。我們有一個簡單的腳本引擎,可以讀取文件並執行命令。實際上,我們開發了一個DSL ( <http://en.wikipedia.org/wiki/Domain-specific_language> ) 來測試我們的特定應用程序。DSL 包括一些簡單的命令來指示它正在測試的“視窗”、任何特定的“設置”信號,然後是一系列命令,然後是斷言。它看起來像這樣:
測試 NewXyzItem 設置 Clear_items 按下 Some_button Enter_text_into Name Bobby Joe (...) 按保存 Assert_db_has_itemX SomeKey每一行的格式是
"command" "argument" [data]腳本進入目錄組,“測試執行程序”載入它們,解析它們並執行它們。隨時創建日誌和報告很有用,我被添加到用於製作螢幕截圖等的鉤子中,這很方便。如果您有興趣實施類似的事情並想幫助我,請告訴我。
這裡方便的是我們可以對測試策略進行全面更改。
編寫腳本變得非常簡單,這很重要,因為您最終會得到很多很多腳本。控制項是按名稱發現的,因此您遵循約定(例如,“名稱”可能是程式碼中的“名稱文本框”,或者“保存”可能是“保存按鈕”)。
您實際上也可以利用 NUnit 等作為您的測試執行程序。
注意 - 只需以互動方式執行測試,讓 GUI 測試與 CI 一起工作是困難且有問題的……
數據和測試
這裡的一件主要事情是數據管理是測試問題的重要組成部分,不容忽視。我們的“新鮮部署”也很長,但有些部分是外部的,我們無法控制數據的新鮮度。我們處理清理的方式是通過腳本提供掛鉤,使我們能夠在測試之前輕鬆刪除對象。不是最佳的,但很少成為問題。
圖書館
您可能會在“ White ”(<http://white.codeplex.com/> )中發現最有用的庫它可以測試一般的 Windows 應用程序——即 WPF 和 WinForms。本質上,您最終會編寫如下程式碼:
Button button = window.Get<Button>("SaveButton"); button.Click();如果您的應用程序進行非同步呼叫,您將需要製定一個策略,讓測試執行者知道非同步呼叫何時完成,可能通過狀態欄或其他方式。這取決於你如何勾引……
再次,很多工作,但它是值得的。
PK :-)