出版時(shí)間:2012-10 出版社:機(jī)械工業(yè)出版社 作者:Graham Lee 頁(yè)數(shù):206 譯者:愛(ài)飛翔
Tag標(biāo)簽:無(wú)
前言
我向其他開(kāi)發(fā)者講授測(cè)試驅(qū)動(dòng)開(kāi)發(fā)很大程度上是出于偶然。本來(lái)安排我在會(huì)議上關(guān)于另一個(gè)話題發(fā)表演講,而我的一個(gè)朋友則講述TDD(Test Driven Development,測(cè)試驅(qū)動(dòng)開(kāi)發(fā))。不過(guò)朋友的妻子選擇那周末生雙胞胎(我認(rèn)為是這樣的,我可不是這方面的專(zhuān)家),所以Chunk,也就是委托我寫(xiě)這本書(shū)的人,問(wèn)我能不能也關(guān)于TDD發(fā)表演講。由此機(jī)緣,最終使我開(kāi)始了為期一年的寫(xiě)書(shū)過(guò)程。通常來(lái)說(shuō),真實(shí)狀況并不像我們彼此之間講述的那樣美好。實(shí)際上,我初次接觸單元測(cè)試是在很多年前了。在成為專(zhuān)業(yè)的軟件開(kāi)發(fā)者之前,我曾在一家制作基于GNUstep(由自由軟件基金會(huì)所制作,可運(yùn)行于Linux與其他平臺(tái)的Cocoa庫(kù))產(chǎn)品的公司里當(dāng)測(cè)試人員。據(jù)我當(dāng)時(shí)所知,單元測(cè)試就是確保軟件產(chǎn)品的每個(gè)小部件都能正常運(yùn)行的一種開(kāi)發(fā)方法。當(dāng)這些小部件合并為大的組件時(shí),按理說(shuō)它也能正常運(yùn)行才是。這種理解一直持續(xù)到了我從事第一份編程工作時(shí),那個(gè)工作是負(fù)責(zé)某個(gè)跨平臺(tái)安全軟件的Mac系統(tǒng)版本開(kāi)發(fā)。(這里我又一次省略了一件事—幾年前,我曾做過(guò)一個(gè)為期6周的LISP外包程序。每個(gè)人都曾做過(guò)一些并不為之驕傲的事情。)在做這份工作時(shí),我參加了一個(gè)TDD培訓(xùn)課程,這項(xiàng)課程是由經(jīng)?;钴S于面向?qū)ο缶幊逃懻摃?huì)上的Kevlin Henney所開(kāi)設(shè)的。他除了寫(xiě)過(guò)很多文章之外,還曾編輯過(guò)一本書(shū),名叫《每個(gè)程序員都應(yīng)該知道的97件事》 。就是通過(guò)學(xué)習(xí)這個(gè)課程,我才最終意識(shí)到測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的主旨是使得開(kāi)發(fā)者對(duì)其編寫(xiě)的代碼更有信心。隨著學(xué)習(xí)的深入,我還領(lǐng)悟到測(cè)試驅(qū)動(dòng)開(kāi)發(fā)可以使開(kāi)發(fā)者在修改代碼時(shí)心里更加踏實(shí)。當(dāng)對(duì)TDD有足夠的了解,并能夠從實(shí)踐的教訓(xùn)中總結(jié)經(jīng)驗(yàn)時(shí),我終于將TDD當(dāng)成了日常開(kāi)發(fā)的一部分,并弄懂了其中哪些方法適合我,哪些不適合。幾年之后,我能夠接受Chuck的邀請(qǐng),來(lái)做一場(chǎng)關(guān)于TDD的演講了。真心希望這本書(shū)能夠讓讀者領(lǐng)悟到測(cè)試驅(qū)動(dòng)開(kāi)發(fā)的好處,并將其納入日常編碼工作中,同時(shí)也希望讀者能稍花點(diǎn)時(shí)間就掌握它,不要像筆者這樣花費(fèi)了5年左右的時(shí)間。有很多關(guān)于單元測(cè)試的書(shū),其中某些書(shū)的作者也曾參與測(cè)試框架的編寫(xiě)與設(shè)計(jì)。這些書(shū)都很好,不過(guò),它們都沒(méi)有特別針對(duì)Cocoa Touch的開(kāi)發(fā)者。筆者的這本書(shū)提供了以O(shè)bjective-C語(yǔ)言所編寫(xiě)的范例,講述了Xcode及相關(guān)工具的用法,并以Cocoa的編程風(fēng)格書(shū)寫(xiě)代碼。但愿本書(shū)能夠?qū)y(cè)試驅(qū)動(dòng)開(kāi)發(fā)的原理講得更加易懂,并使它與iOS開(kāi)發(fā)者的工作聯(lián)系起來(lái)。另外,還有測(cè)試工具的問(wèn)題。對(duì)于寫(xiě)單元測(cè)試有很多種工具可用,具體采用哪個(gè),還要取決于眾多不同的工具與框架所提供的功能。盡管本書(shū)會(huì)提到它們之間的一些差別,但是筆者打算專(zhuān)注于講解Apple所提供Xcode開(kāi)發(fā)環(huán)境及其所附OCUnit測(cè)試框架的用法。這么做的原因很簡(jiǎn)單,那就是適用性:任何想嘗試單元測(cè)試或TDD的開(kāi)發(fā)者,只要學(xué)習(xí)了本書(shū)所講的知識(shí),使用標(biāo)準(zhǔn)的開(kāi)發(fā)工具,并具備一定的決心,就可以立刻投入工作中。如果讀者覺(jué)得標(biāo)準(zhǔn)的測(cè)試工具缺少某些功能或者不太好用,那你當(dāng)然可以研究其他工具的用法,甚至自己寫(xiě)一個(gè)測(cè)試工具—只是記得要測(cè)試它哦!在成長(zhǎng)為一個(gè)迷戀測(cè)試的程序員的過(guò)程中,我學(xué)到了很多。其中之一就是,想要當(dāng)一個(gè)好的軟件工程師,最好的辦法就是與其他開(kāi)發(fā)者交流。如果你對(duì)本書(shū)內(nèi)容或者通用的TDD開(kāi)發(fā)方法有任何評(píng)論或建議,歡迎在Twitter上與我交流討論(我的用戶(hù)名是iamleeg)。致謝牛頓曾說(shuō)過(guò),“如果我比別人看得更遠(yuǎn),那是因?yàn)槲艺驹诰奕说募缟稀?,?dāng)然了,他的這個(gè)說(shuō)法綜合了數(shù)個(gè)世紀(jì)以來(lái)作者們不斷拓展與完善的那個(gè)隱喻。與此相似,本書(shū)也不是憑空寫(xiě)出來(lái)的,有很多要感謝的人,若全部寫(xiě)出他們的名字的話,要從愛(ài)達(dá)勒芙蕾絲伯爵夫人開(kāi)始,用好多頁(yè)才能寫(xiě)完。如果要寫(xiě)一份簡(jiǎn)潔一些的致謝表,那么首先要感謝的就是培生(Pearson)出版集團(tuán)的諸位同仁,是他們促成了本書(shū)的出版發(fā)行。還要感謝Chunk、Trina與Olivia,是他們持續(xù)督促我完成此書(shū)的。此外還有本書(shū)的技術(shù)審校者Saul、Tim、Alan、Andrew、兩位名為Richard的先生、Simon、Patrick以及Alexander,感謝你們?cè)谂挪楸緯?shū)草稿中錯(cuò)誤的過(guò)程中所做的出色工作,如果還有錯(cuò)誤的話,則應(yīng)歸咎于我。感謝Andy與Barbara,你們所做的文字潤(rùn)色工作,將一些由程序員草草寫(xiě)就的文字變成了優(yōu)雅的英語(yǔ)文句。感謝xUnit測(cè)試框架的設(shè)計(jì)者Kent Beck先生,沒(méi)有他對(duì)于測(cè)試的見(jiàn)解,我將無(wú)處下筆,同樣,也感謝xUnit框架的Objective-C版本制作方Sente SA公司。還必須提到的是Apple的開(kāi)發(fā)工具制作團(tuán)隊(duì),他們?yōu)榱俗屓澜绲膇OS開(kāi)發(fā)者能夠使用單元測(cè)試所做的努力比其他人都要多。與別人相比,Kevlin Henney更讓我領(lǐng)略到了測(cè)試驅(qū)動(dòng)開(kāi)發(fā)之美,讓我避免了很多bug,謝謝你!最后,感謝Freya在沒(méi)日沒(méi)夜的寫(xiě)書(shū)過(guò)程中對(duì)我的支持與理解。如果此刻你正在讀這段話,我想你可能會(huì)更加了解我的。
內(nèi)容概要
本書(shū)是目前僅有的一本講解如何將測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)方法應(yīng)用到iOS開(kāi)發(fā)中的權(quán)威教程,從測(cè)試工具、測(cè)試驅(qū)動(dòng)開(kāi)發(fā)方法和技巧、基于測(cè)試驅(qū)動(dòng)開(kāi)發(fā)方法的軟件設(shè)計(jì)等多角度完美地展現(xiàn)了測(cè)試驅(qū)動(dòng)開(kāi)發(fā)方法與iOS開(kāi)發(fā)的結(jié)合,不僅能使iOS開(kāi)發(fā)者迅速掌握測(cè)試驅(qū)動(dòng)的開(kāi)發(fā)方法,還能使他們?cè)诋a(chǎn)品需求、軟件設(shè)計(jì)、測(cè)試有效性與開(kāi)發(fā)效率之間達(dá)成達(dá)到很好的平衡。
全書(shū)一共13章:第1章簡(jiǎn)單介紹了通用的軟件測(cè)試知識(shí),以及軟件測(cè)試的目標(biāo);第2章介紹如何利用測(cè)試驅(qū)動(dòng)開(kāi)發(fā)與單元測(cè)試來(lái)達(dá)到這個(gè)目標(biāo);第3章將如何進(jìn)行單元測(cè)試的設(shè)計(jì)與編寫(xiě);第4章將深入學(xué)習(xí)如何使用Apple的開(kāi)發(fā)工具中綁定的OCUnit測(cè)試框架;第5章揭示在iOS應(yīng)用程序的開(kāi)發(fā)過(guò)程中如何從最初的需求規(guī)格書(shū)演進(jìn)到最終產(chǎn)品;第6章闡述如何實(shí)現(xiàn)從需求描述中提取出來(lái)的數(shù)據(jù)模型;第7章將實(shí)現(xiàn)應(yīng)用程序的業(yè)務(wù)邏輯;第8章以測(cè)試用例為指導(dǎo),為BrowseOverflow應(yīng)用程序設(shè)計(jì)并實(shí)現(xiàn)網(wǎng)絡(luò)通信功能;第9章講述如何編寫(xiě)視圖控制器的代碼,讓BrowseOverflow程序?qū)⑦@些信息展示給用戶(hù);第10章將以上述類(lèi)整合起來(lái),實(shí)現(xiàn)一個(gè)功能完備且能夠正常運(yùn)行的應(yīng)用程序;第11章講解一些用于移除類(lèi)之間的依賴(lài)性、代碼運(yùn)行環(huán)境依賴(lài)性以及線程依賴(lài)性的設(shè)計(jì)范式;第12章回答了在什么情況下適合采用TDD開(kāi)發(fā)方式;第13章展望了業(yè)界一些更為新穎的功能、一些對(duì)已有技術(shù)的擴(kuò)展以及一些有用的開(kāi)發(fā)工具。
本書(shū)適合從事iOS測(cè)試驅(qū)動(dòng)的軟件開(kāi)發(fā)人員和程序員閱讀。
作者簡(jiǎn)介
Graham Lee,資深安全顧問(wèn)與iOS/Mac開(kāi)發(fā)專(zhuān)家,在全球iOS/Mac開(kāi)發(fā)者社區(qū)中享有盛名。多次受邀在Voices
That Matter、NSConference、Association of C and C++
Users以及Qcon等國(guó)際技術(shù)會(huì)議上展示高質(zhì)量的Cocoa軟件工程實(shí)踐。在軟件測(cè)試領(lǐng)域有深厚的積累和實(shí)踐經(jīng)驗(yàn),從6年前主管一個(gè)基于GNUstep的服務(wù)器應(yīng)用程序的測(cè)試開(kāi)發(fā)工作開(kāi)始深入研究OCUnit與單元測(cè)試技術(shù)。在研究iOS開(kāi)發(fā)前,曾為OS
X、NeXTSTEP及其他類(lèi)UNIX系統(tǒng)開(kāi)發(fā)過(guò)應(yīng)用程序。他還是一位經(jīng)驗(yàn)豐富的技術(shù)作家,著有《Professional Cocoa
Application Security》一書(shū)。
書(shū)籍目錄
譯者序
前言
第1章 軟件測(cè)試與單元測(cè)試簡(jiǎn)介
1.1 軟件測(cè)試的目標(biāo)
1.2 軟件測(cè)試由誰(shuí)來(lái)做
1.3 何時(shí)進(jìn)行軟件測(cè)試
1.4 測(cè)試實(shí)踐舉例
1.5 單元測(cè)試的適用范圍
1.6 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)對(duì)iOS開(kāi)發(fā)者的意義
第2章 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)技巧
2.1 測(cè)試先行
2.2 “失敗、成功、重構(gòu)”三部曲
2.3 設(shè)計(jì)易于測(cè)試的應(yīng)用程序
2.4 更多有關(guān)重構(gòu)的知識(shí)
2.5 不要實(shí)現(xiàn)目前用不到的功能
2.6 在編碼前、編碼中及編碼后進(jìn)行測(cè)試
第3章 如何寫(xiě)單元測(cè)試
3.1 需求
3.2 使用已知的輸入數(shù)據(jù)來(lái)運(yùn)行代碼
3.3 查看運(yùn)行結(jié)果是否符合預(yù)期
3.4 驗(yàn)證結(jié)果
3.5 使測(cè)試代碼更具可讀性
3.6 將多個(gè)測(cè)試用例組織起來(lái)
3.7 重構(gòu)
3.8 總結(jié)
第4章 測(cè)試工具
4.1 Xcode附帶的OCUnit測(cè)試框架
4.2 OCUnit的替代方案
4.2.1 GTM
4.2.2 GHUnit
4.2.3 CATCH
4.2.4 OCMock
4.3 持續(xù)集成工具
4.3.1 Hudson
4.3.2 CruiseControl
4.4 總結(jié)
第5章 針對(duì)iOS應(yīng)用程序的測(cè)試驅(qū)動(dòng)開(kāi)發(fā)
5.1 產(chǎn)品目標(biāo)
5.2 用例
5.3 執(zhí)行方案
5.4 開(kāi)始制作程序
第6章 數(shù)據(jù)模型
6.1 Topic類(lèi)
6.2 Question類(lèi)
6.3 Person類(lèi)
6.4 將Question類(lèi)與其他類(lèi)關(guān)聯(lián)起來(lái)
6.5 Answer類(lèi)
第7章 應(yīng)用程序邏輯
7.1 執(zhí)行方案
7.2 建立Question對(duì)象
7.3 用JSON數(shù)據(jù)構(gòu)建Question對(duì)象
第8章 網(wǎng)絡(luò)相關(guān)代碼
8.1 NSURLConnection類(lèi)的設(shè)計(jì)
8.2 實(shí)現(xiàn)StackOverflowCommunicator類(lèi)
8.3 總結(jié)
第9章 視圖控制器
9.1 類(lèi)結(jié)構(gòu)
9.2 視圖控制器類(lèi)
9.3 TopicTableDataSource類(lèi)與TopicTableDelegate類(lèi)
9.4 通過(guò)已有的視圖控制器建立新的控制器對(duì)象
9.5 提問(wèn)列表的數(shù)據(jù)源
9.6 接下來(lái)的任務(wù)
第10章 整合所有部件
10.1 完成應(yīng)用程序的工作流程
10.2 顯示用戶(hù)頭像
10.3 收尾與清理
10.4 發(fā)布應(yīng)用
第11章 為測(cè)試驅(qū)動(dòng)開(kāi)發(fā)進(jìn)行軟件設(shè)計(jì)
11.1 針對(duì)接口進(jìn)行設(shè)計(jì),而不要針對(duì)實(shí)現(xiàn)
11.2 用命令代替查詢(xún)
11.3 簡(jiǎn)潔而專(zhuān)注的類(lèi)與方法
11.4 封裝
11.5 使用比重用更好
11.6 測(cè)試并發(fā)代碼
11.7 別耍沒(méi)有必要的小聰明
11.8 優(yōu)先選擇寬而淺的繼承體系
11.9 綜述
第12章 在既有項(xiàng)目中運(yùn)用測(cè)試驅(qū)動(dòng)開(kāi)發(fā)
12.1 第一個(gè)測(cè)試用例是最重要的
12.2 通過(guò)重構(gòu)使得代碼更易于測(cè)試
12.3 編寫(xiě)測(cè)試使得代碼更易于重構(gòu)
12.4 真的需要寫(xiě)這么多測(cè)試用例嗎
第13章 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)展望
13.1 使用一系列輸入輸出值構(gòu)建測(cè)試用例
13.2 行為驅(qū)動(dòng)開(kāi)發(fā)
13.3 自動(dòng)生成測(cè)試用例
13.4 自動(dòng)生成能夠通過(guò)測(cè)試的代碼
13.5 綜述
章節(jié)摘錄
第1章 軟件測(cè)試與單元測(cè)試簡(jiǎn)介要想最大限度地從單元測(cè)試中受益,就必須理解它的目標(biāo)及它是如何改進(jìn)軟件開(kāi)發(fā)過(guò)程的。在本章中,讀者將會(huì)學(xué)到一些通用的軟件測(cè)試知識(shí),這些知識(shí)也適用于單元測(cè)試。這一章也會(huì)講到軟件測(cè)試的優(yōu)點(diǎn)和缺點(diǎn)。1.1 軟件測(cè)試的目標(biāo)很多軟件項(xiàng)目的目標(biāo)都是盈利,實(shí)現(xiàn)這個(gè)目標(biāo)的通常方式即通過(guò)應(yīng)用商店來(lái)出售軟件或者以其他方式授權(quán)給用戶(hù)使用并收取費(fèi)用。那種為了程序開(kāi)發(fā)者內(nèi)部使用所制作的軟件,則會(huì)通過(guò)提高某個(gè)業(yè)務(wù)流程的效率,減少該流程所耗的時(shí)間來(lái)間接地盈利。如果通過(guò)提高業(yè)務(wù)流程效率節(jié)省的成本大于開(kāi)發(fā)該軟件的花銷(xiāo),那么這個(gè)軟件項(xiàng)目就是盈利的。開(kāi)源軟件的開(kāi)發(fā)者通常以出售“支援服務(wù)包”(support package)來(lái)獲利,他們也會(huì)使用自己開(kāi)發(fā)的軟件,在這種情況下,前面的論斷依然成立。所以說(shuō),軟件開(kāi)發(fā)經(jīng)濟(jì)學(xué)的基本原則就是,如果某個(gè)軟件項(xiàng)目的目標(biāo)是盈利—不管是向客戶(hù)出售最終產(chǎn)品還是供開(kāi)發(fā)者內(nèi)部使用,那么它要想成功地達(dá)成此目標(biāo),必須創(chuàng)造某種高于軟件制作開(kāi)銷(xiāo)的價(jià)值才行。筆者也知道這并非一個(gè)具有非凡意義的論斷,不過(guò)可以將它推及到軟件測(cè)試領(lǐng)域中。如果軟件測(cè)試(也叫做“質(zhì)量保證”(Quality Assurance, QA))是為了支持軟件項(xiàng)目,則它必須對(duì)實(shí)現(xiàn)盈利有幫助才行。這一點(diǎn)很重要,因?yàn)樗鼘?duì)軟件測(cè)試做出了限定:如果軟件測(cè)試開(kāi)銷(xiāo)過(guò)大,導(dǎo)致項(xiàng)目虧損,那么這種測(cè)試就不適合去做。不過(guò)對(duì)軟件進(jìn)行測(cè)試可以保證產(chǎn)品能正常運(yùn)行,而產(chǎn)品又包含了客戶(hù)所需的功能。如果你不能展示這些功能的價(jià)值,那么客戶(hù)就不會(huì)購(gòu)買(mǎi)這個(gè)產(chǎn)品。注意,測(cè)試的目標(biāo)是證明產(chǎn)品能夠正常運(yùn)行,而不是發(fā)現(xiàn)bug。軟件測(cè)試是在做“質(zhì)量保證”,而不是“質(zhì)量介入”。查找bug通常是個(gè)壞主意。為什么呢?因?yàn)橐迯?fù)bug就必須有開(kāi)銷(xiāo),而這部分資金本來(lái)是付給開(kāi)發(fā)者的,讓其一開(kāi)始就寫(xiě)出無(wú)bug的軟件,現(xiàn)在卻被浪費(fèi)了。在理想的情況下,大家可能會(huì)認(rèn)為開(kāi)發(fā)者只需寫(xiě)出無(wú)bug的軟件,通過(guò)快速的測(cè)試確保它們沒(méi)有問(wèn)題,然后將其上傳到iTunes Connect賬戶(hù),就可以坐等財(cái)源滾滾而來(lái)了。不過(guò)別急,這么做也會(huì)以另一種方式導(dǎo)致同樣的問(wèn)題:在測(cè)試軟件之前,需要多長(zhǎng)的時(shí)間來(lái)編寫(xiě)100%無(wú)bug的軟件呢?這樣做的開(kāi)銷(xiāo)是多少?這么說(shuō)的話,合適的軟件測(cè)試方案看起來(lái)是一種折中:既要保證對(duì)軟件開(kāi)發(fā)進(jìn)度有一定程度的控制,又要在工程開(kāi)銷(xiāo)許可的范圍內(nèi)進(jìn)行一定程度的檢查,以確保產(chǎn)品確實(shí)能夠正常運(yùn)行。這種平衡應(yīng)該著眼于將所發(fā)行產(chǎn)品的運(yùn)行風(fēng)險(xiǎn)降低到一個(gè)可以接受的水平上。所以說(shuō),“最具風(fēng)險(xiǎn)的組件”,也就是那些對(duì)于軟件的運(yùn)行至關(guān)重要的組件或者那些最有可能隱藏bug的組件,應(yīng)當(dāng)首先測(cè)試,然后測(cè)試那些風(fēng)險(xiǎn)稍低的組件,依次測(cè)試,直到你覺(jué)得所有剩下的風(fēng)險(xiǎn)因素都不值得再投入時(shí)間和資金去測(cè)試為止。最終的結(jié)果應(yīng)該是讓客戶(hù)看到軟件實(shí)現(xiàn)了預(yù)期功能,從而值得為此付費(fèi)購(gòu)買(mǎi)才對(duì)。
編輯推薦
《測(cè)試驅(qū)動(dòng)的iOS開(kāi)發(fā)》為Amazon五星級(jí)暢銷(xiāo)書(shū),作者權(quán)威,在全球iOS/Mac開(kāi)發(fā)者社區(qū)享有盛譽(yù)!完美地展現(xiàn)了測(cè)試驅(qū)動(dòng)開(kāi)發(fā)方法與iOS開(kāi)發(fā)的結(jié)合,能使iOS開(kāi)發(fā)者在產(chǎn)品需求、軟件設(shè)計(jì)、測(cè)試有效性與開(kāi)發(fā)效率之間達(dá)成達(dá)到很好的平衡。
圖書(shū)封面
圖書(shū)標(biāo)簽Tags
無(wú)
評(píng)論、評(píng)分、閱讀與下載
測(cè)試驅(qū)動(dòng)的iOS開(kāi)發(fā) PDF格式下載
250萬(wàn)本中文圖書(shū)簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書(shū)網(wǎng) 手機(jī)版