Google推出iOS功能性UI測試框架EarlGrey

jopen 8年前發布 | 16K 次閱讀 iOS開發

經過了一段時間的醞釀后,Google很高興地宣布了 EarlGrey ,一款針對于iOS的功能性UI測試框架。諸如油Tube、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


  
  1. Cmd+Click應用源文件所在的目錄,然后選擇New file...。這時會彈出一個對話框。
  2. 在彈出的對話框中選擇Unit Test Case Class,然后單擊Next。在下一個界面中,輸入測試用例的名字。對于該示例來說,我們輸入MyFirstEarlGreyTest。
  3. 在下一個界面中,請確保測試與Unit Test目標關聯起來。對于該示例來說,目標就是SimpleAppTests。
  4. Xcode會為我們創建一個新的測試用例,不過這個用例我們用不上。我們來修改其代碼,只留下一個測試方法,并包含進EarlGrey框架。
  5. 現在來添加一個簡單的EarlGrey斷言,檢查一個key window是否存在,并斷言它會顯示出來。下面就是最終的測試代碼:
  6. 就是這些了!就像其他單元測試一樣,該測試會顯示在測試導航器中,因此可以單擊run圖標或是Cmd+clicking測試名,然后選擇Test “testPresenceOfKeyWindow”來運行測試。由于這是個常規的單元測試,因此可以在測試與應用代碼中打斷點,也可以無縫使用內建工具。

想要試一下EarlGrey么?EarlGrey目前已經開源,并且基于Apache許可。感興趣的讀者可以看看這份 上手指南 ,然后通過 CocoaPods 或是手工的方式將EarlGrey添加到Xcode的項目文件中。

來自: http://www.infoq.com/cn/news/2016/02/earlgrey-ios-functional-ui-test

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!