本文翻譯自Unit Testing Tutorial:Mocking Objects
將分為兩部分翻譯,這是Part One.
誰需要單元測試?肯定不是你—你的代碼已經(jīng)灰常完美.所以呢......你僅僅是為你需要學(xué)習(xí)Swift單元測試的朋友讀讀而已?是吧. :]
單元測試能使代碼變得更好;能幫助你在開發(fā)過程中盡早地發(fā)現(xiàn)絕大多數(shù)的bug,更重要的是基于可測試的開發(fā)模式能使你寫出更加模塊化的容易維護(hù)的代碼.第一準(zhǔn)則:如果你的代碼不容易測試,那么將會不容易維護(hù)和debug.
單元測試能夠使"微小的特性"分離.通常你需要模擬類—提供模仿對象來實(shí)現(xiàn)功能上的動作—使微小的特性脫離出來便于測試.Objective-C中有許多第三方框架來實(shí)現(xiàn)對象的模擬和銷毀.但這些來源于不斷實(shí)踐和總結(jié)的庫,還不能在Swift中使用.未來的某天,希望會能用! :]
本教程中,你將學(xué)習(xí)如何編寫自己的mocks,fakes和stubs來測試一個(gè)幫助你記憶朋友生日的app.
- 開端
下載起始項(xiàng)目;這是個(gè)可以連接網(wǎng)絡(luò)后臺的通訊錄app.你無須編寫app的核心功能;相應(yīng)地,你需要編寫一些測試來驗(yàn)證某些功能如預(yù)期一樣實(shí)現(xiàn).
運(yùn)行程序來看下它如何使用.點(diǎn)擊plus,在列表里增加一個(gè)人:
例子用Core Data來存儲你的通訊錄:
莫慌張! :] 本教程中你不需要Core Data的任何經(jīng)驗(yàn);也沒有火箭科學(xué)(這是什么鬼?)
- 單元測試的好處和壞處
當(dāng)開始測試之前,一個(gè)壞消息和一個(gè)好消息.壞消息是單元測試有許多壞處,比如下面的:
- More code: 大量的測試很容易使測試代碼量超過功能性的代碼量.
- More to maintain: 更多的代碼意味著需要更大精力的維護(hù)成本.
- No silver bullet: 單元測試不能(也不可能)消除你所有的bug.
- Takes longer: 寫測試花費(fèi)更多時(shí)間(而這些時(shí)間你本可以在raywenderlicn.com學(xué)更多新奇的知識).
雖然沒有銀彈,但卻有銀線—測試有如下的好處:
- Confidence: 你可以證明你代碼的可行性.
- Quick feedback: 你可以利用單元測試來使藏于你的app navigation里的深層級的代碼得到快速生效運(yùn)行—這在手工運(yùn)行測試時(shí)非常笨重低效.
- Modularity: 單元測試能使你寫出更加模塊化的代碼.
- Focus: 編寫微小特性的測試能使你專注于小細(xì)節(jié).
- Regression: 確保你修復(fù)的bug修復(fù)—不會在隨后的bug中出現(xiàn).
- Refactoring: 當(dāng)Xcode能夠智能地重構(gòu)你的代碼之前,你需要單元測試來使你重構(gòu)的代碼生效.
- Documentation: 單元測試能夠描述你的代碼用途;能作為另一種形式的代碼文檔.
- App的基本結(jié)構(gòu)
許多例子應(yīng)用的代碼都基于勾選Core Data的Master-Detail Application模板.但在模板代碼中可以進(jìn)行一些明顯改進(jìn).Xcode中打開例子代碼來看下代碼導(dǎo)航:
看下具體細(xì)節(jié):
- 有個(gè)Person.swift和PersonInfo.swift文件.Person類是個(gè)NSManagedObject來包含每個(gè)人的一些基本信息.PersonInfo結(jié)構(gòu)體包含相同的信息,但能夠從地址薄中被實(shí)例化.
- PeopleList文件夾有三個(gè)文件:一個(gè)view controller,一個(gè)data provider和一個(gè)data provider protocol.
PeopleList包含的文件用來避免view controllers過于臃腫.將一些功能性的代碼寫成和view controllers交互的單獨(dú)協(xié)議是避免view controller臃腫的好做法.你可以通過這篇文章來學(xué)習(xí)了解更多關(guān)于此話題的內(nèi)容.
本例中,協(xié)議被定義在PeopleListDataProviderProtocol.swift中;打開來瞅瞅.遵從此協(xié)議的類必須有managedObjectContext屬性和tableView且必須定義方法addPerson(_:)和fetch().另外,它必須繼承UITableViewDataSource協(xié)議.
PeopleListViewController有一個(gè)dataProvider屬性,它遵從PeopleListDataProviderProtocol協(xié)議.這個(gè)屬性在AppDelegate.swift里創(chuàng)建了PeopleListDataProvider實(shí)例.
你通過ABPeoplePickerNavigationController來添加人員到列表中.這個(gè)類使開發(fā)者無需明確地請求許可就能獲得用戶的通訊錄.
PeopleListDataProvider從Core Data中獲得數(shù)據(jù)填充到table view中.
下一篇將具體編寫單元測試的代碼,晚安 :)
Girl學(xué)iOS100天 第25天