前言
閑來沒事本來想看看書的,但是上班時間在公司看書感覺不太合適,經(jīng)過Noah前輩提點所以打算去研究下單元測試,研究了解了一部分并結(jié)合使用場景才覺得這是個非常厲害的東西.想想以前測接口返回數(shù)據(jù)是否正常,這邊單元測試直接寫幾個case,不用頁面點,直接設(shè)幾個數(shù)據(jù)根據(jù)斷言看后臺返回的狀態(tài)碼就能夠很直觀的看出來,雖然功能不算特別豐富但感覺也省了不少事情,這邊會上一些自己寫的case,和幾個自己遇到的坑.
本文學(xué)習(xí)自鏈接,當(dāng)然我寫的主要是這篇文章作者沒寫的地方.閱讀我這篇文章前請先閱讀該鏈接.
斷言
我目前主要用到的是下面這兩個,如果想看更具體的請移步鏈接
XCTAssertTrue(expression, ...)
expression為true時通過讳窟,否則測試失敗。
expression接受boolean類型的參數(shù)。
XCTAssertFalse(expression, ...)
expression為false時通過胜茧,否則測試失敗派阱。
expression接受boolean類型的參數(shù)窍霞。
用法也很簡單,前言地方作者鏈接里有,我這里也來一張圖片吧
UI的單元測試
新建一個case,將光標(biāo)放到方法內(nèi),點擊那個紅色的圓形按鈕就可以開始錄制腳本了(注意是UI的那個單元測試文件),點擊以后在模擬器或者真機(jī)上操作,xcode會生成相應(yīng)的代碼,錄制完自己想要執(zhí)行的操作,點擊那個紅色的圓形按鈕(此時已經(jīng)變成了方形),就可以停止錄制了,然后只要執(zhí)行這個case他就會按照你錄制的步驟去執(zhí)行一遍.
這里其實有一個很深的坑,我到現(xiàn)在也沒解決
看到上面那張圖的報錯了嗎?點擊的是底部的兩個tabbar,tabbar的標(biāo)題是中文,XCode給你錄成了UTF-8,而這些東西首先編譯器無法識別,你得轉(zhuǎn)義不然編譯都不成功,但你轉(zhuǎn)義完成后卻發(fā)現(xiàn)他會報錯告訴你找不到地方.正確的解決辦法是把那兩個中文的UTF-8換成漢字就好了,這個問題目前只在OC上出現(xiàn)了,swift是正確無誤的,如果各位有好的解決辦法可以告訴我,其實UI的case用處不大,這里作者只是好奇所以搞了下.
代碼的執(zhí)行時間測試
如上圖所示,這個方法是用來測試block內(nèi)代碼的執(zhí)行時間的,我們可以通過打印很清楚的看到他其實執(zhí)行了10次,用處也很寬廣,比如想測試身份證的識別時間,請求的時間,轉(zhuǎn)模型的速度等等都可以通過它來測試,這里只是舉個簡單的例子.
我們可以看下打印發(fā)現(xiàn)他確實是執(zhí)行了十次.
再來看看左邊的執(zhí)行代碼相關(guān)信息,這里由于打印"1"執(zhí)行的太快無法看出效果,所以我將測試內(nèi)容換成了使用for循環(huán)打印1-9999,看看他們的執(zhí)行時間.
可以很清楚的看到,10次的平均時間是1.382秒,第一次時間是1.85秒,并且可以看到第一次執(zhí)行時間超過了平均時間33%,這里的測試結(jié)果都是和機(jī)器性能有關(guān)系的.
測試方法
這里我主要用來測試請求用.異步的測試和其他普通的測試都有區(qū)別這里也搞了我好久,都搞得無奈了...后來終于搞定了
這里面需要注意的是和其他普通測試的區(qū)別,我們后臺的請求一般正常情況下都為000,若不正常的話這個case是執(zhí)行不通過的,到時候查看就可以了,偽造數(shù)據(jù)也比較方便.
坑以及注意點
-
1關(guān)于case的方法名字,一定要以test開頭并注意駝峰命名法,且不能加入?yún)?shù),我們使用宏來代替.
#define TestFilterPerformance(filterid) - (void)testFilterPerformance_##filterid { \ [self measureBlock:^{ \ UIImage *filteredImage = [FilterTool filterImage:self.image withFilterId:filterid]; \ XCTAssertNotNil(filteredImage, @"濾鏡效果圖應(yīng)該非空"); \ }]; \ }
2關(guān)于私有方法的測試,只能通過擴(kuò)展來實現(xiàn)
3異步測試是個坑,需要謹(jǐn)慎解決...
4XCode錄制OC的UI測試腳本不成功
目前只發(fā)現(xiàn)了這么多,歡迎補充.