內容簡介
《軟體測試:第3版》是經典的軟體測試教材。書中對基礎知識、方法提供了系統的綜合闡述,既涉及基於模型的開發又介紹測試驅動的開發,做到了理論與實踐的完美結合,反映了軟體標準和開發的最新進展和變化。
《軟體測試:第3版》適合作為高等院校計算機學院及軟體學院相關專業軟體測試課程的教材,也是軟體測試領域技術人員的理想參考書。
譯者序
很長時間以來,我們一直關注著軟體測試技術的發展。工作在計算機科學與技術領域中,如何確保軟體產品在實際工作中“不出錯”,是我們時刻都要面對的一個非常現實的問題。目前大量關於軟體測試方面的專著和教材已經面市,從中可以看到許多不同的測試原理與測試方法。如何科學地選擇和運用這些測試原理與技術,在很大程度上取決於個人的經驗。同時,對諸如如何評價軟體測試的結果,測試後的軟體是否還有殘留缺陷,殘留的缺陷對軟體有何影響等問題,目前還沒有一個統一的評估標準。因此,我們認為,軟體開發人員應該是軟體測試的行家,軟體測試人員也應該是軟體開發的高手。在大力培養軟體開發人才的同時大力培養軟體測試人才,並特別重視其對科學的思維方式的培養,對軟體行業的發展至關重要。
原書是作者在總結長期從事軟體設計、開發與測試工作經驗的基礎上,融合近年在軟體測試教學工作中的心得體會而寫成的。本書是第3版,較前兩版最主要的改動是增加了在更高層次上對軟體測試整體策略的全面討論。本書的重要特點是:對軟體測試理論與技術的介紹層次分明、全面精當;以若干實例為線索展開內容,循序漸進,便於讀者掌握;在很多章節的最後,還提供深入的對比和討論,總結了在軟體測試中普遍存在的實際問題,精闢深刻;此外,原書在語言上不拘一格,多有詼諧之處,這也是我們翻譯過程中所要面對的一項挑戰。
在翻譯過程中,我們在忠實於原文的同時,針對軟體測試工作所涉及的各種理論與技術進行了整理和推敲,對基礎理論和技術概念儘可能採用相關學科的主流說法,對新技術和新名詞儘可能使用業界當前流行的說法,以期使全書更易於理解、更標準和更科學;對作者舉例時講述的故事,則力求通俗流暢,保持原書的韻味。
《軟體測試:第3版》由李海峰翻譯第1~10章和第21~23章,馬琳翻譯第11~20章、第24章和第25章,李海峰對全書進行了審校和潤色。在翻譯工作中我們借鑑了《軟體測試:第3版》前兩版和其他同類著作,在此我們向其作譯者表示深深的謝意。對人民郵電出版社編輯的艱苦工作和大力支持表示深深的感謝。
好作品必然是經過了反覆修改才日臻完善的。由於時間有限,加上譯者的知識水平和實際工作經驗有限,不當之處在所難免,懇請讀者和同行批評指正,提出寶貴意見。
海峰馬琳
2010年10月於哈工大
目錄
第一部分 數學基礎
第1章 測試概述 2
1.1 基本概念 2
1.2 測試用例 3
1.3 通過維恩圖來考察測試 4
1.4 構造測試用例 5
1.4.1 功能測試 6
1.4.2 結構測試 7
1.4.3 功能測試與結構測試之爭 7
1.5 錯誤與故障差異 8
1.6 測試的層次 10
參考文獻 11
習題 11
第2章 程式示例 12
2.1 通用偽代碼 12
2.2 三角形問題 13
2.2.1 問題描述 13
2.2.2 三角形問題的討論 14
2.2.3 三角形問題的經典實現 14
.2.2.4 三角形問題的結構化實現 16
2.3 nextdate函式 18
2.3.1 問題描述 18
2.3.2 nextdate函式的討論 18
2.3.3 nextdate函式的實現 19
2.4 佣金問題 21
2.4.1 問題描述 21
2.4.2 佣金問題的討論 22
2.4.3 佣金問題的實現 22
2.5 satm系統 23
2.5.1 問題描述 23
2.5.2 satm系統的討論 25
2.6 貨幣轉換器 25
2.7 雨刷控制器 26
參考文獻 26
習題 26
第3章 測試人員的離散數學 28
3.1 集合論 28
3.1.1 集合的成員關係 28
3.1.2 集合的定義方法 28
3.1.3 空集 29
3.1.4 集合的維恩圖 29
3.1.5 集合運算 30
3.1.6 集合關係 32
3.1.7 集合劃分 32
3.1.8 集合恆等 33
3.2 函式 33
3.2.1 定義域與值域 34
3.2.2 函式的類型 34
3.2.3 函式複合 35
3.3 關係 36
3.3.1 集合之間的關係 36
3.3.2 單個集合上的關係 37
3.4 命題邏輯 38
3.4.1 邏輯運算符 39
3.4.2 邏輯表達式 39
3.4.3 邏輯等價 40
3.5 機率論 40
參考文獻 41
習題 42
第4章 測試人員的圖論 43
4.1 圖 43
4.1.1 節點的度 44
4.1.2 關聯矩陣 44
4.1.3 鄰接矩陣 45
4.1.4 路徑 45
4.1.5 連通性 46
4.1.6 壓縮圖 46
4.1.7 圈數 46
4.2 有向圖 47
4.2.1 入度與出度 48
4.2.2 節點類型 48
4.2.3 有向圖的鄰接矩陣 48
4.2.4 路徑與半路徑 49
4.2.5 可達矩陣 49
4.2.6 n連通性 50
4.2.7 強分圖 50
4.3 軟體測試中常用的圖 51
4.3.1 程式圖 51
4.3.2 有限狀態機 52
4.3.3 petri網 53
4.3.4 事件驅動petri網 55
4.3.5 狀態圖 57
參考文獻 58
習題 58
第二部分 功能測試
第5章 邊界值測試 62
5.1 邊界值分析 62
5.1.1 邊界值分析的拓展 63
5.1.2 邊界值分析的局限性 64
5.2 健壯性測試 64
5.3 最壞情況測試 65
5.4 特殊值測試 66
5.5 示例 66
5.5.1 三角形問題的測試用例 66
5.5.2 nextdate函式的測試用例 68
5.5.3 佣金問題的測試用例 68
5.6 隨機測試 70
5.7 邊界值測試的原則 72
習題 72
第6章 等價類測試 73
6.1 等價類 73
6.1.1 弱一般等價類測試 74
6.1.2 強一般等價類測試 74
6.1.3 弱健壯等價類測試 74
6.1.4 強健壯等價類測試 75
6.2 三角形問題的等價類測試用例 75
6.3 nextdate函式的等價類測試用例 77
6.4 佣金問題的等價類測試用例 80
6.5 原則與注意事項 82
參考文獻 82
習題 82
第7章 基於決策表的測試 84
7.1 決策表 84
7.2 三角形問題的測試用例 88
7.3 nextdate函式的測試用例 88
7.3.1 第一輪嘗試 88
7.3.2 第二輪嘗試 89
7.3.3 第三輪嘗試 90
7.4 佣金問題的測試用例 92
7.5 原則與注意事項 93
參考文獻 93
習題 93
第8章 功能測試回顧 94
8.1 測試的工作量 94
8.2 測試的效率 96
8.3 測試的有效性 97
8.4 原則 98
8.5 案例研究 99
第三部分 結構測試
第9章 路徑測試 104
9.1 dd路徑 106
9.2 測試覆蓋指標 108
9.2.1 基於指標的測試 108
9.2.2 測試覆蓋分析器 110
9.3 基路徑測試 110
9.3.1 mccabe的基路徑方法 111
9.3.2 mccabe基路徑方法的注意事項 113
9.3.3 mccabe方法的基本複雜度 114
9.4 原則與注意事項 117
參考文獻 118
習題 118
第10章 數據流測試 120
10.1 定義/使用測試 120
10.1.1 舉例 121
10.1.2 stocks的定義使用路徑 125
10.1.3 locks的定義使用路徑 125
10.1.4 totallocks的定義使用路徑 125
10.1.5 sales的定義使用路徑 126
10.1.6 commission的定義使用路徑 126
10.1.7 定義使用路徑的測試覆蓋指標 127
10.2 基於片的測試 128
10.2.1 舉例 129
10.2.2 風格與方法 132
10.3 原則與注意事項 133
參考文獻 134
習題 134
第11章 結構測試回顧 135
11.1 缺漏與冗餘 135
11.2 用於評估測試方法的指標 137
11.3 重新修訂的案例研究 139
11.3.1 基於路徑的測試 141
11.3.2 數據流測試 141
11.3.3 片測試 141
參考文獻 142
習題 142
第四部分 集成測試和系統測試
第12章 測試的層次 144
12.1 測試層次劃分的傳統觀點 144
12.2 其他生命周期模型 145
12.2.1 瀑布模型的變體 146
12.2.2 基於規格說明的生命周期模型 147
12.3 satm系統 149
12.4 將集成測試與系統測試分開 157
12.4.1 從結構角度分析 158
12.4.2 從行為角度分析 159
參考文獻 159
第13章 集成測試 160
13.1 深入研究satm系統 160
13.2 基於功能分解的集成 164
13.2.1 自頂向下集成 164
13.2.2 自底向上集成 166
13.2.3 三明治集成 166
13.2.4 優缺點 167
13.3 基於調用圖的集成 167
13.3.1 成對集成 167
13.3.2 相鄰集成 168
13.3.3 基於調用圖集成的優缺點 169
13.4 基於路徑的集成 170
13.4.1 新概念與擴展概念 170
13.4.2 satm系統中的mm路徑 172
13.4.3 mm路徑複雜度 176
13.4.4 基於路徑集成技術的優缺點 177
13.5 案例分析 177
13.5.1 基於分解的集成 181
13.5.2 基於調用圖的集成 181
13.5.3 基於mm路徑的集成 181
參考文獻 182
習題 182
第14章 系統測試 184
14.1 線索 184
14.1.1 線索存在的可能性 185
14.1.2 線索定義 186
14.2 需求規格說明的基本概念 187
14.2.1 數據 187
14.2.2 行為 188
14.2.3 設備 188
14.2.4 事件 188
14.2.5 線索 189
14.2.6 基本概念之間的關係 189
14.2.7 利用基本概念建模 189
14.3 尋找線索 190
14.4 線索測試的結構策略 193
14.4.1 自底向上組織線索 194
14.4.2 節點與邊覆蓋指標 194
14.5 線索測試的功能策略 196
14.5.1 基於事件的線索測試 196
14.5.2 基於連線埠的線索測試 197
14.5.3 基於數據的線索測試 197
14.6 satm測試線索 199
14.7 系統測試原則 203
14.7.1 偽結構系統測試 203
14.7.2 性能分析 204
14.7.3 累進測試與回歸測試 206
14.8 asf測試示例 206
參考文獻 208
習題 208
第15章 互動性測試 209
15.1 互動的語境 209
15.2 互動的分類 211
15.2.1 單處理器中的靜態互動 211
15.2.2 多處理器中的靜態互動 212
15.2.3 單處理器中的動態互動 213
15.2.4 多處理器中的動態互動 217
15.3 線索的互動、合成和確定性 223
15.4 客戶/伺服器系統的測試 224
參考文獻 225
習題 226
第五部分 面向對象測試
第16章 面向對象測試的相關問題 228
16.1 面向對象測試的單元 228
16.2 合成與封裝的含義 229
16.3 繼承的含義 230
16.4 多態性的含義 231
16.5 面向對象測試的層次 232
16.6 gui測試 232
16.7 面向對象軟體的數據流測試 232
16.8 第五部分所採用的示例 232
16.8.1 面向對象的日曆程式 232
16.8.2 貨幣轉換應用程式 234
參考文獻 238
習題 238
第17章 類測試 239
17.1 以方法為單元的測試 239
17.1.1 o-ocalendar 的偽代碼 240
17.1.2 date.increment 的單元測試 244
17.2 以類為單元的測試 245
17.2.1 windshieldwiper類的偽代碼 245
17.2.2 windshieldwiper類的單元測試 246
第18章 面向對象的集成測試 250
18.1 uml對集成測試的支持 250
18.2 面向對象軟體的mm路徑 252
18.3 面向對象數據流集成測試的框架 259
18.3.1 事件驅動和訊息驅動的petri網 259
18.3.2 由繼承導出的數據流 260
18.3.3 由訊息導出的數據流 261
18.3.4 是否需要片 261
參考文獻 261
習題 262
第19章 gui測試 264
19.1 貨幣轉換程式 264
19.2 貨幣轉換程式的單元測試 264
19.3 貨幣轉換程式的集成測試 265
19.4 貨幣轉換程式的系統測試 267
習題 272
第20章 面向對象的系統測試 273
20.1 貨幣轉換器的uml描述 273
20.1.1 問題陳述 273
20.1.2 系統功能 273
20.1.3 表示層 274
20.1.4 高層用例 274
20.1.5 基本用例 275
20.1.6 詳細的gui定義 276
20.1.7 擴展的基本用例 276
20.1.8 真實用例 279
20.2 基於uml的系統測試 280
20.3 基於狀態圖的系統測試 282
參考文獻 282
第六部分 新興測試技術
第21章 探索式測試 284
21.1 上下文驅動學派 284
21.2 探索式測試 285
21.3 探索一個常見示例 287
21.4 探索式測試與上下文驅動測試探討 288
參考文獻 289
習題 289
第22章 基於模型測試 290
22.1 基於模型進行測試 290
22.2 恰當的系統模型 290
22.2.1 peterson格 291
22.2.2 主流模型的表達能力 292
22.2.3 選擇恰當的模型 292
22.3 基於用例的測試 293
22.3.1 從用例中推導出測試用例 293
22.3.2 互動用例 294
22.3.3 需要多少用例 295
22.4 支持基於模型的測試的商用工具 295
參考文獻 296
第23章 測試驅動開發 297
23.1 “測試然後編碼”的軟體開發周期 297
23.2 自動化測試執行(測試框架) 304
23.3 java和junit示例 305
23.3.1 java原始碼 306
23.3.2 junit測試代碼 307
23.4 其他待解決的問題 308
23.4.1 基於規格說明還是基於代碼 308
23.4.2 需要配置管理嗎 309
23.4.3 粒度應該多大 309
23.5 測試驅動開發的優缺點及其他相關問題 310
23.6 模型驅動開發與測試驅動開發對比 311
第24章 全對測試詳述 315
24.1 全對測試技術 315
24.1.1 程式輸入 316
24.1.2 獨立變數 317
24.1.3 輸入的順序 319
24.1.4 完全由輸入所引發的失效 322
24.2 對nist研究成果的進一步分析 322
24.3 全對測試的適用範圍 323
24.4 對全對測試的建議 324
參考文獻 324
第25章 尾聲:軟體測試精益求精 325
25.1 軟體測試是一種技藝 325
25.2 軟體測試的最佳實踐 326
25.3 讓軟體測試更出色的10項最佳實踐 327
25.3.1 模型驅動開發 327
25.3.2 慎重地定義與劃分測試的層次 327
25.3.3 基於模型的系統級測試 328
25.3.4 系統測試的擴展 328
25.3.5 利用關聯矩陣指導回歸測試 328
25.3.6 利用mm路徑實現集成測試 328
25.3.7 把基於規格說明的測試和基於代碼的單元級測試有機地結合起來 328
25.3.8 基於單個單元特性的代碼覆蓋指標 329
25.3.9 維護階段的探索式測試 329
25.3.10 測試驅動開發 329
25.4 針對不同項目實現最佳實踐 329
25.4.1 任務關鍵型項目 329
25.4.2 時間關鍵型項目 330
25.4.3 對遺留代碼的糾錯維護 330