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

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

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

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

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

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

  4. 檢查計算結(jié)果是否正確

  要求:

  1. 整個流程的執(zhí)行在4秒以內(nèi)完成

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

  3. 能夠穩(wěn)定執(zhí)行,若非產(chǎn)品本身的確有bug,該序列不允許失敗

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

  對于剛?cè)肼毜腟DET來說,其實現(xiàn)難度已經(jīng)足夠大得讓其寧愿去寫一個calc.exe程序本身。無論是學(xué)校的教學(xué)還是課外的研究,針對UI自動化的資料幾乎是零。上訴功能和需求,需要工程師結(jié)合已知的知識和技能,研究出解決問題的佳辦法。

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

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

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

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

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

  3. 鍛煉在壓力環(huán)境下解決實際問題的能力, 比如深入分析COM/DCOM,研究UI Automation Framework的底層實現(xiàn)來解決技術(shù)上的細節(jié)問題。

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

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

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

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