自動(dòng)化測試是什么?
自動(dòng)化測試是指在預(yù)設(shè)條件下運(yùn)行系統(tǒng)或者應(yīng)用程序,評估運(yùn)行結(jié)果,預(yù)先條件包括正常條件和異常條件。---- 摘自《百度百科》
iOS自動(dòng)化測試的目的?
在進(jìn)行版本迭代的過程,開發(fā)同學(xué)和測試同學(xué)都會app進(jìn)行測試,不管對應(yīng)的業(yè)務(wù)在該版本中有沒有發(fā)生變化,只要有新的bug 產(chǎn)生,那么在以后的發(fā)版中又會重新對該bug 進(jìn)行測試,造成了非常多的人力資源浪費(fèi),而且還不高效。
iOS 自動(dòng)化測試的框架
如果您是iOS 開發(fā),相信您一定會關(guān)注每年的WWDC 大會,蘋果自帶的XCTest 是在2015 年 WWDC 上提出來的,而且官方還給出了一個(gè)Demo。如果您感興趣,戳這里https://developer.apple.com/videos/play/wwdc2015/406/
除此之外,也有一些其他的自動(dòng)化測試框架。
- Frank
- KIF
- Calabash
- Appium
至于這些框架的簡介、優(yōu)缺點(diǎn)等等,網(wǎng)上的資源很多,這里就一筆帶過,用的比較多的是 Appium。筆者嫌棄它配置麻煩,就沒有研究,今天我們主要說說 iOS 自帶的XCTest。
添加執(zhí)行文件
在我們創(chuàng)建一個(gè)項(xiàng)目的時(shí)候,如果需要加入U(xiǎn)I Test,那么就要勾選 Inclide UI Tests 還有一個(gè)是 Inclide Unit Tests 這個(gè)是單元測試(今天暫且不說)。

0.png
如果是現(xiàn)有項(xiàng)目,那么新建一個(gè) Target 就好了。

1.png
相關(guān) API
官方API:https://developer.apple.com/documentation/xctest/xcuielementquery?preferredLanguage=occ 只要花上半天或者一天的時(shí)間就可以將這些API 看完。下面我們說一下常用的一些API。
1、- children?Matching?Type:??查詢所有的直接子代元素, 返回值是一個(gè)新的查詢
2、- descendants?Matching?Type:?? 查詢所有的后代子元素(包括子代元素),返回值是一個(gè)新的查詢
3、matching?Identifier:??根據(jù)標(biāo)識查找后代元素,返回值是一個(gè)新的查詢。使用該方法時(shí),需要在xib 或者代碼中給一個(gè)UI 的accessibilityIdentifier 賦值,否則查詢不到。
4、element 返回一個(gè)查詢的元素, 返回值是一個(gè)元素。
5、- element?Bound?By?Index:?? 根據(jù)下標(biāo)返回查詢結(jié)果中匹配的元素。
6、exists: 判斷元素是否存在。
7、hittable 判斷該元素是否能夠響應(yīng)事件。
8、Typing Text 文本輸入(一般是UITextField 或者 UITextView)
9、tap,doubleTap單擊,雙擊手勢。
10、swipe?Left,swipe?Right,swipe?Up, swipe?Down,上下左右滑動(dòng)等等。
代碼編寫
剛開始的時(shí)候,我們進(jìn)行代碼錄制。在我們的 UITests的.m 文件中,系統(tǒng)會自動(dòng)創(chuàng)建一個(gè)testExample方法。當(dāng)我們點(diǎn)擊錄制按鈕的時(shí)候, Xcode 會根據(jù)用戶的操作在testExample生產(chǎn)相對應(yīng)的代碼。

2.png
通常情況下,自動(dòng)生成的代碼是會報(bào)錯(cuò)的,因?yàn)槲覀兊陌粹o的title,cell 上的內(nèi)容等等都是中文。有兩種方式解決這個(gè)問題。
- 將對應(yīng)的編碼改成我們對應(yīng)的漢字
- 將編碼中的
\U改成\u
另外,系統(tǒng)生產(chǎn)的代碼通常情況下是很亂的,需要我們進(jìn)行過濾或者驗(yàn)證一遍,有時(shí)候甚至?xí)a(chǎn)一些錯(cuò)誤的代碼,這個(gè)時(shí)候就需要我們進(jìn)行調(diào)試和修改。這里給出一個(gè)Example。
- (void)testLogin {
for (int i = 0; i < self.names.count; i++) {
XCUIElement *textFieldUser = self.app.textFields[@"用戶名"];
[textFieldUser tap];
[self.app.buttons[@"Clear text"] tap];
[textFieldUser typeText:self.names[i]];
sleep(1);
XCUIElement *textFieldPwd = self.app.secureTextFields[@"密碼"];
[textFieldPwd tap];
[self.app.buttons[@"Clear text"] tap];
[textFieldPwd typeText:self.pwds[i]];
XCUIElement *button = self.app.buttons[@"登錄"];
[button tap];
sleep(2);
if (!button.exists) {
// 登錄成功
}
}
}
我們簡單說明一下上面的代碼, 我聲明了兩個(gè)數(shù)組,一個(gè)用來存儲用戶名(names)一個(gè)用來存貯密碼(pwds),循環(huán)遍歷,依次輸入用戶名和密碼,如果錯(cuò)誤則重新輸入直到正確為止。
iOS 自動(dòng)化測試遇到的問題
- iOS 輪播圖的和
TableView或者CollectionView混合使用的時(shí)候,無法拿到輪播圖的響應(yīng)時(shí)間,可以使其左右滑動(dòng),但是無法響應(yīng)點(diǎn)擊,如果有哪位同學(xué)知道,煩請告知我,不甚感激。 - 如果項(xiàng)目中用到了
UIDatePicker或者UIPickerView時(shí),用adjustToPickerWheelValue方法進(jìn)行賦值。 - 如果想要依次點(diǎn)擊每行cell, 可以通過
cells.count獲取所有的cell數(shù)量。