iOS UnitTest簡(jiǎn)單應(yīng)用

一惧笛、什么是UnitTest

在Xcode的API中這樣描寫(xiě):

The XCTest framework enables you to write unit tests for your Xcode projects that integrate seamlessly with the Xcode testing workflow, as described in Testing with Xcode.

Tests assert that certain conditions are satisfied during test execution, and record test failures (with optional messages) if those conditions are not satisfied. Tests can also measure the performance of blocks of code to check for performance regressions, and can interact with an application's UI to validate user interaction flows.

總結(jié)來(lái)說(shuō)就是針對(duì)代碼模塊:1、測(cè)試代碼是否滿足某些條件赢乓,如果不滿足松忍,則記錄失敽们峰锁;2回还、測(cè)試代碼模塊性能(測(cè)試代碼執(zhí)行花費(fèi)的時(shí)間);3戏蔑、驗(yàn)證UI交互(這部分屬于UITest暫且不討論蹋凝,實(shí)用性太差)

二、什么時(shí)候使用UnitTest

iOS UnitTest最大的好處是总棵,我們可以不運(yùn)行我們的工程而測(cè)試我們想要測(cè)試的代碼鳍寂,并且可以做到批量測(cè)試,對(duì)于APP來(lái)講情龄,我們可以就免去了多個(gè)頁(yè)面的點(diǎn)擊迄汛,以及覆蓋問(wèn)題。最明顯的就是接口測(cè)試骤视,我們可以可以做到一鍵測(cè)試所有接口(事實(shí)上并不是真的一鍵鞍爱,我們還是需要配置每個(gè)需要測(cè)試的接口,但是一次配置专酗,就可以做到一勞永逸)是否完好睹逃。在我們的接口改變,新增等情況下祷肯,我們不但需要對(duì)新增的接口測(cè)試唯卖,還需要查看老接口是否受影響的情況下粱玲,UnitTest就顯示十分方便。

對(duì)于接口測(cè)試拜轨,屬于我們前文所提到的“測(cè)試代碼是否滿足某些條件”抽减,這個(gè)方法還可以檢查我們的代碼邏輯,譬如我們工程里有本地計(jì)算訂單費(fèi)用橄碾,積分等卵沉,都可以用這個(gè)思想進(jìn)行測(cè)試。

測(cè)試代碼模塊性能:我們可以用以測(cè)試代碼運(yùn)行花費(fèi)時(shí)間法牲,block執(zhí)行時(shí)間史汗。當(dāng)我們有下載需求,比如捕手中的二維碼保存拒垃,可以大致打估出所需時(shí)間(不太實(shí)用停撞,對(duì)下載最大影響還是網(wǎng)速)。

三悼瓮、UnitTest的使用

1戈毒、創(chuàng)建

第一個(gè)方法是在創(chuàng)建工程時(shí)勾選Include Unit Test

或者在創(chuàng)建工程以后,再添加target

這時(shí)候横堡,我們可以看到工程里多了一個(gè)Tests文件夾埋市,里面包含一個(gè)一個(gè)Test文件,


這就是我們的unitTest文件命贴,當(dāng)然道宅,我們也可以自己再創(chuàng)建多個(gè),以此來(lái)區(qū)分測(cè)試不同的模塊胸蛛。

可以看到.m文件初始包含4個(gè)方法

1)setUp:所有測(cè)試方法執(zhí)行之前都會(huì)執(zhí)行這個(gè)方法污茵,如果我們需要確定一個(gè)對(duì)象的方法,可現(xiàn)在這個(gè)方法里實(shí)例化對(duì)象葬项。

2)tearDown:所有測(cè)試方法執(zhí)行之后都會(huì)執(zhí)行這個(gè)方法

3)testExample:一個(gè)測(cè)試用例泞当,里面可以寫(xiě)測(cè)試代碼,我們自己寫(xiě)測(cè)試方法玷室,都以test開(kāi)頭零蓉,才會(huì)有自動(dòng)執(zhí)行

4)testPerformanceExample:里面的measureBlock內(nèi)為性能測(cè)試笤受,測(cè)試一段代碼執(zhí)行時(shí)常穷缤。

2、使用

我們先來(lái)看XCTest自帶的斷言:

XCTAssertNotNil(a1, format…) 當(dāng)a1不為nil時(shí)成立

XCTAssert(expression, format...) 當(dāng)expression結(jié)果為YES成立

XCTAssertTrue(expression, format...) 當(dāng)expression結(jié)果為YES成立箩兽;

XCTAssertEqualObjects(a1, a2, format...) 判斷相等津肛,當(dāng)[a1 isEqualTo: a2]返回YES的時(shí)候成立

XCTAssertEqual(a1, a2, format...) 當(dāng)a1==a2返回YES時(shí)成立

XCTAssertNotEqual(a1, a2, format...) 當(dāng)a1!=a2返回YES時(shí)成立

&&

XCTFail(format…) 生成一個(gè)失敗的測(cè)試;

XCTAssertNil(a1, format...)為空判斷汗贫,a1為空時(shí)通過(guò)身坐,反之不通過(guò)秸脱;

XCTAssertNotNil(a1, format…)不為空判斷,a1不為空時(shí)通過(guò)部蛇,反之不通過(guò)摊唇;

XCTAssert(expression, format...)當(dāng)expression求值為T(mén)RUE時(shí)通過(guò);

XCTAssertTrue(expression, format...)當(dāng)expression求值為T(mén)RUE時(shí)通過(guò)涯鲁;

XCTAssertFalse(expression, format...)當(dāng)expression求值為False時(shí)通過(guò)巷查;

XCTAssertEqualObjects(a1, a2, format...)判斷相等,[a1 isEqual:a2]值為T(mén)RUE時(shí)通過(guò)抹腿,其中一個(gè)不為空時(shí)岛请,不通過(guò);

XCTAssertNotEqualObjects(a1, a2, format...)判斷不等警绩,[a1 isEqual:a2]值為False時(shí)通過(guò)崇败;

XCTAssertEqual(a1, a2, format...)判斷相等(當(dāng)a1和a2是 C語(yǔ)言標(biāo)量、結(jié)構(gòu)體或聯(lián)合體時(shí)使用, 判斷的是變量的地址肩祥,如果地址相同則返回TRUE后室,否則返回NO);

XCTAssertNotEqual(a1, a2, format...)判斷不等(當(dāng)a1和a2是 C語(yǔ)言標(biāo)量搭幻、結(jié)構(gòu)體或聯(lián)合體時(shí)使用)咧擂;

XCTAssertEqualWithAccuracy(a1, a2, accuracy, format...)判斷相等,(double或float類(lèi)型)提供一個(gè)誤差范圍檀蹋,當(dāng)在誤差范圍(+/-accuracy)以內(nèi)相等時(shí)通過(guò)測(cè)試松申;

XCTAssertNotEqualWithAccuracy(a1, a2, accuracy, format...) 判斷不等,(double或float類(lèi)型)提供一個(gè)誤差范圍俯逾,當(dāng)在誤差范圍以內(nèi)不等時(shí)通過(guò)測(cè)試贸桶;

XCTAssertThrows(expression, format...)異常測(cè)試,當(dāng)expression發(fā)生異常時(shí)通過(guò)桌肴;反之不通過(guò)皇筛;(很變態(tài)) XCTAssertThrowsSpecific(expression, specificException, format...) 異常測(cè)試,當(dāng)expression發(fā)生specificException異常時(shí)通過(guò)坠七;反之發(fā)生其他異乘祝或不發(fā)生異常均不通過(guò);

XCTAssertThrowsSpecificNamed(expression, specificException, exception_name, format...)異常測(cè)試彪置,當(dāng)expression發(fā)生具體異常拄踪、具體異常名稱(chēng)的異常時(shí)通過(guò)測(cè)試,反之不通過(guò)拳魁;

XCTAssertNoThrow(expression, format…)異常測(cè)試惶桐,當(dāng)expression沒(méi)有發(fā)生異常時(shí)通過(guò)測(cè)試;

XCTAssertNoThrowSpecific(expression, specificException, format...)異常測(cè)試,當(dāng)expression沒(méi)有發(fā)生具體異常姚糊、具體異常名稱(chēng)的異常時(shí)通過(guò)測(cè)試贿衍,反之不通過(guò);

XCTAssertNoThrowSpecificNamed(expression, specificException, exception_name, format...)異常測(cè)試救恨,當(dāng)expression沒(méi)有發(fā)生具體異常贸辈、具體異常名稱(chēng)的異常時(shí)通過(guò)測(cè)試,反之不通過(guò)

用一個(gè)XCTAssertTrue舉例來(lái)說(shuō)肠槽,可以看出這個(gè)函數(shù)是判斷是否為真裙椭。比如我們做出XCTAssertTrue(3>5)的判斷,為結(jié)果正確署浩,測(cè)試會(huì)順利通過(guò)揉燃,假如XCTAssertTrue(3>5),結(jié)果為假筋栋,便會(huì)報(bào)錯(cuò)炊汤,并展示我們所添加說(shuō)明。我們可以寫(xiě)一段代碼測(cè)試一下:

在以test開(kāi)頭的方法左邊弊攘,我們可以看到一個(gè)菱形的標(biāo)志抢腐,點(diǎn)擊就可以運(yùn)行這段測(cè)試代碼,也可以command + U執(zhí)行所有測(cè)試代碼襟交,還可以如圖所示迈倍,點(diǎn)擊工程右邊的執(zhí)行鍵,或者模塊的捣域,或者指定方法的:




運(yùn)行結(jié)果:

報(bào)錯(cuò)了啼染,如果我們執(zhí)行了所有測(cè)試代碼,這時(shí)候我們可以在Xcode界面里看到所有的測(cè)試代碼的運(yùn)行加過(guò)焕梅,成功的會(huì)有對(duì)號(hào)迹鹅,錯(cuò)誤的會(huì)報(bào)錯(cuò),錯(cuò)誤的測(cè)試代碼并會(huì)不影響其他的方法贞言,這樣我們可以方便的查看所有出問(wèn)題的代碼斜棚,如下圖所示。

接著看上面這張圖该窗,可以看到我在setUp方法里弟蚀,實(shí)例化了一個(gè)ViewController。我在ViewController寫(xiě)了一個(gè)簡(jiǎn)單的A-B求值的方法酗失,我們可以寫(xiě)在XCTAssertTrue里測(cè)試:

我們接著看上面的大圖义钉,可以看到下面的testExample方法,我們進(jìn)行了網(wǎng)絡(luò)請(qǐng)求的測(cè)試级零。

在這里断医,測(cè)試方法是異步執(zhí)行,我們可以設(shè)置期望奏纪,來(lái)設(shè)定我們期望的時(shí)間鉴嗤。

我們?cè)趧?chuàng)建expectation時(shí),可以加入錯(cuò)誤描述序调,比如我們這個(gè)網(wǎng)絡(luò)請(qǐng)求醉锅,我在waitForExpectationsWithTimeout設(shè)置了時(shí)間為3,在expectationWithDescription設(shè)定的問(wèn)題描述是超時(shí)发绢,當(dāng)我們的這個(gè)網(wǎng)絡(luò)請(qǐng)求超過(guò)3秒鐘硬耍,在waitForExpectationsWithTimeout就會(huì)報(bào)錯(cuò),錯(cuò)誤描述就會(huì)有我們的問(wèn)題描述边酒,在看我請(qǐng)求成功里寫(xiě)的经柴,XCTAssertNotNil(responseObject, @“返回出錯(cuò)”),XCTAssertNotNil判斷里面的對(duì)象不為nil墩朦,如果是nil則報(bào)錯(cuò)坯认,展示返回錯(cuò)誤。參考:XCTest的waitForExpectationsWithTimeout 方法

接下來(lái)我們看下面這個(gè)方法

描述為性能測(cè)試氓涣,我們可以把自己需要測(cè)試的方法放到block里牛哺,block里的代碼,會(huì)執(zhí)行10次劳吠,取出平均值引润,比如我們?cè)谶@里打印1000次,點(diǎn)擊旁邊的菱形運(yùn)行

我們可以看到痒玩,右邊的測(cè)試結(jié)果展示了這段代碼執(zhí)行所用的時(shí)間淳附,這是簡(jiǎn)單應(yīng)用,我們可以測(cè)試ViewController的代碼性能蠢古。

接下來(lái)點(diǎn)擊左邊的灰色菱形燃观,在這里可以看到這十次執(zhí)行的每次執(zhí)行時(shí)間,


在這里我們點(diǎn)擊set Baseline 可以設(shè)定我們的逾期便瑟,

比如我們?cè)O(shè)定逾期時(shí)間為 0.100S

然后執(zhí)行這段代碼缆毁,

可以看到,報(bào)錯(cuò)了到涂,并且告訴我們脊框,這段打碼執(zhí)行時(shí)間超出了我們超出的程度。

參考資料:http://blog.csdn.net/jeikerxiao/article/details/51668655

http://www.reibang.com/p/d54428f574c3

http://www.reibang.com/p/1a3772de126b

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末践啄,一起剝皮案震驚了整個(gè)濱河市浇雹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌屿讽,老刑警劉巖昭灵,帶你破解...
    沈念sama閱讀 206,723評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吠裆,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡烂完,警方通過(guò)查閱死者的電腦和手機(jī)试疙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)抠蚣,“玉大人祝旷,你說(shuō)我怎么就攤上這事∷徽” “怎么了怀跛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,998評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)柄冲。 經(jīng)常有香客問(wèn)我吻谋,道長(zhǎng),這世上最難降的妖魔是什么现横? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,323評(píng)論 1 279
  • 正文 為了忘掉前任滨溉,我火速辦了婚禮,結(jié)果婚禮上长赞,老公的妹妹穿的比我還像新娘晦攒。我一直安慰自己,他們只是感情好得哆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布脯颜。 她就那樣靜靜地躺著,像睡著了一般贩据。 火紅的嫁衣襯著肌膚如雪栋操。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,079評(píng)論 1 285
  • 那天饱亮,我揣著相機(jī)與錄音矾芙,去河邊找鬼。 笑死近上,一個(gè)胖子當(dāng)著我的面吹牛剔宪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播壹无,決...
    沈念sama閱讀 38,389評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼葱绒,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了斗锭?” 一聲冷哼從身側(cè)響起地淀,我...
    開(kāi)封第一講書(shū)人閱讀 37,019評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎岖是,沒(méi)想到半個(gè)月后帮毁,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體实苞,經(jīng)...
    沈念sama閱讀 43,519評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評(píng)論 2 325
  • 正文 我和宋清朗相戀三年烈疚,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了黔牵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,100評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡胞得,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出屹电,到底是詐尸還是另有隱情阶剑,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評(píng)論 4 324
  • 正文 年R本政府宣布危号,位于F島的核電站牧愁,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏外莲。R本人自食惡果不足惜猪半,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望偷线。 院中可真熱鬧磨确,春花似錦、人聲如沸声邦。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,289評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)亥曹。三九已至邓了,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間媳瞪,已是汗流浹背骗炉。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,517評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛇受,地道東北人句葵。 一個(gè)月前我還...
    沈念sama閱讀 45,547評(píng)論 2 354
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像兢仰,于是被迫代替她去往敵國(guó)和親笼呆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 單元測(cè)試不是一個(gè)小工程旨别,需要多用些時(shí)間才能做好诗赌,不要希望通過(guò)這個(gè)文章就能掌握單元測(cè)試,這只是一個(gè)入門(mén)秸弛,需要自己動(dòng)手...
    勇不言棄92閱讀 7,788評(píng)論 9 60
  • 前言 單元測(cè)試和UI測(cè)試大致步驟網(wǎng)上很多文章都有铭若,如果會(huì)的可以忽略洪碳,關(guān)鍵是錯(cuò)誤總結(jié),網(wǎng)上很少有文章提及到叼屠,感興趣的...
    _YGL_閱讀 5,149評(píng)論 20 23
  • 一瞳腌、概述 在Xcode中新建項(xiàng)目的時(shí)候會(huì)默認(rèn)勾選單元測(cè)試,勾選后每個(gè)XCode新建的iOS的項(xiàng)目中都有一個(gè)叫做”項(xiàng)...
    kidd風(fēng)閱讀 2,411評(píng)論 0 5
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理镜雨,服務(wù)發(fā)現(xiàn)嫂侍,斷路器,智...
    卡卡羅2017閱讀 134,600評(píng)論 18 139
  • 【今日導(dǎo)讀】 草銨膦產(chǎn)品供需延續(xù)緊張勢(shì)頭 11月重卡銷(xiāo)售創(chuàng)同期歷史新高 陜天然氣擬定增募資發(fā)展主業(yè) 風(fēng)電發(fā)展“十三...
    72e31abbfa15閱讀 196評(píng)論 0 0