本書由淺入深地對自動化軟件測試進行了闡述,內(nèi)容涵蓋軟件測試的基礎(chǔ)知識、Python、PyTest、Selenium、面向?qū)ο缶幊、自動化測試框架的設(shè)計要點和測試自動化開發(fā)實踐等,本書內(nèi)容組織成入門、進階和高階三個逐步提高的版塊,每個版塊都有實戰(zhàn)編程章節(jié),清晰呈現(xiàn)了技術(shù)方案的打磨和改進的過程。
本書的內(nèi)容分為三個大的版塊。
個版塊,從基礎(chǔ)的部分講起,讓基礎(chǔ)薄弱的工程師對測試和編程語言有基本的認識,在此基礎(chǔ)上開始了解PyTest測試框架的基礎(chǔ)用法,以及如何用Selenium來做簡單的Web UI的自動化測試。
通過這個版塊的學習,測試工程師有能力把一些簡單的測試工作用代碼實現(xiàn),減少手工重復勞動的比重,做到一定程度的測試自動化,這是對自動化測試工程師的入門要求。
第二個版塊,夯實Python語言基礎(chǔ),講解更深入的PyTest和Selenium特性,演示如何應(yīng)用這些知識來改進測試用例的編寫,改善測試框架,讓測試自動化更加高效。
通過這個版塊的學習,測試工程師對編程語言和測試工具會有更深入的了解,可以更高效地進行測試自動化的工作,有能力開始針對產(chǎn)品特性來設(shè)計自動化測試框架,這是工程團隊對中級測試工程師的一般要求。
第三個版塊,學習Python的高級特性、面向?qū)ο蟮乃枷搿⒆詣踊瘻y試工具和框架的高級特性、設(shè)計思路、以及存在的問題、限制及其改進思路、工程團隊的高質(zhì)量協(xié)作、實際項目中的實踐等更深入的內(nèi)容,這個部分包含了大量實戰(zhàn)中提煉出來的經(jīng)驗和總結(jié)。
通過這個版塊的學習,測試工程師可以往高級工程師和架構(gòu)師方向邁出堅實的一步,而具備這樣的技術(shù)能力和思維方式后,測試工程師可以在整個軟件工程團隊中起到非常積極的正面影響,而不只限于測試團隊。
每個版塊的末尾都有一個實戰(zhàn)章節(jié),所有的實戰(zhàn)章節(jié)圍繞同一個測試場景展開,前后銜接呼應(yīng),有很強的延續(xù)性。每個實戰(zhàn)章節(jié)都是針對相應(yīng)的技術(shù)水平而設(shè)計的,讀者可以非常直觀地看到代碼和設(shè)計如何隨著技術(shù)水平的提升而改進。
1.本書內(nèi)容詳實、深入淺出、案例生動、語言簡練,是軟件自動化測試工程師的參考資料,也可供相關(guān)專業(yè)的在校學生、手工測試工程師和希望提升技術(shù)水平的自動化測試工程師學習參考。
2.業(yè)內(nèi)多個行業(yè)專家聯(lián)袂推薦。
3.讀者可以在微信公眾號Python閱碼場看到更多關(guān)于軟件開發(fā)和測試相關(guān)的技術(shù)文章,也可通過公眾號與作者交流互動。
序 一
明代學者林希元有云:自古圣賢之言學也,咸以躬行實踐為先,識見言論次之,強調(diào)實踐是位的,而著書立說次之。唯有經(jīng)過實踐總結(jié)而成的書,方能為讀者提供更強大的指導。本書的作者是一位長期奮戰(zhàn)在編碼一線的老碼農(nóng),他把他多年的實踐經(jīng)驗轉(zhuǎn)化為了這樣一本書,這不是一本空洞無物的Python語法教程,也不是一本紙上談兵的軟件測試教程,它更像是Python在軟件測試領(lǐng)域的實戰(zhàn)兵法。
在讀完本書之后,我被本書的文字深深打動了,驚嘆于作者在技術(shù)精湛之外,竟然有如此出色的文筆。不同于技術(shù)類圖書的八股文風,讀這本書,感覺像是有一個坐在你身邊的碼農(nóng),向你講述他對Python的理解,對軟件測試乃至軟件工程的理解。本書使用了許多古今中外現(xiàn)實生活中的例子,生動有趣地陳述枯燥的知識點。本書的另外一個特點就是如庖丁解牛,刀法精準,在正確的位置下刀。比如,對于如何安裝Python這樣的操作,作者幾乎只字未提,因為本書默認讀者是具備這樣的能力的。所以,閱讀本書,就像在看一部精彩的動作片,從開場的分鐘開始就從頭打到尾,以至于觀眾全程都不愿意離場。
人生苦短,請用Python,F(xiàn)如今,Python已經(jīng)廣泛地應(yīng)用于Web開發(fā)、人工智能、數(shù)據(jù)分析、網(wǎng)絡(luò)爬蟲、游戲開發(fā)、云計算、自動化測試與運維等眾多領(lǐng)域。熟練地掌握Python,意味著極大地提升工程中的生產(chǎn)效率。也正是因為Python大流行,現(xiàn)在市面上的Python書籍可以說是汗牛充棟,但是,這些書籍中的絕大多數(shù)仍然采用了平鋪直敘式的語法講解方式。本書的結(jié)構(gòu)則非常新穎,它采用迭代螺旋的方式,把Python的理論原理和實踐技巧一個臺階一個臺階地往上提升。比如本書在第2章講完P(guān)ython的基礎(chǔ)語法結(jié)構(gòu)后,第3~5章分別是PyTest入門、Selenium入門和實戰(zhàn)12306之入門;第6章進行Python進階,之后,第7~9章又對PyTest、Selenium和12306進行進階學習;第10章再對Python的高級特性進行講解;第11章在此基礎(chǔ)上總結(jié)測試框架;第12章則第3次對12306案例進行迭代提升。這種迭代推進、螺旋上升的方式,非常符合人類的思維習慣,畢竟我們掌握任何一門新技術(shù),都不是一蹴而就的;叵肫饋恚以趯W習Linux內(nèi)核及其他技術(shù)時,也同樣是反反復復地跟同一個知識點死磕。但是在不同的階段,隨著自身技術(shù)深度和廣度的增加,對同一事物的理解也會完全不一樣。技術(shù)高手幾乎都會對同一關(guān)鍵的技術(shù)點進行反復研究,正是這種不懈的執(zhí)拗,才拉開了高手和一般程序員間的差距。
非常高興看到多年好友徐西寧老師的這本書出版,相信本書必然會為促進Python,尤其是Python在軟件測試領(lǐng)域的工程實踐應(yīng)用、提升一線開發(fā)人員的實戰(zhàn)水平起到巨大的作用。
宋寶華,知名Linux技術(shù)專家
序 二
自動化測試是軟件工程中有價值的環(huán)節(jié)之一,需要有更多的高質(zhì)量技術(shù)分享傳播給更多人。老徐是一個能做會講的全棧工程師,技術(shù)功底深厚,表達能力強,且極有耐心,是理想的技術(shù)書籍作者人選。
本書的主要內(nèi)容是關(guān)于軟件自動化測試的,作為一個全棧工程師,老徐是從更高的角度來講解測試自動化,將編程語言、軟件測試、軟件工程、面向?qū)ο笤O(shè)計、團隊協(xié)作和軟件應(yīng)用場景講解得清晰而透徹。在文字描述上,本書盡量規(guī)避了正確但晦澀的專業(yè)術(shù)語表達,而是盡量用生活化的場景來生動講解,這讓本書在保持高技術(shù)水準的同時,也非常有特色。值得推薦!
張國強,中科創(chuàng)達戰(zhàn)略合作顧問
前 言
對于任何一支軟件工程團隊來說,軟件測試都是必須認真對待的環(huán)節(jié)。自動化測試由于能夠減少重復人工勞動、提高測試執(zhí)行效率、加快軟件發(fā)布速度,成為軟件工程團隊努力追求的目標。
Python是一種強大而簡潔的編程語言。因為功能強大、適用面廣,它在眾多領(lǐng)域得到了廣泛的應(yīng)用;因為語法簡潔、容易上手,它受到了許多人的青睞,其中就包括軟件測試工程師。
在實際工作中,有很多測試工程師會做簡單的Web UI測試,會用Python寫腳本把一些重復的操作自動化,會用PyTest測試框架的基本功能來寫測試用例,這些都在一定程度上減少了手工重復勞動,這是值得肯定的。但是作為工程師,我們追求的是更高效,而不是更熟練,我們需要不斷學習和思考如何更好地實施自動化測試。本書用Python3作為演示語言,講解如何實施系統(tǒng)、高效、可靠、易于理解和管理的軟件自動化測試。
本書的內(nèi)容分為三個大的板塊。
個板塊,從基礎(chǔ)的部分講起,讓基礎(chǔ)薄弱的工程師對測試和編程語言有基本的認識,可以用Python把一些常見的編程需求實現(xiàn)出來。在此基礎(chǔ)上,我們開始了解PyTest測試框架的基礎(chǔ)用法,以及如何用Selenium來做簡單的Web UI自動化測試。通過這個板塊的學習,測試工程師有能力把一些簡單的測試工作用代碼來實現(xiàn),減少手工重復勞動的比重,做到一定程度的測試自動化,這是對自動化測試工程師的入門要求。
第二個板塊,夯實Python語言基礎(chǔ),講解更深入的PyTest和Selenium特性,演示如何應(yīng)用這些知識來改進測試用例的編寫,改善測試框架,讓測試自動化更加高效。通過對這個板塊的學習,測試工程師對編程語言和測試工具會有更深入的了解,從而更高效地進行測試自動化的工作,開始有能力針對產(chǎn)品特性來設(shè)計自動化測試框架,這是工程團隊對中級測試工程師的一般要求。
第三個板塊,介紹Python的高級特性、面向?qū)ο蟮乃枷、自動化測試工具和框架的高級特性、設(shè)計思路、存在的問題和限制及其改進思路、工程團隊的高質(zhì)量協(xié)作、實際項目中的實踐等更深入的內(nèi)容。這部分包含了實戰(zhàn)中提煉出來的大量經(jīng)驗和總結(jié)。通過對這個板塊的學習,測試工程師可以向高級工程師和架構(gòu)師方向邁出堅實的一步。具備這樣的技術(shù)能力和思維方式后,測試工程師可以在整個軟件工程團隊中起到非常積極的作用,而不只限于測試團隊。
每個板塊的末尾都有一個實戰(zhàn)章節(jié),所有的實戰(zhàn)章節(jié)都圍繞同一個測試場景展開,前后銜接呼應(yīng),有很強的延續(xù)性。每個實戰(zhàn)章節(jié)都是針對相應(yīng)的技術(shù)水平而設(shè)計的,讀者可以非常直觀地看到代碼和設(shè)計如何隨著技術(shù)水平的提升而改進。
本書盡量用生活化的場景來描述編程場景,避免正確但是晦澀的表達,避免直接拋出結(jié)論,而是用實戰(zhàn)項目來演示軟件開發(fā)和測試的思路, 用簡單可行的思路引導讀者去一步步嘗試和驗證,終得到可以理解的結(jié)果。
編程語言和工具在不斷快速演進,學習解決問題的思路遠比直接學習結(jié)論重要。本書針對常見的編程和測試場景講解Python的代碼實現(xiàn),但是不會事無巨細地列舉所有的邊角語言特性。同時,本書會嘗試分析常見的代碼和測試思路,分析其中的不足,提出改進思路,引導讀者理解實際項目中的開發(fā)、測試和協(xié)作方式。在某些內(nèi)容的講解中,本書會嘗試比較Python和其他主流編程語言(比如Java),分析Python獨特的語言特性,也會講解Selenium和PyTest這樣的測試框架和工具在項目實踐中的問題,以及相應(yīng)的解決思路。
對于相關(guān)的專業(yè)術(shù)語,本書會盡量用中文表達。但是有一些術(shù)語如果翻譯成中文可能并不傳神,在實際工作中也不常用,并不會幫助讀者更好地理解它們的含義,對于這種情況,本書會直接用英文表達,詳細介紹可參見后面的術(shù)語表。
本書希望讀者有基本的編程和軟件測試經(jīng)驗,更重要的是,要有在軟件測試的職業(yè)道路上走得更遠的意愿。
在寫作本書的準備過程中,我得到了許多朋友的幫助和鼓勵,這讓我下定決心動筆,逐步厘清寫書的思路,完善自己的知識體系,直至終成書。
謹以此書,致謝宋寶華、張國強、劉勃、黃巍、王錄華、盧鵬、劉濤、何昭然、曾昭毅、邱鵬、周宇、劉陽、李潔、劉靜、甘露、Bryan Turner、Jeff Strater、Daniel Toms、任俊、劉保良、劉春濤、劉志鵬、郝洛玫、周麗、李真真、徐欣、陳然、張翔、張立兵、劉軍、楊文镕等親友,感謝你們在技術(shù)和職業(yè)發(fā)展上對我的幫助和鼓勵。謹以此書,致謝我的鐵匠鋪籃球隊的隊友們,因為有你們多年的陪伴和鼓勵,我才對鍛煉身體沒有懈怠,才能以良好的身體狀態(tài)持續(xù)投入編程和寫書的世界中。謹以此書,向我的父母、岳父母、兄嫂、姐姐和姐夫致謝,你們的言傳身教給了我努力的方向。謹以此書,向我的兒子致遠和女兒致雅表達感激,在陪伴你們成長的過程中,我的內(nèi)心也成長了。謹以此書,向我的秀外慧中的大當家劉璐致以無盡感激,因為有你無怨無悔的付出和全力支持,我才能把工作之余本應(yīng)該陪伴家人的時間騰挪出來,花費一年多的時間寫完這本書。后,對為本書做出巨大貢獻的策劃朱捷老師致以深深的謝意,因為有你從專業(yè)的角度不斷給我中肯的反饋,我才能不斷完善和打磨書稿,竭力為讀者呈現(xiàn)有質(zhì)量的內(nèi)容。
限于篇幅,我無法一一列舉所有想要感謝的人,但我一直心懷感恩,這些年里,我從你們身上學會了很多,收獲了很多,是你們激勵我不斷前行,努力跟上你們的腳步。
本書基于我的學習和工作經(jīng)驗總結(jié)而成,但是因為現(xiàn)實世界里的軟件項目多種多樣,而我本人受限于所涉及的項目類型和技術(shù)視野,加之時間倉促,書中難免有錯誤和疏漏,懇請廣大讀者批評指正。我的郵箱是mac.xxn@outlook.com,歡迎大家和我討論相關(guān)的技術(shù)問題,我會非常樂意和大家交流分享。
徐西寧,畢業(yè)于華中科技大學計算機學院,資深全棧軟件工程師,從事軟件開發(fā)和測試工作15年,先后任職于Autodesk、EMC、每銳軟件等公司,在自動化測試框架設(shè)計、自動化測試流程優(yōu)化、持續(xù)集成、Web開發(fā)等方面有豐富的經(jīng)驗,是一位活躍的開源軟件和技術(shù)分享實踐者。
序一
序二
前言
第1章 軟件測試基礎(chǔ) 1
1.1 什么是軟件測試1
1.2 軟件測試的類型2
1.2.1 按測試對象的顆粒度劃分2
1.2.2 按內(nèi)部邏輯的透明度劃分3
1.2.3 按執(zhí)行階段劃分4
1.2.4 按執(zhí)行方式劃分4
1.3 敏捷開發(fā)模式5
1.4 測試經(jīng)濟學6
1.4.1 測試是必需的嗎6
1.4.2 放棄追求完美7
1.4.3 關(guān)注核心功能8
1.4.4 等價類劃分8
1.4.5 邊界值分析9
1.4.6 用機器取代人工10
1.5 自動化測試不容易12
1.6 本章小結(jié)12
第2章 Python入門 13
2.1 世界上好的兩種編程語言13
2.2 別問我怎么安裝14
2.3 解釋器是什么14
2.4 初識變量16
2.5 函數(shù)基礎(chǔ)17
2.6 代碼縮進和代碼塊18
2.7 字符串19
2.7.1 拼接和格式化21
2.7.2 下標訪問22
2.7.3 更多常見操作23
2.8 數(shù)值類型26
2.8.1 數(shù)值類型的基本運算27
2.8.2 浮點數(shù)的常見運算29
2.9 布爾值和條件判斷32
2.9.1 條件判斷的組合33
2.9.2 條件判斷的短路34
2.9.3 條件判斷的鏈式表達35
2.10 日期和時間36
2.10.1 生成時間對象37
2.10.2 格式化日期字符串38
2.11 list基礎(chǔ)39
2.11.1 下標訪問40
2.11.2 插入元素40
2.11.3 刪除元素41
2.11.4 簡單排序42
2.11.5 更多常見操作43
2.11.6 遍歷44
2.11.7 元素類型46
2.12 dict基礎(chǔ)47
2.12.1 讀取48
2.12.2 插入和更新49
2.12.3 合并50
2.12.4 刪除51
2.12.5 遍歷53
2.12.6 key的選擇55
2.13 循環(huán)56
2.13.1 while循環(huán)57
2.13.2 for循環(huán)58
2.13.3 多重循環(huán)59
2.13.4 循環(huán)的終止60
2.13.5 遞歸63
2.14 異常63
2.14.1 基本語法64
2.14.2 異常的類型67
2.14.3 捕獲特定類型的異常68
2.14.4 主動拋出異常71
2.15 斷言72
2.15.1 assertion72
2.15.2 AssertionError73
2.15.3 assert73
2.16 pip的基礎(chǔ)用法74
2.17 本章小結(jié)76
第3章 PyTest入門 77
3.1 框架是什么77
3.2 測試框架77
3.2.1 篩選測試源文件77
3.2.2 篩選測試函數(shù)78
3.2.3 測試函數(shù)的啟動79
3.2.4 成功還是失敗80
3.2.5 測試報告80
3.2.6 測試前的環(huán)境配置81
3.2.7 測試后的現(xiàn)場清理81
3.2.8 核心功能的擴充82
3.2.9 主流測試框架82
3.3 PyTest是什么83
3.4 自動發(fā)現(xiàn)84
3.4.1 自動發(fā)現(xiàn)測試源文件84
3.4.2 自動發(fā)現(xiàn)測試函數(shù)84
3.5 使用斷言85
3.6 測試結(jié)果解讀86
3.7 測試報告88
3.8 本章小結(jié)89
第4章 Selenium入門 90
4.1 Selenium是什么90
4.1.1 Selenium IDE91
4.1.2 Selenium Grid97
4.1.3 Web Driver98
4.2 Selenium的安裝配置99
4.3 用Web Driver驅(qū)動網(wǎng)頁100
4.4 頁面元素的定位102
4.4.1 簡單定位102
4.4.2 CSS定位107
4.5 頁面元素的常見操作108
4.6 本章小結(jié)112
第5章 實戰(zhàn)12306之入門篇 113
5.1 測試用例設(shè)計文檔113
5.2 代碼實戰(zhàn)114
5.3 代碼解析116
5.3.1 審視測試邏輯116
5.3.2 用變量澄清代碼邏輯117
5.3.3 DRY原則118
5.3.4 改善代碼可讀性120
5.4 本章小結(jié)122
第6章 Python進階 123
6.1 基本數(shù)據(jù)類型的深入了解123
6.1.1 轉(zhuǎn)義字符123
6.1.2 字符串的不可變性124
6.1.3 深入了解布爾類型126
6.1.4 set128
6.1.5 tuple131
6.1.6 整型數(shù)的設(shè)計很優(yōu)秀132
6.1.7 浮點數(shù)為什么算不準133
6.1.8 Decimal,準!134
6.2 深入了解函數(shù)137
6.2.1 函數(shù)的調(diào)用137
6.2.2 函數(shù)的返回138
6.2.3 不支持函數(shù)重載139
6.2.4 默認參數(shù)141
6.2.5 可變參數(shù)142
6.3 關(guān)于時間144
6.3.1 時間差144
6.3.2 UTC時間146
6.4 面向?qū)ο蠡A(chǔ)148
6.4.1 面向?qū)ο蟮降资鞘裁匆馑?48
6.4.2 類和對象148
6.4.3 初始化函數(shù)149
6.5 模塊是什么151
6.6 高級排序153
6.6.1 list的排序153
6.6.2 dict的排序157
6.6.3 自定義對象序列的排序159
6.7 復雜的遍歷場景160
6.7.1 一邊遍歷一邊修改160
6.7.2 一邊遍歷一邊刪除162
6.8 文件和文件系統(tǒng)操作基礎(chǔ)165
6.8.1 路徑的正確操作方式165
6.8.2 文件系統(tǒng)的基本操作168
6.8.3 文本文件的讀169
6.8.4 文本文件的寫170
6.8.5 文本文件的關(guān)閉171
6.8.6 CSV文件的讀寫172
6.8.7 Excel文件的讀寫174
6.9 淺拷貝與深拷貝176
6.10 深入了解import179
6.11 變量的作用域182
6.12 局部變量和全局變量的沖突185
6.13 __name__和__main__186
6.14 注釋188
6.15 pip的工程用法190
6.16 本章小結(jié)192
第7章 PyTest進階 193
7.1 自動發(fā)現(xiàn)測試類193
7.2 測試集合194
7.3 標記195
7.3.1 忽略執(zhí)行195
7.3.2 條件執(zhí)行197
7.3.3 期待失敗的發(fā)生199
7.3.4 限時執(zhí)行201
7.3.5 自定義標簽201
7.4 參數(shù)化測試204
7.5 測試用例的ID206
7.6 Fixture初探207
7.7 PyTest的插件機制209
7.7.1 Hook函數(shù)209
7.7.2 PyTest插件210
7.7.3 多級conftest協(xié)同210
7.7.4 第三方插件212
7.8 本章小結(jié)213
第8章 Selenium進階 214
8.1 頁面元素的XPath定位214
8.2 頁面元素的等待215
8.2.1 隱式等待216
8.2.2 顯式等待216
8.3 Selenium的局限218
8.4 本章小結(jié)219
第9章 實戰(zhàn)12306之進階篇 220
9.1 PO設(shè)計模式220
9.2 更有針對性的顯式等待223
9.3 更健壯的代碼邏輯224
9.4 函數(shù)單一職責原則225
9.5 測試單一職責原則226
9.6 本章小結(jié)227
第10章 Python高階 228
10.1 面向?qū)ο笤O(shè)計思想228
10.1.1 繼承228
10.1.2 封裝230
10.1.3 多態(tài)232
10.2 對類的深入了解233
10.2.1 析構(gòu)函數(shù)233
10.2.2 訪問權(quán)限控制235
10.2.3 self不是關(guān)鍵字236
10.2.4 實例屬性和類屬性239
10.2.5 成員方法和類方法240
10.2.6 類方法和靜態(tài)方法242
10.3 重寫244
10.3.1 如何重寫244
10.3.2 重寫中的代碼復用247
10.3.3 重寫__str__方法249
10.3.4 重寫運算符249
10.4 深入了解函數(shù)252
10.4.1 函數(shù)也是一種對象252
10.4.2 內(nèi)嵌函數(shù)254
10.4.3 函數(shù)裝飾器255
10.4.4 不只是會裝飾259
10.4.5 用Property裝飾器改進設(shè)計261
10.5 None是什么264
10.6 Enum是什么265
10.7 Python不支持常量267
10.8 隨機數(shù)據(jù)和時間戳268
10.9 自定義異常類型270
10.10 需要用強類型嗎271
10.11 日志272
10.12 本章小結(jié)277
第11章 測試框架的設(shè)計和演進 278
11.1 代碼的可讀性278
11.1.1 統(tǒng)一的代碼風格279
11.1.2 丑陋的函數(shù)名280
11.1.3 糟糕的變量名282
11.2 友好的函數(shù)設(shè)計283
11.2.1 簡潔的接口283
11.2.2 操作狀態(tài)的處理285
11.2.3 不要過度設(shè)計287
11.2.4 防呆288
11.3 有效管理測試資源290
11.3.1 封裝微服務(wù)290
11.3.2 統(tǒng)一的資源入口295
11.3.3 資源的延遲加載296
11.3.4 保證資源的釋放298
11.3.5 支持多環(huán)境測試300
11.3.6 容忍不穩(wěn)定的測試環(huán)境302
11.4 不要引入getter和setter304
11.5 一次收集多個斷言錯誤306
11.6 日志的支持和改進308
11.7 減少重復執(zhí)行的負面影響310
11.8 數(shù)據(jù)驅(qū)動測試的設(shè)計311
11.8.1 讓PyTest支持中文ID311
11.8.2 更優(yōu)雅的參數(shù)化測試314
11.8.3 用YML取代JSON316
11.8.4 面向?qū)ο蟮臏y試數(shù)據(jù)317
11.9 接受一定程度的重復代碼319
11.10 本章小結(jié)320
第12章 實戰(zhàn)12306之高階篇 321
12.1 就近原則321
12.2 用Enum澄清設(shè)計意圖322
12.3 支持鏈式表達324
12.4 簡化函數(shù)名325
12.5 封裝復雜邏輯326
12.6 單例設(shè)計模式328
12.7 異常和斷言的使用場景的區(qū)別331
12.8 測試用例的維護333
12.9 本章小結(jié)334
術(shù)語表 335
參考文獻 336
后記 337