Google推出iOS功能性UI測試框架EarlGrey
2016-02-19 15:48:20 來源:張龍 評論:0 點擊:
經過了一段時間的醞釀后,Google很高興地宣布了EarlGrey,一款針對于iOS的功能性UI測試框架。諸如YouTube、Google Calendar、Google Photos、Google Translate、Google Play Music等多款Google應用都成功地采用了EarlGrey框架來滿足其功能性測試之所需。
EarlGrey所提供的主要特性如下所示,這些特性使得應用的測試變得更加輕松,也更具效率:
- 強大的內建同步機制:測試會在與UI進行交互前自動等待動畫、網絡請求等事件。這樣,我們就可以更加輕松地編寫測試了(無需睡眠,也不必再等待了),同時維護起來也更加容易(非常直觀,整個測試看起來就是一系列描述而已)。一般來說,你無需考慮同步性,因為EarlGrey會自動同步UI、網絡請求、主Dispatch Queue以及主NSOperationQueue。為了支持在下一個UI交互發生前需要等待某個事件出現這種場景,EarlGrey提供了Synchronization APIs,你可以通過他們來控制EarlGrey的同步行為。你可以使用這些APIs來增強測試的穩定性。
- 可見性檢測:所有的交互都發生在用戶可以看到的元素上。比如說,嘗試輕拍圖片后面的按鈕會導致測試立刻失敗。EarlGrey使用了屏幕截圖區分比較(也叫做“screenshot diffs”)在與UI元素交互前確定其可見性。這樣,你就可以確定對于EarlGrey與之交互的UI,用戶可以看到并且也能與之交互。值得注意的是,進程外(即系統生成的)警告視圖與其他會遮蓋住UI的模態對話框會對這個過程產生干擾。
- 靈活的設計:用于確定元素選擇、交互、斷言與同步的組件在設計上就是可擴展的。輕拍與滑動是通過應用級的觸摸事件來實現的,而不是使用元素級的事件處理器。在每一次UI交互前,EarlGrey都會斷言交互的元素是可見的,而不僅僅是存在于視圖層次體系中就行了。EarlGrey的UI交互模擬了真實用戶與應用UI交互的方式,可以幫助你找到并修復用戶在使用應用時所遇到的同樣的Bug。
EarlGrey是個原生iOS UI自動化測試框架,可以幫助你編寫出更加清晰、簡明的測試。借助于EarlGrey框架,你可以使用增強的同步特性。EarlGrey會自動與UI、網絡請求及各種查詢保持同步,同時在必要的情況下,你還可以手工實現自定義的定時器。EarlGrey的同步特性可以確保在執行動作前,UI會處于一種穩定的狀態。這極大地增強了測試穩定性,使得測試變得高度可重復。EarlGrey與XCTest框架協同工作,并且集成到了Xcode的Test Navigator中,這樣你就可以直接在Xcode中或是在命令行中(使用xcodebuild)運行測試了。
EarlGrey的用戶文檔位于EarlGrey/docs目錄下。要想上手,請先查看一下EarlGrey的特性,看看其向后兼容性,然后通過測試目標來安裝/運行EarlGrey。配置完畢后,請查看一下EarlGrey API,然后開始編寫自己的測試。
下面來介紹一下如何安裝EarlGrey,以及如何創建并運行第一個測試。
要想正常使用EarlGrey,請確保被測試的應用滿足如下需求:
- 正確的啟動界面圖片可以在所有支持的設備上出現(參見iOS Developer Library,Launch Files)。
- 主UIApplicationDelegate實現了(UIWindow *)window屬性(參見UIKit Framework Reference,window屬性)。
最后,請確保在測試目標上啟動斷言(即不要設置NS_BLOCK_ASSERTIONS)??梢酝ㄟ^兩種方式將EarlGrey添加到Xcode項目中:使用CocoaPods,或是以框架的形式。
Cocoapods安裝
對于EarlGrey來說,我們強烈推薦使用CocoaPods進行安裝,這也是我們認為的最佳方式。
第1步:創建一個測試目標。
EarlGrey需要一個測試目標。由于EarlGrey修改了測試目標的Scheme與Build階段,因此我們建議你為添加EarlGrey測試創建一個單獨的測試目標。如果還沒有創建,那么可以在Xcode的Project Navigator中選中項目,然后單擊菜單中的Editor > Add Target...。
在Add Target窗口中,選擇iOS -> Test -> iOS Unit Testing Bundle:
由于EarlGrey使用了Schemes,因此測試目標必須要有一個與之關聯的Scheme。如果該Scheme是共享的就更好了。如果測試目標沒有Scheme,那么請轉向Manage Schemes,單擊+按鈕,然后從下拉菜單中選擇目標。選擇Shared選項,然后將Container設為待測試的應用。
值得注意的是,如果之前創建過Schemes,那么你需要運行一次才能讓pod安裝命令將其選中。如果在運行pod install之后,測試目標沒有包含對Scheme與Build階段的改變,那么請再次運行pod install。
第2步:添加EarlGrey并作為框架依賴
創建好測試目標后(比如說AppFunctionalTests),現在就需要將EarlGrey作為框架依賴添加進來了。要想做到這一點,請將EarlGrey作為測試依賴添加到Podfile中。由于EarlGrey必須要放在待測試的應用中,我們需要對測試目標的Build Phases與Scheme進行一些修改。將configure_earlgrey_pods.rb文件添加到項目目錄中(在這里運行pod install命令)。你需要在post_install鉤子中調用這個腳本,使用項目名、測試目標名與xcscheme文件名。
第3步:運行pod install命令
當成功運行了pod install命令后,打開生成的工作空間,在Pods/directory中即可以找到安裝好的EarlGrey。
創建與運行第一個測試
由于EarlGrey基于XCTest,因此在Xcode中創建第一個測試就像創建一個新的單元測試用例類一樣簡單。請不要將Unit Test Case Class與UI Test Case Class搞混了。UI Test Case Class使用了添加到XCTest中的新的UI Testing特性,它與EarlGrey并不兼容。
@import EarlGrey#import@interface MyFirstEarlGreyTest : XCTestCase@end@implementation MyFirstEarlGreyTest- (void)testPresenceOfKeyWindow { [[EarlGrey selectElementWithMatcher:grey_keyWindow()] assertWithMatcher:grey_sufficientlyVisible()];}@end
- Cmd+Click應用源文件所在的目錄,然后選擇New file...。這時會彈出一個對話框。
- 在彈出的對話框中選擇Unit Test Case Class,然后單擊Next。在下一個界面中,輸入測試用例的名字。對于該示例來說,我們輸入MyFirstEarlGreyTest。
- 在下一個界面中,請確保測試與Unit Test目標關聯起來。對于該示例來說,目標就是SimpleAppTests。
- Xcode會為我們創建一個新的測試用例,不過這個用例我們用不上。我們來修改其代碼,只留下一個測試方法,并包含進EarlGrey框架。
- 現在來添加一個簡單的EarlGrey斷言,檢查一個key window是否存在,并斷言它會顯示出來。下面就是最終的測試代碼:
- 就是這些了!就像其他單元測試一樣,該測試會顯示在測試導航器中,因此可以單擊run圖標或是Cmd+clicking測試名,然后選擇Test “testPresenceOfKeyWindow”來運行測試。由于這是個常規的單元測試,因此可以在測試與應用代碼中打斷點,也可以無縫使用內建工具。
想要試一下EarlGrey么?EarlGrey目前已經開源,并且基于Apache許可。感興趣的讀者可以看看這份上手指南,然后通過CocoaPods或是手工的方式將EarlGrey添加到Xcode的項目文件中。
相關熱詞搜索:earlgrey ios functional ui test 語言 & 開發 iOS 測試 操作系統 移動
