測(cè)試代碼是用于檢測(cè)你的應(yīng)用程序和庫(kù)代碼抵栈,根據(jù)預(yù)期返回一個(gè)通過(guò)或失敗結(jié)果。測(cè)試可能會(huì)檢查某個(gè)對(duì)象在執(zhí)行某些操作后實(shí)例變量的狀態(tài)坤次,驗(yàn)證你的代碼在邊界條件的情況下拋出的特定異常古劲,等等。對(duì)于一個(gè)性能測(cè)試缰猴,參考標(biāo)準(zhǔn)可能是在最大的時(shí)間內(nèi)完成你希望運(yùn)行的程序产艾。
定義測(cè)試范圍
所有軟件都是由組件構(gòu)建,也就是說(shuō)滑绒,小組件在一起形成大組件闷堡,高級(jí)別組件有更多的功能直到項(xiàng)目需求被滿足。最佳測(cè)試實(shí)踐是所有測(cè)試覆蓋這個(gè)組件的所有層次功能疑故。XCTest允許你為組件的任何層次編寫測(cè)試代碼杠览。
它取決于你測(cè)試組件的哪一部分,它可以是一個(gè)類或一組完成基本目標(biāo)的一組方法纵势。例如踱阿,它可以是算術(shù)運(yùn)算管钳,如快速入門章節(jié)的計(jì)算器應(yīng)用∪砩啵可能有不同方法處理TableView內(nèi)容和數(shù)據(jù)結(jié)構(gòu)之間的交互才漆。這些方法和運(yùn)算每一個(gè)都意味著應(yīng)用程序的功能組成部分,都可以測(cè)試葫隙。測(cè)試組件的行為完全是確定的栽烂,要么測(cè)試通過(guò)要么失敗。
當(dāng)你的項(xiàng)目在不斷的增長(zhǎng)和變化時(shí)恋脚,可以把應(yīng)用行為劃分為組件腺办,可以更有效的測(cè)試你的代碼行為是否符合所有細(xì)節(jié)的參考標(biāo)準(zhǔn)。對(duì)于有許多組件的大項(xiàng)目糟描,你需要運(yùn)行大量的測(cè)試來(lái)對(duì)項(xiàng)目進(jìn)行徹底的測(cè)試怀喉。盡量設(shè)計(jì)測(cè)試可以快速運(yùn)行,但不可避免有些測(cè)試很大并且執(zhí)行的緩慢船响。小的快速運(yùn)行的測(cè)試可以經(jīng)常使用躬拢,當(dāng)返回失敗時(shí)有助于診斷和解決問(wèn)題。
為項(xiàng)目組件設(shè)計(jì)測(cè)試時(shí)測(cè)試驅(qū)動(dòng)開發(fā)的基礎(chǔ)见间,在編寫要測(cè)試的代碼前先編寫測(cè)試代碼聊闯。這種開發(fā)方式讓你在實(shí)現(xiàn)功能前考慮代碼的要求和邊界情況。在編寫完測(cè)試代碼后米诉,你開發(fā)你的算法通過(guò)測(cè)試菱蔬。在你的代碼通過(guò)測(cè)試后,你對(duì)代碼的改進(jìn)有一個(gè)基礎(chǔ)史侣,在下次運(yùn)行測(cè)試時(shí)拴泌,對(duì)預(yù)期行為的任何變化(這通常導(dǎo)致產(chǎn)品中的bug)都有信心。
即使你沒有使用測(cè)試驅(qū)動(dòng)開發(fā)惊橱,測(cè)試可以幫助你減少在代碼中引入的bug蚪腐,提高功能和性能。你可以在工作的應(yīng)用中引入測(cè)試確保未來(lái)的變更不會(huì)修改應(yīng)用現(xiàn)有行為税朴。當(dāng)你修復(fù)bug時(shí)回季,添加測(cè)試確認(rèn)測(cè)試被修復(fù)。測(cè)試應(yīng)該檢查你的代碼正林,覆蓋所有的邊界條件茧跋,查找預(yù)期失敗或預(yù)期通過(guò)。
注意:添加測(cè)試到?jīng)]有設(shè)計(jì)測(cè)試的項(xiàng)目中可能需要重新設(shè)計(jì)或重構(gòu)部分代碼使之更容易測(cè)試卓囚。附錄A:編寫可測(cè)試代碼( Appendix A: Writing Testable Code)包含編寫可測(cè)試代碼的簡(jiǎn)單指南瘾杭。
組件可以包含應(yīng)用不同部分的交互。因?yàn)槟承y(cè)試需要更長(zhǎng)的時(shí)間允許哪亿,你可能希望定期或在某個(gè)服務(wù)器上運(yùn)行測(cè)試粥烁。正如你在下一章中看到的贤笆,你可以組織你的測(cè)試并用許多不同的運(yùn)行方式來(lái)滿足不同需求。
性能測(cè)試
測(cè)試組件可以是功能測(cè)試或性能測(cè)試讨阻。XCTest提供API衡量時(shí)間性能芥永,使你可以跟蹤性能改進(jìn)和回歸測(cè)試。
為了讓性能測(cè)試返回成功或失敗钝吮,測(cè)試必須提供一個(gè)基準(zhǔn)來(lái)評(píng)估埋涧。基準(zhǔn)是十次運(yùn)行測(cè)試方法與衡量標(biāo)準(zhǔn)偏差的平均時(shí)間奇瘦。低于時(shí)間基準(zhǔn)或多次運(yùn)行相差太大均為失敗棘催。
注意:當(dāng)你第一次運(yùn)行性能測(cè)試時(shí),XCTest總是會(huì)失敗耳标,是因?yàn)榛鶞?zhǔn)未知醇坝。一旦你設(shè)置特定的值為基準(zhǔn)時(shí),XCTest會(huì)評(píng)估并返回成功或失敗次坡,并為你提供測(cè)試結(jié)果的詳情呼猪。
用戶界面測(cè)試
到目前為止討論的功能和性能測(cè)試通常被稱為單元測(cè)試,其中單元是你決定測(cè)試功能的粒度和級(jí)別砸琅。單元測(cè)試主要關(guān)心組件是否是預(yù)期的行為宋距,及與其他組件進(jìn)行預(yù)期交互行為。從設(shè)計(jì)的角度來(lái)看症脂,單元測(cè)試是從開發(fā)項(xiàng)目的內(nèi)部審查滿足你需求的組件谚赎。
用戶通過(guò)用戶界面與你的代碼交互。用戶界面的交互通常都是粗粒度更加高層次的行為摊腋,使用外部活動(dòng)、集成的幾個(gè)組件(子系統(tǒng))來(lái)調(diào)用你的應(yīng)用程序功能嘁傀。沒有專門為用戶界面設(shè)計(jì)的組件兴蒸,并在程序之外操作用戶界面,很難編寫單元測(cè)試用來(lái)檢查用戶界面的用戶體驗(yàn)细办。這些特殊的組件叫做“UI測(cè)試”橙凳。
UI測(cè)試在應(yīng)用外部測(cè)試應(yīng)用,作為用戶來(lái)體驗(yàn)它笑撞。讓你可以編寫測(cè)試并發(fā)送模擬事件給系統(tǒng)提供的和自定義的UI對(duì)象岛啸,捕獲這些對(duì)象的響應(yīng),然后測(cè)試響應(yīng)的正確性或想茴肥,就像你在單元測(cè)試中那樣坚踩。
應(yīng)用和庫(kù)測(cè)試
Xcode提供兩種類型的單元測(cè)試環(huán)境:應(yīng)用測(cè)試和庫(kù)測(cè)試
- 應(yīng)用測(cè)試。應(yīng)用測(cè)試檢查應(yīng)用代碼行為是否正確瓤狐,例如計(jì)算器應(yīng)用的算術(shù)運(yùn)算瞬铸。
- 庫(kù)測(cè)試批幌。庫(kù)測(cè)試檢查動(dòng)態(tài)庫(kù)和不依賴于應(yīng)用程序運(yùn)行時(shí)使用的框架代碼行為是否正確。使用庫(kù)測(cè)試你可以構(gòu)建單元測(cè)試檢查庫(kù)組件嗓节。
適當(dāng)?shù)氖褂眠@些環(huán)境測(cè)試你的項(xiàng)目荧缘,幫助你保持代碼與預(yù)期的行為一致。
XCTest——Xcode測(cè)試框架
提供給你的測(cè)試框架是XCTest拦宣,從Xcode5開始截粗。
關(guān)于版本和兼容性
- 在Xcode5中,XCTest兼容運(yùn)行于OS X v10.8和OS X v10.9及iOS7及更高版本鸵隧。
- 在Xcode6中绸罗,XCTest兼容運(yùn)行于OS X v10.9和OS X v10.10及iOS6及更高版本。
- 在Xcode7中掰派,XCTest兼容運(yùn)行于OS X v10.10和OS X v10.11及iOS6及更高版本从诲。
- UI測(cè)試支持運(yùn)行于OS X v10.11和iOS9的設(shè)備和模擬器。
版本兼容性的更詳細(xì)信息靡羡,參見Xcode版本說(shuō)明( Xcode Release Notes)系洛。
Xcode集成 XCTest.framework
到你的項(xiàng)目。該框架提供設(shè)計(jì)測(cè)試并在代碼上運(yùn)行測(cè)試的API略步。XCTest框架的詳細(xì)信息描扯,參見XCTest 框架參考(XCTest Framework Reference)。
注意:Xcode包含OCUint測(cè)試更新項(xiàng)目遷移趟薄。關(guān)于OCUint遷移到XCTest的信息绽诚,參見附錄B:從OCUnit遷移到XCTest( Appendix B: Transitioning from OCUnit to XCTest)。
何時(shí)開始測(cè)試
當(dāng)你開始創(chuàng)建測(cè)試時(shí)杭煎,記住以下幾點(diǎn):
- 在創(chuàng)建單元測(cè)試時(shí)恩够,專注于測(cè)試代碼的最基礎(chǔ)功能,與controller交互model類和方法羡铲。
- 應(yīng)用的高層次代碼如Model蜂桶,View和Controller類,使用Cocoa和Cocoa Touch的程序員都熟悉該設(shè)計(jì)模式也切。當(dāng)你編寫測(cè)試覆蓋所有的Model類扑媚,在編寫Controller類測(cè)試代碼前,要確認(rèn)你的應(yīng)用很好的測(cè)試過(guò)雷恃。從Controller開始會(huì)接觸到應(yīng)用更復(fù)雜的部分疆股,例如,連接到網(wǎng)絡(luò)倒槐,web服務(wù)連接的數(shù)據(jù)庫(kù)旬痹。
- 如果你正在編寫一個(gè)框架或庫(kù),你可能希望從API開始,從這里唱凯,可以開始測(cè)試內(nèi)部類羡忘。
- 當(dāng)創(chuàng)建UI測(cè)試,首先考慮最常見的工作流磕昼。思考用戶開始使用app會(huì)做什么卷雕,以及在這個(gè)過(guò)程中用戶希望立即看到什么UI。使用UI記錄功能是捕獲用戶動(dòng)作的最好方式票从,可以擴(kuò)展UI測(cè)試方法實(shí)現(xiàn)測(cè)試準(zhǔn)確性或性能漫雕。
- 這種類型的UI測(cè)試相對(duì)來(lái)說(shuō)是粗粒度的,可能會(huì)跨越幾個(gè)子系統(tǒng)峰鄙;他們可能返回很多信息浸间,最初會(huì)很難分析。當(dāng)你使用UI測(cè)試組件吟榴,你可以細(xì)化測(cè)試粒度并聚焦UI測(cè)試魁蒜,更清楚的反映子系統(tǒng)行為。