對于任何一個需要開發有持久生命力軟件的組織來說, 自動化測試顯得必不可少。 比如像Windows這樣的產品, 通常的生命周期可以長達10年以上。 試想一下, 沒有自動化測試的話, 任何一次的產品改動、升級、補丁、導致的測試成本有多大。

  之所以說自動化測試是技術, 原因在于自動化測試的技術難度, 特別是UI測試自動化。 跟軟件產品一樣, 自動化測試程序也講究性能、穩定性、可伸縮性等指標。 測試程序除了要實現目標程序一樣的功能才能夠進行結果檢驗以外, 測試程序還要實現額外的功能去觀察目標程序的行為。比如要自動化測試 “dir C:*.txt” 這個命令, 測試程序除了要實現跟dir一樣的文件讀取, 通配符展開的功能外, 還需要讀取dir命令的輸出結果才能夠進行結果的比對。同時也要支持跟dir命令一樣的靈活性和擴展性。這使得自動化測試在實現起來有可能比其測試目標的實現更加困難。而對于UI產品的自動化,實現起來牽涉到讀取GUI的圖像輸出(比如檢查是否正確彈出了MessageBox),模擬用戶的鼠標鍵盤輸入(比如模擬用戶在保存文件的時候選擇正確的保存路徑),同步測試產品和用戶的交流等等。這些技術門檻使得自動化測試成為一把雙刃劍,成敗不在于是不是去做它,而是有沒有能力把它做好。 接下來的介紹會讓你對微軟的UI測試自動化和軟件測試開發工程師(Software Development Engineer in Test以下簡稱SDET)有更深入詳細的了解。

  舉一個十分具體的UI自動化的例子:

  1. 啟動計算器程序(calc.exe)

  2. 模擬用戶進行菜單輸入,從普通模式切換到科學模式

  3. 模擬用戶計算(4+6/2)的階乘

  4. 檢查計算結果是否正確

  要求:

  1. 整個流程的執行在4秒以內完成

  2. 能夠適應于不同分辨率和語言 (不同語言的菜單項文字是不同的!)

  3. 能夠穩定執行,若非產品本身的確有bug,該序列不允許失敗

  4. 如果下一版本的calc.exe修改UI風格 (Win7中已經修改了),或者改為WPF實現,要求現有的測試代碼僅做簡單修改即可繼續使用

  對于剛入職的SDET來說,其實現難度已經足夠大得讓其寧愿去寫一個calc.exe程序本身。無論是學校的教學還是課外的研究,針對UI自動化的資料幾乎是零。上訴功能和需求,需要工程師結合已知的知識和技能,研究出解決問題的佳辦法。

  UI自動化其實是一種進程與進程之間的通信。測試程序需要跟目標程序通過某種進程通信方式來獲取目標程序的信息,包括UI元素的位置,顯示的文字內容,然后再模擬用戶的操作比如在特定位置點擊鼠標。進程之間通信方式來說,Windows平臺上有很多選擇,比如管道,TCPIP,Windows消息,共享文件,RPC等等。對于UI自動化,容易想到的解決方案是Windows消息。通過Windows消息以及跟Windows相關的API可以獲取計算器窗口,菜單和按鈕位置。但真正開始用Windows消息來實現UI自動化測試的時候,會發現Windows消息的一些不足,比如Windows消息無法用于WPF程序,無法獲取Excel或者IE里面的UI子元素。

  所以,除了Windows消息外,工程師還需要更深入地考慮其它技術。其間需要研究微軟內部的各種UI Test Framework,了解不同Framework的實現技術,優劣以及和測試目標的匹配程度。在進行不斷的摸索,嘗試,原代碼分析后,工程師才會對微軟平臺各種技術有深入的了解,整個過程是把基礎的理論知識轉換為產品相關的生產力的過程。

  UI自動化對于SDET來說有兩層含義。其一,對該技術的熟悉程序決定測試工作的質量。另外,由于UI自動化涵蓋的技術范圍和深度,使得該技術是鍛煉SDET的一個很好的平臺。微軟對工程師的技術技能要求不是限制在某一固定領域的,而是要求工程師鍛煉能夠通用的核心競爭力。比如,作為SDET,通過2年的努力,在Visual Studio的界面測試上取得了90分的成功,那么,如果該工程師愿意換一個項目做SDE(Software Development Engineer, 即軟件開發工程師)的話,比如到SQL Server開發存儲過程的圖形化設計,他在前兩年所積累的技術技能,要能夠確保他在新的項目和職位上,取得同級別的90分。而UI自動化,對于鍛煉這樣的核心競爭力是一個非常好的平臺,因為它至少包括了:

  1. 精通微軟通用的開發工具和技術, 比如C#, .NET Framework, 多線程。把開發技巧運用到實際的項目中。

  2. 熟悉Windows平臺的系統知識,比如進程間通信, Win32消息機制。站在微軟工程師的角度,通過具體的項目和代碼充分了解Windows平臺。

  3. 鍛煉在壓力環境下解決實際問題的能力, 比如深入分析COM/DCOM,研究UI Automation Framework的底層實現來解決技術上的細節問題。

  4. 熟練掌握調試技巧。UI自動化的開發過程牽涉到測試程序和目標程序,在調試的時候需要處理兩者的同步問題。同時,UI自動化的穩定性是比較難解決的問題。調試一個偶爾發生的錯誤是一個非常有挑戰性的任務。

  5. 在自動化測試的開發過程中熟悉微軟的項目流程,后,給SDET帶來的不僅僅是測試技能的飛躍,同時也讓工程師更加熟悉所測試的產品,更好地保證產品質量。

  當一個SDET經歷了UI自動化測試,武裝上了上述技能,意味著他熟知微軟平臺的開發技巧,體驗過程序開發過程中通常是如何犯錯,如何調試,工程師在怎樣的情況下容易做出錯誤的判斷和假設,那么,他能夠很輕松地破壞別人的程序,找出漏洞。這不僅僅對測試工作來說是一個很好的起點,這樣的堅實技術背景還能夠讓工程師學習和發展其它技能的時候事半功倍。換言之,自動化測試對微軟的產品來說,是保證其可以持續成功的重要技術;對于的SDET來說,是一項必不可少的重要的技能;對于剛入職的工程師來說,親身體驗和研究自動化測試,特別是UI自動化,能夠讓你實現學生生涯到職業生涯的轉變。

  在后續的文章中,我打算介紹自動化測試和手動測試的比較,看看自動化測試所達到的效果是否等同于手動測試的錄制和重復。同時,也會具體介紹UI自動化測試開發的有趣細節。