作為最流行的手機(jī)系統(tǒng)之一,Apple一直重視自動化測試。在instrument中包含Automation Test工具,但因?yàn)橹恢С諮avascript,普及率不高。iOS 9后針對OC和Swift又新增了UI Test模塊,只支持iOS 9以上,所以暫時用的不會太多。一些第三方自動化測試框架則比較成熟,如Appium, MonkeyTalk,F(xiàn)rank等,這里介紹KIF和EarlGrey,原因:
- 開源
- 內(nèi)嵌式框架 (以 framework 形式內(nèi)嵌至應(yīng)用中) , 本質(zhì)上是iOS的Unit test
- 使用Object-C和Swift
- 支持真機(jī)和模擬器
EarlGrey
兼容: iOS 8以上
特點(diǎn)
- 同步
自動同步UI,網(wǎng)絡(luò)請求,main Dispatch Queue和main NSOperationQueue,保證下一個UI交互只在空閑時發(fā)生,也支持對同步的管理。 - 可見性檢查
保證交互只發(fā)生在用戶可以看到和操作的對象上。(線程外的模態(tài)對話框會干擾操作) - 像用戶一樣操作
區(qū)別于其它自動化測試框架,操作觸發(fā)app-level事件而不是element-level事件,動作會真實(shí)的表現(xiàn)在界面上。
官方的安裝和使用教程都很詳細(xì),主要看GitHub上的文檔:EarlGrey in GitHub
KIF
兼容: iOS 5.1以上
特點(diǎn)
- 最小化迂回時間
繼承KIFTestCase,測試代碼都是使用OC編寫,最大程度減少了中間層。 - 配置簡單
直接集成到XCode上,不需要安裝多余的包。 - 版本覆蓋廣
支持iOS 5.1以上。 - 像用戶一樣測試
測試代碼模仿用戶操作,代碼很簡單。 - 自動集成XCode 5以上的測試工具
在XCode上使用就像使用蘋果原生的測試框架一樣,支持XCode的各種測試工具。
因?yàn)镵IF出的較早,很多特性在當(dāng)時都是很大的亮點(diǎn),后來的框架有很多都是在向它學(xué)習(xí)。
GitHub上的文檔比較簡單,這里推薦它的API文檔:KIF Doc
EarlGrey Vs KIF
EarlGrey和KIF算是比較像的兩個框架,但也存在一些區(qū)別,了解它們的區(qū)別有利于做出適合自己的選擇。
-
EarlGrey寫法多樣,操作靈活;KIF比較簡單,適合快速開發(fā)
比如點(diǎn)擊登錄按鈕, KIF:
[self tapViewWithAccessibilityLabel:@"登錄"];
EarlGrey中找元素和操作元素分開,所以
[[EarlGrey selectElementWithMatcher:grey_accessibilityID(kAccessibilityId_EnterLoginBtn)]
performAction:grey_tap()]
如果位于scrollview中, EarlGrey還需要考慮滑動搜索:
[[[EarlGrey selectElementWithMatcher:grey_allOf(grey_accessibilityID(kAccessibilityId_EnterLoginBtn), grey_sufficientlyVisible(), nil)]
usingSearchAction:grey_scrollInDirection(kGREYDirectionDown, kMoveAmount) onElementWithMatcher:grey_accessibilityID(kAccessibilityId_LoginScrollView) ]
performAction:grey_typeText([NSNumber numberWithFloat:goodsPrice].stringValue)];
雖然代碼相對復(fù)雜,但EarlGrey的好處在于,分離之后操作變得多樣,可以有Matcher+Action, Matcher+Assert, Matcher+Action+Error等多種組合,錯誤更容易被發(fā)現(xiàn)。
比如檢查登錄按鈕,
NSError *error = nil;
[[EarlGrey selectElementWithMatcher:grey_accessibilityID(kAccessibilityId_EnterLoginBtn)]
assertWithMatcher:grey_sufficientlyVisible() error:&error];
另外,被error捕獲的操作不會使測試結(jié)束。
-
EarlGrey支持同步;KIF需要手動等待
由于EarlGrey采用了同步機(jī)制,所以保證了下一個操作的執(zhí)行;對需要等待的操作,KIF需要手動添加等待事件,如:
[tester waitForAnimationsToFinish]
KIF中用于等待的方法很多,具體參看 KIFUITestActor Doc
-
EarlGrey建議使用AccessibiltyIdentifier;KIF使用AccessiblityLable
兩個框架都是利用Accessibility來找元素,EarlGrey中建議使用AccessibiltyIdentifier,而KIF中大部分的API只支持AccessiblityLable,所以如果使用的是KIF,就只能去修改控件的AccessiblityLable。
-
EarlGrey支持拍照,可以存在任何地方;KIF失敗自動拍照,只能存在固定地方。
EarlGrey使用,
[GREYScreenshotUtil takeScreenshot]
返回UIImage對象,可以存到任何地方包括相冊。
KIF測試失敗會自動拍照保存,不過需要事先指定存儲路徑。
方法:
1.打開Edit Scheme->Test->Arguments
2.添加Enviroment Variables,名字是KIF_SCREENSHOTS,內(nèi)容為指定的存儲路徑。對于真機(jī),必須先獲取應(yīng)用的路徑然后指定一個位置在KIF_SCREENSHOTS中寫死。
總結(jié)
KIF的語法比較簡單,適合快速開發(fā),網(wǎng)上相關(guān)的資料也比較多;但是,作為后來者的EarlGrey功能更加強(qiáng)大,作為一個程序員,我更傾向于使用EarlGrey。