《軟體測試:一個軟體工藝師的方法(原書第4版)》是2017年機械工業出版社出版的圖書,作者是[美]保羅 C. 喬根森(Paul C. Jorgensen)。
基本介紹
- 書名:軟體測試:一個軟體工藝師的方法(原書第4版)
- 作者:[美]保羅 C. 喬根森(Paul C. Jorgensen)
- ISBN:978-7-111-58131-4
- 定價:¥79.00
- 出版社:機械工業出版社
- 出版時間:2017-11
- 開本:16
基本信息,內容簡介,目錄,
基本信息
作者:[美]保羅 C. 喬根森(Paul C. Jorgensen)著 |
ISBN(書號):978-7-111-58131-4 |
叢書名:計算機科學叢書 |
出版日期:2017-11 |
版次:1/1 |
開本:16 |
定價:¥79.00 |
內容簡介
本書是經典的軟體測試教材,綜合闡述了軟體測試的基礎知識和方法,既涉及基於模型的開發,又介紹測試驅動的開發,做到了理論與實踐的完美結合,反映了軟體標準和開發的新進展和變化。
作者保羅 C. 喬根森具有豐富的軟體開發及測試教學和研發經驗,他在書中藉助精心挑選的實例,把軟體測試理論與實踐緊密結合,講解循序漸進、層次分明,便於讀者理解。
第4版重新規劃了篇章結構,內容更加簡潔流暢,增加了四章有實用價值的新內容,同時更加深入地討論了基於路徑的測試,從而拓展了本書一直側重基於模型測試的傳統。
第4版新增內容
第16章“軟體複雜度”增加了對面向對象編程和系統層面測試的複雜度的處理。
第17章“基於模型的綜合系統測試”介紹了一種改進方法——“泳道事件驅動Petri網”,它可以對複雜系統實施基於模型的測試。
第21章“測試用例的評估”則增加了對愈發普及的變異測試的介紹,用以同漏洞挖掘和故障注入方法進行對比。
第22章“軟體技術評審”是基於一個軟體開發公司20多年來的實際經驗撰寫的,側重軟體技術檢驗;附錄中給出一套完整的用例集,可以針對客戶需求實現實際開發所要求的技術檢驗
作者保羅 C. 喬根森具有豐富的軟體開發及測試教學和研發經驗,他在書中藉助精心挑選的實例,把軟體測試理論與實踐緊密結合,講解循序漸進、層次分明,便於讀者理解。
第4版重新規劃了篇章結構,內容更加簡潔流暢,增加了四章有實用價值的新內容,同時更加深入地討論了基於路徑的測試,從而拓展了本書一直側重基於模型測試的傳統。
第4版新增內容
第16章“軟體複雜度”增加了對面向對象編程和系統層面測試的複雜度的處理。
第17章“基於模型的綜合系統測試”介紹了一種改進方法——“泳道事件驅動Petri網”,它可以對複雜系統實施基於模型的測試。
第21章“測試用例的評估”則增加了對愈發普及的變異測試的介紹,用以同漏洞挖掘和故障注入方法進行對比。
第22章“軟體技術評審”是基於一個軟體開發公司20多年來的實際經驗撰寫的,側重軟體技術檢驗;附錄中給出一套完整的用例集,可以針對客戶需求實現實際開發所要求的技術檢驗
目錄
出版者的話
譯者序
前言
第一部分 數學基礎
第1章 測試概述 2
1.1 基本概念 2
1.2 測試用例 3
1.3 利用維恩圖來理解軟體測試 3
1.4 構造測試用例 4
1.4.1 基於規格說明的測試 5
1.4.2 基於代碼的測試 5
1.4.3 兩種測試方法的對比 6
1.5 故障的分類 7
1.6 測試的層次 8
1.7 習題 8
1.8 參考文獻 8
第2章 程式示例 9
2.1 通用偽代碼 9
2.2 三角形問題 10
2.2.1 問題描述 10
2.2.2 三角形問題的討論 11
2.2.3 三角形問題的經典實現 11
2.2.4 三角形問題的結構化實現 14
2.3 NextDate日期函式 15
2.3.1 問題描述 15
2.3.2 NextDate函式的討論 16
2.3.3 NextDate函式的實現 16
2.4 佣金問題 18
2.4.1 問題描述 18
2.4.2 佣金問題的討論 19
2.4.3 佣金問題的實現 19
2.5 SATM系統 20
2.5.1 問題描述 20
2.5.2 SATM系統的討論 21
2.6 貨幣兌換計算器 22
2.7 雨刷控制器 22
2.8 車庫門遙控開關 22
2.9 習題 23
2.10 參考文獻 24
第3章 面向測試人員的離散數學 25
3.1 集合論 25
3.1.1 集合的成員關係 25
3.1.2 集合的定義方法 25
3.1.3 空集 26
3.1.4 集合的維恩圖 26
3.1.5 集合運算 27
3.1.6 集合關係 28
3.1.7 集合劃分 29
3.1.8 集合恆等 29
3.2 函式 30
3.2.1 定義域與值域 30
3.2.2 函式類型 30
3.2.3 函式複合 31
3.3 關係 32
3.3.1 集合之間的關係 32
3.3.2 單個集合上的關係 33
3.4 命題邏輯 34
3.4.1 邏輯運算符 34
3.4.2 邏輯表達式 35
3.4.3 邏輯等價 35
3.5 機率論 36
3.6 習題 37
3.7 參考文獻 37
第4章 面向測試人員的圖論 38
4.1 圖 38
4.1.1 節點的度 38
4.1.2 關聯矩陣 39
4.1.3 鄰接矩陣 39
4.1.4 路徑 40
4.1.5 連通性 40
4.1.6 壓縮圖 41
4.1.7 圈數 41
4.2 有向圖 41
4.2.1 入度與出度 42
4.2.2 節點類型 42
4.2.3 有向圖的鄰接矩陣 43
4.2.4 路徑與半路徑 43
4.2.5 可達矩陣 44
4.2.6 n連通性 44
4.2.7 強分圖 44
4.3 軟體測試中常用的圖 45
4.3.1 程式圖 45
4.3.2 有限狀態機 46
4.3.3 Petri網 47
4.3.4 事件驅動Petri網 49
4.3.5 狀態圖 50
4.4 習題 52
4.5 參考文獻 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函式的測試用例 59
5.5.3 佣金問題的測試用例 60
5.6 隨機測試 62
5.7 邊界值測試的原則 63
5.8 習題 65
第6章 等價類測試 66
6.1 等價類 66
6.2 傳統的等價類測試 66
6.3 改進的等價類測試 67
6.3.1 弱一般等價類測試 68
6.3.2 強一般等價類測試 68
6.3.3 弱健壯等價類測試 68
6.3.4 強健壯等價類測試 69
6.4 三角形問題的等價類測試用例 69
6.5 NextDate函式的等價類測試用例 71
6.6 佣金問題的等價類測試用例 73
6.7 邊緣測試 75
6.8 原則與注意事項 75
6.9 習題 76
6.10 參考文獻 76
第7章 基於決策表的測試 77
7.1 決策表 77
7.2 決策表使用技巧 77
7.3 三角形問題的測試用例 80
7.4 Next Date函式的測試用例 81
7.4.1 第一輪嘗試 81
7.4.2 第二輪嘗試 82
7.4.3 第三輪嘗試 83
7.5 佣金問題的測試用例 85
7.6 因果關係圖 85
7.7 原則與注意事項 86
7.8 習題 87
7.9 參考文獻 87
第8章 路徑測試 88
8.1 程式圖 88
8.2 DD路徑 90
8.3 測試覆蓋指標 92
8.3.1 基於程式圖的覆蓋度量方法 92
8.3.2 E. F. Miller的覆蓋度量方法 92
8.3.3 複合條件下的閉合路徑 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方法的基本複雜度 103
8.5 原則與注意事項 105
8.6 習題 105
8.7 參考文獻 106
第9章 數據流測試 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 定義使用路徑的測試覆蓋指標 115
9.1.8 面向對象編碼的定義/使用測試 116
9.2 基於程式切片的測試 116
9.2.1 舉例 118
9.2.2 風格與技術 122
9.2.3 切片拼接 123
9.3 程式切片工具 124
9.4 習題 125
9.5 參考文獻 125
第10章 單元測試回顧 126
10.1 測試方法的搖擺 126
10.2 測試方法搖擺問題探索 128
10.3 用於評估測試方法的指標 131
10.4 重新修訂的案例研究 133
10.4.1 基於規格說明的測試 133
10.4.2 基於代碼的測試 136
10.5 指導方針 138
10.6 習題 139
10.7 參考文獻 139
第三部分 超越單元測試
第11章 基於生命周期的測試 142
11.1 傳統瀑布模型測試 142
11.1.1 瀑布模型測試 143
11.1.2 瀑布模型的優缺點 143
11.2 在疊代生命周期中測試 144
11.2.1 瀑布模型的變體 144
11.2.2 基於規格說明的生命周期模型 146
11.3 敏捷測試 147
11.3.1 極限編程 148
11.3.2 測試驅動開發 148
11.3.3 Scrum 149
11.4 敏捷模型驅動開發 150
11.4.1 敏捷模型驅動開發概述 150
11.4.2 模型驅動的敏捷開發 151
11.5 參考文獻 151
第12章 基於模型的測試 152
12.1 基於模型測試 152
12.2 恰當的系統模型 152
12.2.1 Peterson構架 153
12.2.2 主流模型的表達能力 154
12.2.3 建模問題 154
12.2.4 選擇恰當的模型 156
12.3 支持基於模型的測試的商用工具 156
12.4 參考文獻 156
第13章 集成測試 157
13.1 基於功能分解的集成 157
13.1.1 自頂向下的集成 160
13.1.2 自底向上的集成 161
13.1.3 三明治集成 161
13.1.4 優點和缺點 162
13.2 基於調用圖的集成 162
13.2.1 成對集成 163
13.2.2 相鄰集成 164
13.2.3 優點和缺點 166
13.3 基於路徑的集成 166
13.3.1 新概念與擴展概念 167
13.3.2 MM路徑的複雜度 168
13.3.3 優點和缺點 168
13.4 示例:集成版NextDate 169
13.4.1 基於分解的集成 169
13.4.2 基於調用圖的集成 170
13.4.3 基於MM路徑的集成 172
13.5 結論和建議 174
13.6 習題 174
13.7 參考文獻 175
第14章 系統測試 176
14.1 線索 176
14.1.1 線索存在的可能性 177
14.1.2 線索定義 177
14.2 需求說明的基本概念 178
14.2.1 數據 178
14.2.2 操作 179
14.2.3 設備 179
14.2.4 事件 180
14.2.5 線索 181
14.2.6 基本概念之間的關係 181
14.3 基於模型的線索 181
14.4 基於用例的線索 184
14.4.1 用例的層次 184
14.4.2 一個實用的測試執行系統 186
14.4.3 系統級的測試用例 187
14.4.4 用事件驅動Petri網來表述用例 188
14.4.5 用事件驅動Petri網來表述有限狀態機 190
14.4.6 哪種視角最適用於系統測試 190
14.5 長用例與短用例 190
14.6 到底需要多少用例 193
14.6.1 關聯到輸入事件 193
14.6.2 關聯到輸出事件 194
14.6.3 關聯到全部連線埠事件 194
14.6.4 關聯到類 194
14.7 系統測試的覆蓋性指標 194
14.7.1 基於模型系統測試的覆蓋性 195
14.7.2 基於規格說明系統測試的覆蓋性 195
14.8 系統測試的其他方法 196
14.8.1 性能分析 197
14.8.2 基於風險的測試 199
14.9 非功能性系統測試 200
14.9.1 壓力測試的策略 200
14.9.2 利用數學的方法 201
14.10 原子系統功能測試示例 202
14.10.1 找出輸入事件和輸出事件 204
14.10.2 找出原子系統功能 205
14.10.3 修正原子系統功能 205
14.11 習題 206
14.12 參考文獻 207
第15章 面向對象測試 208
15.1 面向對象測試的相關問題 208
15.1.1 面向對象測試的單元 208
15.1.2 合成與封裝的含義 208
15.1.3 繼承的含義 210
15.1.4 多態性的含義 211
15.1.5 面向對象測試的層次 211
15.1.6 面向對象軟體的數據流測試 211
15.2 面向對象NextDate示例 211
15.2.1 CalendarUnit類 213
15.2.2 testIt類 213
15.2.3 Date類 213
15.2.4 Day類 214
15.2.5 Month類 214
15.2.6 Year類 215
15.3 面向對象的單元測試 216
15.3.1 以方法為單元的測試 216
15.3.2 以類為單元的測試 216
15.4 面向對象的集成測試 221
15.4.1 UML對集成測試的支持 221
15.4.2 面向對象軟體的MM路徑 223
15.4.3 面向對象數據流集成測試的框架 227
15.5 面向對象的系統測試 229
15.5.1 貨幣兌換計算器的UML描述 229
15.5.2 基於UML的系統測試 233
15.5.3 基於狀態圖的系統測試 235
15.6 習題 235
15.7 參考文獻 235
第16章 軟體複雜度 236
16.1 單元級複雜度 236
16.1.1 圈複雜度 236
16.1.2 計算複雜度 239
16.2 集成級複雜度 240
16.2.1 集成級圈複雜度 241
16.2.2 訊息流量複雜度 242
16.3 軟體複雜度案例 242
16.3.1 單元級圈複雜度 243
16.3.2 訊息集成級圈複雜度 243
16.4 面向對象複雜度 244
16.4.1 WMC——每個類的加權方法 245
16.4.2 DIT——繼承樹的深度 245
16.4.3 NOC——子類數量 246
16.4.4 CBO——類之間的耦合性度量 246
16.4.5 RFC——對類的回響 246
16.4.6 LCOM——方法內聚缺乏度 246
16.5 系統級複雜度 246
16.6 習題 246
16.7 參考文獻 248
第17章 基於模型的綜合系統測試 249
17.1 綜合系統的特徵 249
17.2 綜合系統的實例 250
17.2.1 車庫門控制器(受控) 250
17.2.2 空中交通管理系統(告知式) 251
17.2.3 GVSU雪災應急系統(協作式) 251
17.2.4 磐石聯邦信貸聯盟(虛擬式) 252
17.3 用於綜合系統的軟體工程 252
17.3.1 需求引出 252
17.3.2 用UML方言SysML描述方案 253
17.3.3 測試 255
17.4 綜合系統的基本通信單元 256
17.4.1 Petri網表示ESML提示符 256
17.4.2 泳道Petri網中的新提示符 258
17.5 綜合系統等級對提示符的影響 260
17.5.1 受控式和應答式綜合系統 260
17.5.2 協作式和虛擬式綜合系統 260
17.6 習題 260
17.7 參考文獻 260
第18章 探索式測試 261
18.1 探究探索式測試 261
18.2 探索一個常見示例 263
18.3 觀察與結論 264
18.4 習題 265
18.5 參考文獻 265
第19章 測試驅動開發 266
19.1 “測試然後編碼”的軟體開發周期 266
19.2 自動化測試執行(測試框架) 273
19.3 Java和JUnit示例 274
19.3.1 Java原始碼 274
19.3.2 JUnit測試代碼 276
19.4 其他待解決的問題 277
19.4.1 基於規格說明還是基於代碼 277
19.4.2 需要配置管理嗎 277
19.4.3 粒度應該多大 277
19.5 測試驅動開發的優缺點及其他相關問題 278
19.6 模型驅動開發與測試驅動開發對比 279
第20章 全對測試詳述 282
20.1 全對測試技術 282
20.1.1 程式輸入 283
20.1.2 獨立變數 284
20.1.3 輸入的順序 286
20.1.4 完全由輸入所引發的失效 288
20.2 對NIST研究成果的進一步分析 288
20.3 全對測試的適用範圍 289
20.4 對全對測試的建議 290
20.5 習題 290
20.6 參考文獻 290
第21章 測試用例的評估 291
21.1 變異測試 291
21.1.1 程式變異的規範化表達 291
21.1.2 突變運算元 292
21.2 隨機擾動法 296
21.3 魚簍統計法和故障注入 297
21.4 習題 297
21.5 參考文獻 297
第22章 軟體技術評審 298
22.1 軟體技術評審的經濟價值 298
22.2 技術評審中的各種角色 299
22.2.1 產品開發人員 300
22.2.2 評審組組長 300
22.2.3 記錄員 300
22.2.4 評審專家 300
22.2.5 角色的多重性 301
22.3 技術評審的分類 301
22.3.1 演練 301
22.3.2 技術檢驗 301
22.3.3 審計 302
22.3.4 各類評審的比較 302
22.4 一個檢查包的內容 302
22.4.1 工作成果需求 302
22.4.2 凍結工作成果 302
22.4.3 標準和清單 303
22.4.4 評審問題電子表格 303
22.4.5 評審報告表格 304
22.4.6 錯誤的嚴重等級 304
22.4.7 評審報告大綱 305
22.5 一個工業強度的檢查過程 305
22.5.1 提交計畫 306
22.5.2 由評審員進行介紹 306
22.5.3 準備 306
22.5.4 評審會議 307
22.5.5 報告的準備 307
22.5.6 部署 307
22.6 有效評審文化 307
22.6.1 規矩 308
22.6.2 管理層參與評審會議 308
22.6.3 兩個評審的故事 308
22.7 檢查案例分析 309
22.8 參考文獻 310
第23章 尾聲:軟體測試精益求精 311
23.1 軟體測試是一種技藝 311
23.2 軟體測試的最佳實踐 312
23.3 讓軟體測試更出色的10項最佳實踐 313
23.3.1 模型驅動的敏捷開發 313
23.3.2 慎重地定義與劃分測試的層次 313
23.3.3 基於模型的系統級測試 313
23.3.4 系統測試的擴展 313
23.3.5 利用關聯矩陣指導回歸測試 314
23.3.6 利用MM路徑實現集成測試 314
23.3.7 把基於規格說明的測試和基於代碼的單元級測試有機地結合起來 314
23.3.8 基於單個單元特性的代碼覆蓋指標 314
23.3.9 維護階段的探索式測試 314
23.3.10 測試驅動開發 314
23.4 針對不同項目實現最佳實踐 314
23.4.1 任務關鍵型項目 315
23.4.2 時間關鍵型項目 315
23.4.3 對遺留代碼的糾錯維護 315
23.5 參考文獻 315
附錄 完整的技術評審文檔集 316
譯者序
前言
第一部分 數學基礎
第1章 測試概述 2
1.1 基本概念 2
1.2 測試用例 3
1.3 利用維恩圖來理解軟體測試 3
1.4 構造測試用例 4
1.4.1 基於規格說明的測試 5
1.4.2 基於代碼的測試 5
1.4.3 兩種測試方法的對比 6
1.5 故障的分類 7
1.6 測試的層次 8
1.7 習題 8
1.8 參考文獻 8
第2章 程式示例 9
2.1 通用偽代碼 9
2.2 三角形問題 10
2.2.1 問題描述 10
2.2.2 三角形問題的討論 11
2.2.3 三角形問題的經典實現 11
2.2.4 三角形問題的結構化實現 14
2.3 NextDate日期函式 15
2.3.1 問題描述 15
2.3.2 NextDate函式的討論 16
2.3.3 NextDate函式的實現 16
2.4 佣金問題 18
2.4.1 問題描述 18
2.4.2 佣金問題的討論 19
2.4.3 佣金問題的實現 19
2.5 SATM系統 20
2.5.1 問題描述 20
2.5.2 SATM系統的討論 21
2.6 貨幣兌換計算器 22
2.7 雨刷控制器 22
2.8 車庫門遙控開關 22
2.9 習題 23
2.10 參考文獻 24
第3章 面向測試人員的離散數學 25
3.1 集合論 25
3.1.1 集合的成員關係 25
3.1.2 集合的定義方法 25
3.1.3 空集 26
3.1.4 集合的維恩圖 26
3.1.5 集合運算 27
3.1.6 集合關係 28
3.1.7 集合劃分 29
3.1.8 集合恆等 29
3.2 函式 30
3.2.1 定義域與值域 30
3.2.2 函式類型 30
3.2.3 函式複合 31
3.3 關係 32
3.3.1 集合之間的關係 32
3.3.2 單個集合上的關係 33
3.4 命題邏輯 34
3.4.1 邏輯運算符 34
3.4.2 邏輯表達式 35
3.4.3 邏輯等價 35
3.5 機率論 36
3.6 習題 37
3.7 參考文獻 37
第4章 面向測試人員的圖論 38
4.1 圖 38
4.1.1 節點的度 38
4.1.2 關聯矩陣 39
4.1.3 鄰接矩陣 39
4.1.4 路徑 40
4.1.5 連通性 40
4.1.6 壓縮圖 41
4.1.7 圈數 41
4.2 有向圖 41
4.2.1 入度與出度 42
4.2.2 節點類型 42
4.2.3 有向圖的鄰接矩陣 43
4.2.4 路徑與半路徑 43
4.2.5 可達矩陣 44
4.2.6 n連通性 44
4.2.7 強分圖 44
4.3 軟體測試中常用的圖 45
4.3.1 程式圖 45
4.3.2 有限狀態機 46
4.3.3 Petri網 47
4.3.4 事件驅動Petri網 49
4.3.5 狀態圖 50
4.4 習題 52
4.5 參考文獻 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函式的測試用例 59
5.5.3 佣金問題的測試用例 60
5.6 隨機測試 62
5.7 邊界值測試的原則 63
5.8 習題 65
第6章 等價類測試 66
6.1 等價類 66
6.2 傳統的等價類測試 66
6.3 改進的等價類測試 67
6.3.1 弱一般等價類測試 68
6.3.2 強一般等價類測試 68
6.3.3 弱健壯等價類測試 68
6.3.4 強健壯等價類測試 69
6.4 三角形問題的等價類測試用例 69
6.5 NextDate函式的等價類測試用例 71
6.6 佣金問題的等價類測試用例 73
6.7 邊緣測試 75
6.8 原則與注意事項 75
6.9 習題 76
6.10 參考文獻 76
第7章 基於決策表的測試 77
7.1 決策表 77
7.2 決策表使用技巧 77
7.3 三角形問題的測試用例 80
7.4 Next Date函式的測試用例 81
7.4.1 第一輪嘗試 81
7.4.2 第二輪嘗試 82
7.4.3 第三輪嘗試 83
7.5 佣金問題的測試用例 85
7.6 因果關係圖 85
7.7 原則與注意事項 86
7.8 習題 87
7.9 參考文獻 87
第8章 路徑測試 88
8.1 程式圖 88
8.2 DD路徑 90
8.3 測試覆蓋指標 92
8.3.1 基於程式圖的覆蓋度量方法 92
8.3.2 E. F. Miller的覆蓋度量方法 92
8.3.3 複合條件下的閉合路徑 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方法的基本複雜度 103
8.5 原則與注意事項 105
8.6 習題 105
8.7 參考文獻 106
第9章 數據流測試 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 定義使用路徑的測試覆蓋指標 115
9.1.8 面向對象編碼的定義/使用測試 116
9.2 基於程式切片的測試 116
9.2.1 舉例 118
9.2.2 風格與技術 122
9.2.3 切片拼接 123
9.3 程式切片工具 124
9.4 習題 125
9.5 參考文獻 125
第10章 單元測試回顧 126
10.1 測試方法的搖擺 126
10.2 測試方法搖擺問題探索 128
10.3 用於評估測試方法的指標 131
10.4 重新修訂的案例研究 133
10.4.1 基於規格說明的測試 133
10.4.2 基於代碼的測試 136
10.5 指導方針 138
10.6 習題 139
10.7 參考文獻 139
第三部分 超越單元測試
第11章 基於生命周期的測試 142
11.1 傳統瀑布模型測試 142
11.1.1 瀑布模型測試 143
11.1.2 瀑布模型的優缺點 143
11.2 在疊代生命周期中測試 144
11.2.1 瀑布模型的變體 144
11.2.2 基於規格說明的生命周期模型 146
11.3 敏捷測試 147
11.3.1 極限編程 148
11.3.2 測試驅動開發 148
11.3.3 Scrum 149
11.4 敏捷模型驅動開發 150
11.4.1 敏捷模型驅動開發概述 150
11.4.2 模型驅動的敏捷開發 151
11.5 參考文獻 151
第12章 基於模型的測試 152
12.1 基於模型測試 152
12.2 恰當的系統模型 152
12.2.1 Peterson構架 153
12.2.2 主流模型的表達能力 154
12.2.3 建模問題 154
12.2.4 選擇恰當的模型 156
12.3 支持基於模型的測試的商用工具 156
12.4 參考文獻 156
第13章 集成測試 157
13.1 基於功能分解的集成 157
13.1.1 自頂向下的集成 160
13.1.2 自底向上的集成 161
13.1.3 三明治集成 161
13.1.4 優點和缺點 162
13.2 基於調用圖的集成 162
13.2.1 成對集成 163
13.2.2 相鄰集成 164
13.2.3 優點和缺點 166
13.3 基於路徑的集成 166
13.3.1 新概念與擴展概念 167
13.3.2 MM路徑的複雜度 168
13.3.3 優點和缺點 168
13.4 示例:集成版NextDate 169
13.4.1 基於分解的集成 169
13.4.2 基於調用圖的集成 170
13.4.3 基於MM路徑的集成 172
13.5 結論和建議 174
13.6 習題 174
13.7 參考文獻 175
第14章 系統測試 176
14.1 線索 176
14.1.1 線索存在的可能性 177
14.1.2 線索定義 177
14.2 需求說明的基本概念 178
14.2.1 數據 178
14.2.2 操作 179
14.2.3 設備 179
14.2.4 事件 180
14.2.5 線索 181
14.2.6 基本概念之間的關係 181
14.3 基於模型的線索 181
14.4 基於用例的線索 184
14.4.1 用例的層次 184
14.4.2 一個實用的測試執行系統 186
14.4.3 系統級的測試用例 187
14.4.4 用事件驅動Petri網來表述用例 188
14.4.5 用事件驅動Petri網來表述有限狀態機 190
14.4.6 哪種視角最適用於系統測試 190
14.5 長用例與短用例 190
14.6 到底需要多少用例 193
14.6.1 關聯到輸入事件 193
14.6.2 關聯到輸出事件 194
14.6.3 關聯到全部連線埠事件 194
14.6.4 關聯到類 194
14.7 系統測試的覆蓋性指標 194
14.7.1 基於模型系統測試的覆蓋性 195
14.7.2 基於規格說明系統測試的覆蓋性 195
14.8 系統測試的其他方法 196
14.8.1 性能分析 197
14.8.2 基於風險的測試 199
14.9 非功能性系統測試 200
14.9.1 壓力測試的策略 200
14.9.2 利用數學的方法 201
14.10 原子系統功能測試示例 202
14.10.1 找出輸入事件和輸出事件 204
14.10.2 找出原子系統功能 205
14.10.3 修正原子系統功能 205
14.11 習題 206
14.12 參考文獻 207
第15章 面向對象測試 208
15.1 面向對象測試的相關問題 208
15.1.1 面向對象測試的單元 208
15.1.2 合成與封裝的含義 208
15.1.3 繼承的含義 210
15.1.4 多態性的含義 211
15.1.5 面向對象測試的層次 211
15.1.6 面向對象軟體的數據流測試 211
15.2 面向對象NextDate示例 211
15.2.1 CalendarUnit類 213
15.2.2 testIt類 213
15.2.3 Date類 213
15.2.4 Day類 214
15.2.5 Month類 214
15.2.6 Year類 215
15.3 面向對象的單元測試 216
15.3.1 以方法為單元的測試 216
15.3.2 以類為單元的測試 216
15.4 面向對象的集成測試 221
15.4.1 UML對集成測試的支持 221
15.4.2 面向對象軟體的MM路徑 223
15.4.3 面向對象數據流集成測試的框架 227
15.5 面向對象的系統測試 229
15.5.1 貨幣兌換計算器的UML描述 229
15.5.2 基於UML的系統測試 233
15.5.3 基於狀態圖的系統測試 235
15.6 習題 235
15.7 參考文獻 235
第16章 軟體複雜度 236
16.1 單元級複雜度 236
16.1.1 圈複雜度 236
16.1.2 計算複雜度 239
16.2 集成級複雜度 240
16.2.1 集成級圈複雜度 241
16.2.2 訊息流量複雜度 242
16.3 軟體複雜度案例 242
16.3.1 單元級圈複雜度 243
16.3.2 訊息集成級圈複雜度 243
16.4 面向對象複雜度 244
16.4.1 WMC——每個類的加權方法 245
16.4.2 DIT——繼承樹的深度 245
16.4.3 NOC——子類數量 246
16.4.4 CBO——類之間的耦合性度量 246
16.4.5 RFC——對類的回響 246
16.4.6 LCOM——方法內聚缺乏度 246
16.5 系統級複雜度 246
16.6 習題 246
16.7 參考文獻 248
第17章 基於模型的綜合系統測試 249
17.1 綜合系統的特徵 249
17.2 綜合系統的實例 250
17.2.1 車庫門控制器(受控) 250
17.2.2 空中交通管理系統(告知式) 251
17.2.3 GVSU雪災應急系統(協作式) 251
17.2.4 磐石聯邦信貸聯盟(虛擬式) 252
17.3 用於綜合系統的軟體工程 252
17.3.1 需求引出 252
17.3.2 用UML方言SysML描述方案 253
17.3.3 測試 255
17.4 綜合系統的基本通信單元 256
17.4.1 Petri網表示ESML提示符 256
17.4.2 泳道Petri網中的新提示符 258
17.5 綜合系統等級對提示符的影響 260
17.5.1 受控式和應答式綜合系統 260
17.5.2 協作式和虛擬式綜合系統 260
17.6 習題 260
17.7 參考文獻 260
第18章 探索式測試 261
18.1 探究探索式測試 261
18.2 探索一個常見示例 263
18.3 觀察與結論 264
18.4 習題 265
18.5 參考文獻 265
第19章 測試驅動開發 266
19.1 “測試然後編碼”的軟體開發周期 266
19.2 自動化測試執行(測試框架) 273
19.3 Java和JUnit示例 274
19.3.1 Java原始碼 274
19.3.2 JUnit測試代碼 276
19.4 其他待解決的問題 277
19.4.1 基於規格說明還是基於代碼 277
19.4.2 需要配置管理嗎 277
19.4.3 粒度應該多大 277
19.5 測試驅動開發的優缺點及其他相關問題 278
19.6 模型驅動開發與測試驅動開發對比 279
第20章 全對測試詳述 282
20.1 全對測試技術 282
20.1.1 程式輸入 283
20.1.2 獨立變數 284
20.1.3 輸入的順序 286
20.1.4 完全由輸入所引發的失效 288
20.2 對NIST研究成果的進一步分析 288
20.3 全對測試的適用範圍 289
20.4 對全對測試的建議 290
20.5 習題 290
20.6 參考文獻 290
第21章 測試用例的評估 291
21.1 變異測試 291
21.1.1 程式變異的規範化表達 291
21.1.2 突變運算元 292
21.2 隨機擾動法 296
21.3 魚簍統計法和故障注入 297
21.4 習題 297
21.5 參考文獻 297
第22章 軟體技術評審 298
22.1 軟體技術評審的經濟價值 298
22.2 技術評審中的各種角色 299
22.2.1 產品開發人員 300
22.2.2 評審組組長 300
22.2.3 記錄員 300
22.2.4 評審專家 300
22.2.5 角色的多重性 301
22.3 技術評審的分類 301
22.3.1 演練 301
22.3.2 技術檢驗 301
22.3.3 審計 302
22.3.4 各類評審的比較 302
22.4 一個檢查包的內容 302
22.4.1 工作成果需求 302
22.4.2 凍結工作成果 302
22.4.3 標準和清單 303
22.4.4 評審問題電子表格 303
22.4.5 評審報告表格 304
22.4.6 錯誤的嚴重等級 304
22.4.7 評審報告大綱 305
22.5 一個工業強度的檢查過程 305
22.5.1 提交計畫 306
22.5.2 由評審員進行介紹 306
22.5.3 準備 306
22.5.4 評審會議 307
22.5.5 報告的準備 307
22.5.6 部署 307
22.6 有效評審文化 307
22.6.1 規矩 308
22.6.2 管理層參與評審會議 308
22.6.3 兩個評審的故事 308
22.7 檢查案例分析 309
22.8 參考文獻 310
第23章 尾聲:軟體測試精益求精 311
23.1 軟體測試是一種技藝 311
23.2 軟體測試的最佳實踐 312
23.3 讓軟體測試更出色的10項最佳實踐 313
23.3.1 模型驅動的敏捷開發 313
23.3.2 慎重地定義與劃分測試的層次 313
23.3.3 基於模型的系統級測試 313
23.3.4 系統測試的擴展 313
23.3.5 利用關聯矩陣指導回歸測試 314
23.3.6 利用MM路徑實現集成測試 314
23.3.7 把基於規格說明的測試和基於代碼的單元級測試有機地結合起來 314
23.3.8 基於單個單元特性的代碼覆蓋指標 314
23.3.9 維護階段的探索式測試 314
23.3.10 測試驅動開發 314
23.4 針對不同項目實現最佳實踐 314
23.4.1 任務關鍵型項目 315
23.4.2 時間關鍵型項目 315
23.4.3 對遺留代碼的糾錯維護 315
23.5 參考文獻 315
附錄 完整的技術評審文檔集 316