本書是經(jīng)典的軟件測試教材,也可作為軟件測試者、開發(fā)者和工程師的參考書。書中對(duì)基礎(chǔ)知識(shí)、方法提供了系統(tǒng)的綜合闡述,既涉及基于模型的開發(fā),又介紹了測試驅(qū)動(dòng)的開發(fā),做到了理論與實(shí)踐的完美結(jié)合,反映了軟件標(biāo)準(zhǔn)和開發(fā)的新進(jìn)展和變化。
Software Testing:A Craftsman’s Approach,Fourth Edition此次再版,我們?cè)黾恿怂恼滦聝?nèi)容,同時(shí)更加深入地討論了基于路徑的測試,從而拓展了本書18年以來一直側(cè)重基于模型測試的傳統(tǒng)。此前本書已經(jīng)再版三次,經(jīng)過了18年的教學(xué)和業(yè)界使用的檢驗(yàn)。借助精心挑選的簡單易懂的實(shí)例,本書把理論與實(shí)踐緊密地結(jié)合在一起。此外,很多第3版中的內(nèi)容被合并、重組在一起,使全書內(nèi)容更加簡潔流暢。把很多面向?qū)ο筌浖䴗y試的內(nèi)容和過程軟件測試(procedural software testing)整合在一起形成了一個(gè)有機(jī)的整體。還有就是針對(duì)美國聯(lián)邦航空管理局和美國國防部有關(guān)標(biāo)準(zhǔn)的要求,在“路徑測試”一章中擴(kuò)充了復(fù)雜條件測試(complex condition testing)和修正的條件判定覆蓋率(modified condition decision coverage)指標(biāo)等內(nèi)容。
這一版新增加的章節(jié)如下:
軟件技術(shù)評(píng)審(第22章)。側(cè)重軟件技術(shù)檢驗(yàn),這實(shí)際上被視為“靜態(tài)測試”,而本書的前三版一直側(cè)重于討論如何利用精心挑選的測試用例來執(zhí)行代碼的“動(dòng)態(tài)測試”。本章內(nèi)容實(shí)際上來自一個(gè)軟件開發(fā)公司20多年來的產(chǎn)業(yè)實(shí)踐經(jīng)驗(yàn),該公司具有完善的技術(shù)評(píng)審流程。
附錄。附錄中給出了一套完整的用例集(采用UML),可以針對(duì)典型的客戶需求實(shí)現(xiàn)實(shí)際產(chǎn)業(yè)開發(fā)所要求的技術(shù)檢驗(yàn)。其中包括用例標(biāo)準(zhǔn)、用例故障嚴(yán)重程度定義、潛在問題的技術(shù)檢驗(yàn)事項(xiàng)表,以及典型評(píng)審報(bào)告和最終報(bào)告的格式文檔。
基于模型的綜合系統(tǒng)測試(第17章)。由系統(tǒng)構(gòu)成復(fù)雜系統(tǒng)的問題相對(duì)還是較新的(始于1999年)。軟件測試從業(yè)人員現(xiàn)在是在追隨幾位大學(xué)研究人員的步伐,主要關(guān)注如何界定一個(gè)由若干系統(tǒng)構(gòu)成的復(fù)雜系統(tǒng)。這一章介紹了“泳道事件驅(qū)動(dòng)Petri網(wǎng)”,在表達(dá)能力上接近著名的狀態(tài)圖方法。有了它就可以對(duì)復(fù)雜系統(tǒng)實(shí)施基于模型的測試。
軟件復(fù)雜度(第16章)。目前大部分文獻(xiàn)都僅考察了在單元層面上的圈復(fù)雜度(cyclomatic,也稱為McCabe)。本章從兩個(gè)方面拓展了對(duì)單元層面復(fù)雜度的考量,引進(jìn)了兩種集成層面上的復(fù)雜度。對(duì)面向?qū)ο缶幊毯拖到y(tǒng)層面的測試來說,需要涉及對(duì)復(fù)雜度的處理。在任何層面上,對(duì)復(fù)雜度的考量都是提升設(shè)計(jì)、編碼、測試和維護(hù)工作的重要手段。保持一種一致的軟件復(fù)雜度表述,對(duì)每個(gè)階段都有很大的促進(jìn)作用。
測試用例的評(píng)估(第21章)。新增的這一章要研究一個(gè)難題:如何評(píng)估一個(gè)測試用例集?測試覆蓋性是長期以來為人所接受的指標(biāo),但是其中總有一定程度的不確定性。古羅馬關(guān)于“誰來守衛(wèi)衛(wèi)兵”的問題,在此變成了“誰來評(píng)估測試”的問題。十幾年來,變異測試(mutation testing)逐漸成為一種解決方案,所以本章對(duì)其效果和貢獻(xiàn)進(jìn)行了介紹,同時(shí)也介紹了另外兩種方法:漏洞挖掘(fuzzing)和故障注入(fault insertion)。
做了47年的軟件開發(fā)人員和大學(xué)教授,我認(rèn)為自己的軟件測試知識(shí)既有深度也有廣度。在大學(xué)里,我一直在數(shù)學(xué)系和計(jì)算機(jī)系授課,同時(shí)我還有20多年的工業(yè)軟件開發(fā)和管理經(jīng)驗(yàn),這些經(jīng)歷使我能夠很好地編寫和改進(jìn)我的軟件測試教程并不斷加深對(duì)于軟件測試的理解。在我講到書本以外的內(nèi)容時(shí),我經(jīng)常會(huì)不斷地產(chǎn)生新的看法。所以,我把本書的出版視為我對(duì)軟件測試領(lǐng)域做出的一點(diǎn)貢獻(xiàn)。最后,我還要感謝我的三位同事Roger Ferguson博士、Jagadeesh Nandigam博士和Christian Trefftz博士,感謝他們?cè)诿嫦驅(qū)ο鬁y試這幾章的撰寫中給予我的巨大幫助。
非常感謝!
Paul C.Jorgensen于密歇根州羅克福德市
paul c.jorgensen博士,在其職業(yè)生涯的前20年中,主要從事電話交換系統(tǒng)的開發(fā)、支持和測試工作。1986年以來,他一直在大學(xué)為研究生講授軟件工程課程,先是亞利桑那州立大學(xué),然后在大峽谷州立大學(xué)。
目 錄
Software Testing: A Craftsman’s Approach, Fourth Edition
出版者的話
譯者序
前言
第一部分 數(shù)學(xué)基礎(chǔ)
第1章 測試概述 2
1.1 基本概念 2
1.2 測試用例 3
1.3 利用維恩圖來理解軟件測試 3
1.4 構(gòu)造測試用例 4
1.4.1 基于規(guī)格說明的測試 5
1.4.2 基于代碼的測試 5
1.4.3 兩種測試方法的對(duì)比 6
1.5 故障的分類 7
1.6 測試的層次 8
1.7 習(xí)題 8
1.8 參考文獻(xiàn) 8
第2章 程序示例 9
2.1 通用偽代碼 9
2.2 三角形問題 10
2.2.1 問題描述 10
2.2.2 三角形問題的討論 11
2.2.3 三角形問題的經(jīng)典實(shí)現(xiàn) 11
2.2.4 三角形問題的結(jié)構(gòu)化實(shí)現(xiàn) 14
2.3 NextDate日期函數(shù) 15
2.3.1 問題描述 15
2.3.2 NextDate函數(shù)的討論 16
2.3.3 NextDate函數(shù)的實(shí)現(xiàn) 16
2.4 傭金問題 18
2.4.1 問題描述 18
2.4.2 傭金問題的討論 19
2.4.3 傭金問題的實(shí)現(xiàn) 19
2.5 SATM系統(tǒng) 20
2.5.1 問題描述 20
2.5.2 SATM系統(tǒng)的討論 21
2.6 貨幣兌換計(jì)算器 22
2.7 雨刷控制器 22
2.8 車庫門遙控開關(guān) 22
2.9 習(xí)題 23
2.10 參考文獻(xiàn) 24
第3章 面向測試人員的離散數(shù)學(xué) 25
3.1 集合論 25
3.1.1 集合的成員關(guān)系 25
3.1.2 集合的定義方法 25
3.1.3 空集 26
3.1.4 集合的維恩圖 26
3.1.5 集合運(yùn)算 27
3.1.6 集合關(guān)系 28
3.1.7 集合劃分 29
3.1.8 集合恒等 29
3.2 函數(shù) 30
3.2.1 定義域與值域 30
3.2.2 函數(shù)類型 30
3.2.3 函數(shù)復(fù)合 31
3.3 關(guān)系 32
3.3.1 集合之間的關(guān)系 32
3.3.2 單個(gè)集合上的關(guān)系 33
3.4 命題邏輯 34
3.4.1 邏輯運(yùn)算符 34
3.4.2 邏輯表達(dá)式 35
3.4.3 邏輯等價(jià) 35
3.5 概率論 36
3.6 習(xí)題 37
3.7 參考文獻(xiàn) 37
第4章 面向測試人員的圖論 38
4.1 圖 38
4.1.1 節(jié)點(diǎn)的度 38
4.1.2 關(guān)聯(lián)矩陣 39
4.1.3 鄰接矩陣 39
4.1.4 路徑 40
4.1.5 連通性 40
4.1.6 壓縮圖 41
4.1.7 圈數(shù) 41
4.2 有向圖 41
4.2.1 入度與出度 42
4.2.2 節(jié)點(diǎn)類型 42
4.2.3 有向圖的鄰接矩陣 43
4.2.4 路徑與半路徑 43
4.2.5 可達(dá)矩陣 44
4.2.6 n連通性 44
4.2.7 強(qiáng)分圖 44
4.3 軟件測試中常用的圖 45
4.3.1 程序圖 45
4.3.2 有限狀態(tài)機(jī) 46
4.3.3 Petri網(wǎng) 47
4.3.4 事件驅(qū)動(dòng)Petri網(wǎng) 49
4.3.5 狀態(tài)圖 50
4.4 習(xí)題 52
4.5 參考文獻(xiàn) 52
第二部分 單元測試
第5章 邊界值測試 54
5.1 邊界值分析 54
5.1.1 邊界值分析的拓展 55
5.1.2 邊界值分析的局限性 56
5.2 健壯性測試 56
5.3 最壞情況測試 57
5.4 特殊值測試 57
5.5 示例 58
5.5.1 三角形問題的測試用例 58
5.5.2 NextDate函數(shù)的測試用例 59
5.5.3 傭金問題的測試用例 60
5.6 隨機(jī)測試 62
5.7 邊界值測試的原則 63
5.8 習(xí)題 65
第6章 等價(jià)類測試 66
6.1 等價(jià)類 66
6.2 傳統(tǒng)的等價(jià)類測試 66
6.3 改進(jìn)的等價(jià)類測試 67
6.3.1 弱一般等價(jià)類測試 68
6.3.2 強(qiáng)一般等價(jià)類測試 68
6.3.3 弱健壯等價(jià)類測試 68
6.3.4 強(qiáng)健壯等價(jià)類測試 69
6.4 三角形問題的等價(jià)類測試用例 69
6.5 NextDate函數(shù)的等價(jià)類測試用例 71
6.6 傭金問題的等價(jià)類測試用例 73
6.7 邊緣測試 75
6.8 原則與注意事項(xiàng) 75
6.9 習(xí)題 76
6.10 參考文獻(xiàn) 76
第7章 基于決策表的測試 77
7.1 決策表 77
7.2 決策表使用技巧 77
7.3 三角形問題的測試用例 80
7.4 Next Date函數(shù)的測試用例 81
7.4.1 第一輪嘗試 81
7.4.2 第二輪嘗試 82
7.4.3 第三輪嘗試 83
7.5 傭金問題的測試用例 85
7.6 因果關(guān)系圖 85
7.7 原則與注意事項(xiàng) 86
7.8 習(xí)題 87
7.9 參考文獻(xiàn) 87
第8章 路徑測試 88
8.1 程序圖 88
8.2 DD路徑 90
8.3 測試覆蓋指標(biāo) 92
8.3.1 基于程序圖的覆蓋度量方法 92
8.3.2 E. F. Miller的覆蓋度量方法 92
8.3.3 復(fù)合條件下的閉合路徑 95
8.3.4 示例 96
8.3.5 測試覆蓋分析器 99
8.4 基路徑測試 99
8.4.1 McCabe的基路徑方法 100
8.4.2 McCabe基路徑方法的考慮 102
8.4.3 McCabe方法的基本復(fù)雜度 103
8.5 原則與注意事項(xiàng) 105
8.6 習(xí)題 105
8.7 參考文獻(xiàn) 106
第9章 數(shù)據(jù)流測試 107
9.1 定義/使用測試 107
9.1.1 舉例 108
9.1.2 stocks的定義使用路徑 110
9.1.3 locks的定義使用路徑 110
9.1.4 totalLocks的定義使用路徑 113
9.1.5 sales的定義使用路徑 113
9.1.6 commission的定義使用路徑 115
9.1.7 定義使用路徑的測試覆蓋指標(biāo) 115
9.1.8 面向?qū)ο缶幋a的定義/使用測試 116
9.2 基于程序切片的測試 116
9.2.1 舉例 118
9.2.2 風(fēng)格與技術(shù) 122
9.2.3 切片拼接 123
9.3 程序切片工具 124
9.4 習(xí)題 125
9.5 參考文獻(xiàn) 125
第10章 單元測試回顧 126
10.1 測試方法的搖擺 126
10.2 測試方法搖擺問題探索 128
10.3 用于評(píng)估測試方法的指標(biāo) 131
10.4 重新