目 錄
第Ⅰ部分 總述
第1章 概覽 3
1.1 關於本章 3
1.2 可能有效的最簡單的測試自動化策略 3
1.2.1 開發過程 3
1.2.2 客戶測試 4
1.2.3 單元測試 5
1.2.4 易測性設計 5
1.2.5 測試組織 6
1.3 接下來要討論的問題 6
第2章 測試味道 7
2.1 關於本章 7
2.2 測試味道簡介 7
2.2.1 什麼是測試味道 7
2.2.2 測試味道的種類 8
2.2.3 如何處理味道 8
2.3 味道的種類 9
2.3.1 項目味道 9
2.3.2 行為味道 10
2.3.3 代碼味道 11
2.4 接下來要討論的問題 12
第3章 測試自動化的目標 13
3.1 關於本章 13
3.2 為什麼要測試 13
3.3 測試自動化的目標 14
3.3.1 測試應該有助於提高質量 15
3.3.2 測試應該有助於理解SUT 16
3.3.3 測試應該降低(而不是引入)風險 16
3.3.4 測試應該易於運行 17
3.3.5 測試應該易於寫和維護 19
3.3.6 隨著係統的發展,測試應該隻需要最低限度的維護 20
3.4 接下來要討論的問題 20
第4章 測試自動化的基本觀點 21
4.1 關於本章 21
4.2 這些基本觀點的重要性 21
4.3 一些不同的基本觀點 22
4.3.1 首先測試還是最後測試 22
4.3.2 測試還是示例 22
4.3.3 逐個測試還是全部一起測試 22
4.3.4 從外到內還是從內到外 23
4.3.5 狀態驗證還是行為驗證 24
4.3.6 事先進行夾具設計還是逐個測試 25
4.4 理解不同觀點的存在 25
4.5 我的基本觀點 25
4.6 接下來要討論的問題 26
第5章 測試自動化的原則 27
5.1 關於本章 27
5.2 原則 27
5.2.1 原則:首先寫測試(也稱為測試驅動開發、測試優先開發) 27
5.2.2 原則:易測性設計 28
5.2.3 原則:使用前門優先(也稱為前門優先) 28
5.2.4 原則:交流意圖(也稱為高級語言,簡單易讀) 28
5.2.5 原則:不要修改SUT 28
5.2.6 原則:保持測試獨立 (也稱為獨立測試) 29
5.2.7 原則:隔離SUT 29
5.2.8 原則:最小化測試重疊 30
5.2.9 原則:最小化不可測試的代碼 30
5.2.10 原則:保持測試邏輯與産品代碼分離(也稱為産品代碼中無測試邏輯) 31
5.2.11 原則:每個測試驗證一種條件 (也稱為單一條件測試) 31
5.2.12 原則:單獨測試關注點 32
5.2.13 原則:確保相同標準的努力和責任 32
5.3 接下來要討論的問題 32
第6章 測試自動化策略 33
6.1 關於本章 33
6.2 什麼是策略 33
6.3 應該自動化哪些類型的測試 34
6.3.1 總功能性測試 34
6.3.2 交叉功能測試 35
6.4 使用哪些工具來自動化各種測試 36
6.4.1 測試自動化的方法 37
6.4.2 xUnit簡介 38
6.4.3 使用xUnit的最佳時機 39
6.5 使用哪種測試夾具策略 39
6.5.1 什麼是夾具 40
6.5.2 主要的夾具策略 40
6.5.3 暫時新鮮夾具 42
6.5.4 永久新鮮夾具 42
6.5.5 共享的夾具策略 43
6.6 如何確保易測性 44
6.6.1 最後測試——非常危險 44
6.6.2 易測性設計——在最前麵 44
6.6.3 測試驅動易測性 45
6.6.4 控製點和觀察點 45
6.6.5 交互風格與易測性模式 46
6.6.6 劃分與測試 49
6.7 接下來要討論的問題 50
第7章 xUnit基礎 51
7.1 關於本章 51
7.2 xUnit簡介 51
7.3 共同特徵 51
7.4 最低要求 52
7.4.1 定義測試 53
7.4.2 什麼是夾具 53
7.4.3 定義測試套件 53
7.4.4 運行測試 54
7.4.5 測試結果 54
7.5 xUnit的本質 55
7.5.1 測試命令 56
7.5.2 測試套件對象 56
7.6 過程化世界裏的xUnit 57
7.7 接下來要討論的問題 57
第8章 暫時夾具管理 59
8.1 關於本章 59
8.2 測試夾具術語 59
8.2.1 什麼是夾具 60
8.2.2 什麼是新鮮夾具 60
8.2.3 什麼是暫時新鮮夾具 61
8.3 建立新鮮夾具 61
8.3.1 內聯夾具建立 61
8.3.2 委托夾具建立 62
8.3.3 隱式夾具建立 63
8.3.4 SetUp方法的濫用 64
8.3.5 混閤夾具建立 65
8.4 拆卸暫時新鮮夾具 65
8.5 接下來要討論的問題 65
第9章 永久夾具管理 67
9.1 關於本章 67
9.2 管理永久新鮮夾具 67
9.2.1 什麼讓夾具變得永久 67
9.2.2 永久新鮮夾具産生的問題 68
9.2.3 拆卸永久新鮮夾具 68
9.2.4 避免拆卸的需要 71
9.2.5 處理緩慢測試 72
9.3 管理共享的夾具 72
9.3.1 訪問共享夾具 73
9.3.2 引發共享夾具結構 73
9.4 接下來要討論的問題 75
第10章 結果驗證 77
10.1 關於本章 77
10.2 讓測試自檢 77
10.3 狀態驗證 78
10.3.1 使用內置斷言 79
10.3.2 Delta斷言 80
10.3.3 外部結果驗證 80
10.4 驗證行為 80
10.4.1 過程行為驗證 81
10.4.2 預期行為規範 82
10.5 減少測試碼復製 82
10.5.1 預期對象 83
10.5.2 自定義斷言 84
10.5.3 結果描述驗證方法 84
10.5.4 參數化測試和數據驅動測試 85
10.6 避免條件測試邏輯 86
10.6.1 排除if語句 87
10.6.2 排除循環 87
10.7 其他方法 88
10.7.1 逆嚮操作,由外到內 88
10.7.2 使用測試驅動開發來寫測試實用程序方法 88
10.8 將可重復使用的驗證邏輯放在哪裏 89
10.9 接下來要討論的問題 89
第11章 使用測試替身 91
11.1 關於本章 91
11.2 什麼是間接輸入和間接輸齣 91
11.2.1 為什麼要關注間接輸入 91
11.2.2 為什麼要關注間接輸齣 92
11.2.3 如何控製間接輸入 93
11.2.4 如何驗證間接輸齣 94
11.3 使用替身測試 96
11.3.1 測試替身的類型 97
11.3.2 提供測試替身 102
11.3.3 配置測試替身 103
11.3.4 安裝測試替身 104
11.4 測試替身的其他用法 108
11.4.1 內窺鏡測試 108
11.4.2 需求驅動開發 108
11.4.3 加速夾具建立 108
11.4.4 加速測試執行 109
11.5 其他需要考慮的問題 109
11.6 接下來要討論的問題 109
第12章 組織測試 111
12.1 關於本章 111
12.2 基本的xUnit機製 111
12.3 閤理精簡測試方法 111
12.4 測試方法和測試用例類 113
12.4.1 每個類一個測試用例類 113
12.4.2 每種特徵一個測試用例類 113
12.4.3 每個夾具一個測試用例類 114
12.4.4 選擇測試方法組織策略 115
12.5 測試命名約定 115
12.6 組織測試套件 116
12.6.1 運行測試組 117
12.6.2 運行單個測試 117
12.7 測試碼重用 118
12.7.1 測試實用程序方法位置 118
12.7.2 測試用例繼承與重用 119
12.8 測試文件組織 119
12.8.1 內置自測 119
12.8.2 測試程序包 120
12.8.3 測試依賴 120
12.9 接下來要討論的問題 120
第13章 使用數據庫的測試 121
13.1 關於本章 121
13.2 使用數據庫的測試 121
13.2.1 數據庫測試的原因 121
13.2.2 數據庫帶來的問題 122
13.3 不使用數據庫的測試 123
13.4 測試數據庫 124
13.4.1 測試存儲過程 124
13.4.2 測試數據訪問層 125
13.4.3 確保開發人員獨立 125
13.5 使用數據庫測試(再次!) 126
13.6 接下來要討論的問題 126
第14章 有效測試自動化的路綫圖 127
14.1 關於本章 127
14.2 測試自動化的睏難 127
14.3 高度可維護的自動化測試的路綫圖 128
14.3.1 執行快樂路徑代碼 129
14.3.2 驗證快樂路徑的直接輸齣 129
14.3.3 驗證備選路徑 129
14.3.4 驗證間接輸齣行為 130
14.3.5 最優化測試執行和維護 130
14.4 接下來要討論的問題 131
第Ⅱ部分 測試味道
第15章 代碼味道 135
15.1 模糊測試 (也稱為長測試、復雜測試、冗長測試) 135
15.1.1 癥狀 135
15.1.2 影響 135
15.1.3 原因 135
15.1.4 解決方案模式 145
15.2 條件測試邏輯 (也稱為縮排的測試碼) 146
15.2.1 癥狀 146
15.2.2 影響 147
15.2.3 原因 147
15.3 難以測試的代碼 152
15.3.1 癥狀 153
15.3.2 影響 153
15.3.3 解決方案模式 153
15.3.4 原因 153
15.4 測試碼復製 155
15.4.1 癥狀 155
15.4.2 影響 156
15.4.3 原因 156
15.4.4 高級閱讀 157
15.5 産品中的測試邏輯 158
15.5.1 癥狀 158
15.5.2 影響 158
15.5.3 原因 158
15.5.4 高級閱讀 161
第16章 行為味道 163
16.1 斷言滾輪 163
16.1.1 癥狀 163
16.1.2 影響 163
16.1.3 原因 163
16.1.4 高級閱讀 165
16.2 不穩定測試 165
16.2.1 癥狀 165
16.2.2 影響 166
16.2.3 檢修建議 166
16.2.4 原因 166
16.3 脆弱測試 173
16.3.1 癥狀 174
16.3.2 影響 174
16.3.3 檢修建議 174
16.3.4 原因 175
16.3.5 高級閱讀 179
16.4 頻繁調試(也稱為手動調試) 179
16.4.1 癥狀 179
16.4.2 原因 179
16.4.3 影響 180
16.4.4 解決方案模式 180
16.5 手動乾預 180
16.5.1 癥狀 180
16.5.2 影響 180
16.5.3 原因 181
16.5.4 高級閱讀 182
16.6 緩慢測試 182
16.6.1 癥狀 182
16.6.2 影響 182
16.6.3 檢修建議 183
16.6.4 原因 183
第17章 項目味道 187
17.1 缺陷測試 187
17.1.1 癥狀 187
17.1.2 影響 187
17.1.3 原因 187
17.1.4 檢修建議 188
17.1.5 解決方案模式 188
17.2 開發人員沒有寫測試 189
17.2.1 癥狀 189
17.2.2 影響 189
17.2.3 原因 189
17.2.4 檢修建議 190
17.3 高測試維護成本 190
17.3.1 癥狀 190
17.3.2 影響 191
17.3.3 原因 191
17.3.4 檢修建議 192
17.4 産品缺陷 192
17.4.1 癥狀 192
17.4.2 影響 192
17.4.3 原因 192
第Ⅲ部分 模 式
第18章 測試策略模式 201
18.1 記錄測試(也稱為記錄與迴放測試、機器人用戶測試、捕獲/迴放測試) 201
18.1.1 運行原理 202
18.1.2 使用時機 202
18.1.3 實現方式說明 203
18.1.4 示例:內置測試記錄 203
18.1.5 示例:商業記錄與迴放測試工具 204
18.1.6 重構說明 206
18.1.7 示例:重構的商業記錄測試 206
18.1.8 高級閱讀 207
18.2 腳本測試(也稱為手寫測試、手動編碼測試、程序測試、自動化單元測試) 207
18.2.1 運行原理 208
18.2.2 使用時機 208
18.2.3 實現方式說明 208
18.2.4 示例:腳本測試 208
18.2.5 關於名稱 209
18.2.6 高級閱讀 209
18.3 數據驅動測試 209
18.3.1 運行原理 210
18.3.2 使用時機 210
18.3.3 實現方式說明 211
18.3.4 啓發示例 213
18.3.5 重構說明 214
18.3.6 示例:使用XML數據文件的xUnit數據驅動測試 214
18.3.7 示例:使用CSV輸入文件的xUnit數據驅動測試 215
18.3.8 示例:使用Fit架構的數據驅動測試 216
18.4 測試自動化架構 217
18.4.1 運行原理 218
18.4.2 這樣做的原因 218
18.4.3 實現方式說明 218
18.4.4 示例:測試自動化架構 219
18.4.5 高級閱讀 219
18.5 最小夾具 (也稱為最小上下文) 220
18.5.1 這樣做的原因 220
18.5.2 實現方式說明 220
18.6 標準夾具 (也稱為標準上下文) 221
18.6.1 運行原理 222
18.6.2 使用它的時機 222
18.6.3 實現方式說明 223
18.6.4 啓發示例 224
18.6.5 重構說明 224
18.6.6 示例:標準夾具 225
18.7 新鮮夾具 (也稱為新鮮上下文、私有夾具) 226
18.7.1 運行原理 226
18.7.2 使用時機 226
18.7.3 實現方式說明 227
18.7.4 保留夾具的原因 227
18.7.5 新鮮夾具建立 228
18.7.6 啓發示例 229
18.7.7 重構說明 229
18.7.8 示例:新鮮夾具 229
18.8 共享夾具 (也稱為共享上下文、遺留夾具、重用的夾具、陳舊夾具) 230
18.8.1 運行原理 231
18.8.2 使用時機 231
18.8.3 實現方式說明 234
18.8.4 重構說明 235
18.8.5 示例:共享夾具 235
18.8.6 示例:不可變的共享夾具 237
18.9 後門操作(也稱為層交叉測試) 238
18.9.1 運行原理 238
18.9.2 使用時機 238
18.9.3 實現方式說明 240
18.9.4 啓發示例 241
18.9.5 重構說明 242
18.9.6 示例:使用測試間諜的後門結果驗證 242
18.9.7 示例:後門夾具建立 242
18.9.8 高級閱讀 244
18.10 層測試(也稱為單層測試、逐層測試或分層測試) 245
18.10.1 運行原理 246
18.10.2 使用時機 246
18.10.3 實現方式說明 247
18.10.4 啓發示例 248
18.10.5 重構說明 249
18.10.6 示例:錶示層測試 249
18.10.7 示例:皮下測試 250
18.10.8 示例:業務層測試 251
第19章 xUnit基本模式 253
19.1 測試方法 253
19.1.1 運行原理 253
19.1.2 這樣做的原因 254
19.1.3 實現方式說明 254
19.1.4 示例:簡單成功測試 256
19.1.5 示例:使用try/catch的預期異常測試 257
19.1.6 示例:使用方法屬性的預期異常測試 258
19.1.7 示例:使用代碼塊/閉包的預期異常測試 258
19.1.8 示例:構造函數測試 259
19.2 四階段測試 260
19.2.1 運行原理 261
19.2.2 這樣做的原因 261
19.2.3 實現方式說明 262
19.2.4 示例:四階段測試 (內聯) 262
19.2.5 示例:四階段測試 (隱式建立/拆卸) 262
19.3 斷言方法 263
19.3.1 運行原理 264
19.3.2 這樣做的原因 264
19.3.3 實現方式說明 264
19.3.4 啓發示例 266
19.3.5 重構說明 267
19.3.6 示例:相等性斷言 268
19.3.7 示例:模糊相等性斷言 268
19.3.8 示例:確定結果斷言 268
19.3.9 示例:預期異常斷言 268
19.3.10 示例:單一結果斷言 269
19.4 斷言消息 269
19.4.1 運行原理 269
19.4.2 使用時機 269
19.4.3 實現方式說明 270
19.4.4 啓發示例 270
19.4.5 重構說明 271
19.4.6 示例:異常描述消息 271
19.5 測試用例類 271
19.5.1 運行原理 272
19.5.2 這樣做的原因 272
19.5.3 實現方式說明 273
19.5.4 示例:測試用例類 273
19.5.5 高級閱讀 274
19.6 測試運行器 274
19.6.1 運行原理 275
19.6.2 這樣做的原因 275
19.6.3 實現方式說明 275
19.7 測試用例對象 278
19.7.1 運行原理 278
19.7.2 這樣做的原因 278
19.7.3 實現方式說明 279
19.7.4 示例:測試用例對象 280
19.8 測試套件對象 281
19.8.1 運行原理 281
19.8.2 這樣做的原因 281
19.8.3 實現方式說明 282
19.8.4 示例:測試套件對象 282
19.8.5 示例:使用測試枚舉構建的套件的套件 283
19.8.6 示例:測試套件過程 284
19.9 測試發現 286
19.9.1 運行原理 286
19.9.2 使用時機 286
19.9.3 實現方式說明 287
19.9.4 啓發示例 287
19.9.5 重構說明 288
19.9.6 示例:測試方法發現 (使用方法命名和編譯器宏) 288
19.9.7 示例:測試方法發現 (使用方法命名) 288
19.9.8 示例:測試方法發現 (使用方法屬性) 289
19.9.9 示例:測試用例類發現 (使用類屬性) 290
19.9.10 示例:測試用例類發現 (使用公共位置和測試用例超類) 290
19.10 測試枚舉(也稱為:測試套件工廠) 290
19.10.1 運行原理 291
19.10.2 使用它的時機 291
19.10.3 實現方式說明 291
19.10.4 示例:CppUnit中的測試方法枚舉 292
19.10.5 示例:測試方法調用(硬編碼的) 293
19.10.6 示例:測試套件枚舉 293
19.11 測試選擇 294
19.11.1 運行原理 294
19.11.2 使用時機 294
19.11.3 實現方式說明 295
19.11.4 示例:使用類屬性的測試用例類選擇 295
19.11.5 示例:使用方法屬性的測試方法選擇 295
第20章 夾具建立模式 297
20.1 內聯建立 297
20.1.1 運行原理 298
20.1.2 使用時機 298
20.1.3 實現方式說明 298
20.1.4 示例:內聯建立 298
20.1.5 重構說明 299
20.2 委托建立 299
20.2.1 運行原理 300
20.2.2 使用時機 300
20.2.3 實現方式說明 300
20.2.4 啓發示例 300
20.2.5 重構說明 301
20.2.6 示例:委托建立 301
20.3 創建方法 302
20.3.1 運行原理 303
20.3.2 使用時機 303
20.3.3 實現方式說明 305
20.3.4 啓發示例 305
20.3.5 重構說明 306
20.3.6 示例:匿名創建方法 306
20.3.7 示例:參數化創建方法 307
20.3.8 示例:附件方法 307
20.3.9 示例:重復用於夾具建立的測試 308
20.4 隱式建立(也稱為:掛鈎建立、調用架構建立、共享建立方法) 309
20.4.1 運行原理 310
20.4.2 使用時機 310
20.4.3 實現方式說明 310
20.4.4 啓發示例 311
20.4.5 重構說明 312
20.4.6 示例:隱式建立 312
20.5 預製夾具(也稱為:預製上下文、測試颱) 313
20.5.1 運行原理 313
20.5.2 使用時機 313
20.5.3 實現方式說明 314
20.5.4 啓發示例 315
20.5.5 重構說明 316
20.5.6 示例:預製夾具測試 316
20.5.7 示例:夾具建立測試用例 316
20.5.8 示例:使用數據填充腳本的預製夾具建立 317
20.6 延遲建立 317
20.6.1 運行原理 318
20.6.2 使用時機 318
20.6.3 實現方式說明 319
20.6.4 啓發示例 319
20.6.5 重構說明 321
20.6.6 示例:延遲建立 321
20.7 套件夾具建立 322
20.7.1 運行原理 323
20.7.2 使用時機 323
20.7.3 實現方式說明 323
20.7.4 啓發示例 324
20.7.5 重構說明 325
20.7.6 示例:套件夾具建立 325
20.7.7 關於名稱 327
20.7.8 高級閱讀 327
20.8 建立裝飾器 327
20.8.1 運行原理 328
20.8.2 使用時機 328
20.8.3 實現方式說明 328
20.8.4 啓發示例 330
20.8.5 重構說明 330
20.8.6 示例:硬編碼的建立裝飾器 330
20.8.7 示例:參數化建立裝飾器 331
20.8.8 示例:抽象裝飾器類 332
20.9 鏈接測試 332
20.9.1 運行原理 333
20.9.2 使用時機 333
20.9.3 實現方式說明 334
20.9.4 啓發示例 335
20.9.5 重構說明 336
20.9.6 示例:鏈接測試 336
第21章 結果驗證模式 339
21.1 狀態驗證(也稱為:基於狀態的測試) 339
21.1.1 運行原理 340
21.1.2 使用時機 340
21.1.3 實現方式說明 340
21.1.4 啓發示例 341
21.1.5 重構說明 342
21.1.6 示例:過程狀態驗證 342
21.1.7 示例:預期對象 342
21.2 行為驗證(也稱為:交互測試) 343
21.2.1 運行原理 343
21.2.2 使用時機 344
21.2.3 實現方式說明 344
21.2.4 啓發示例 345
21.2.5 重構說明 346
21.2.6 示例:過程行為驗證 346
21.2.7 示例:預期行為規範 347
21.3 自定義斷言(也稱為:預約斷言) 347
21.3.1 工作原理 348
21.3.2 使用時機 348
21.3.3 實現方式說明 350
21.3.4 啓發示例 351
21.3.5 重構說明 352
21.3.6 示例:自定義斷言 352
21.3.7 示例:域斷言 353
21.3.8 示例:驗證方法 354
21.3.9 示例:自定義斷言測試 355
21.4 Delta斷言 356
21.4.1 運行原理 356
21.4.2 使用時機 357
21.4.3 實現方式說明 357
21.4.4 啓發示例 358
21.4.5 重構說明 358
21.4.6 示例:Delta斷言 358
21.5 哨兵斷言 359
21.5.1 運行原理 360
21.5.2 使用時機 360
21.5.3 實現方式說明 360
21.5.4 啓發示例 361
21.5.5 重構說明 361
21.5.6 示例:簡單哨兵斷言 361
21.5.7 示例:共享夾具哨兵斷言 362
21.6 未完成的測試斷言 362
21.6.1 運行原理 363
21.6.2 使用時機 363
21.6.3 實現方式說明 363
21.6.4 啓發示例 364
21.6.5 重構說明 364
21.6.6 示例:未完成的測試斷言 364
21.6.7 示例:使用模闆的未完成的測試方法生成 365
第22章 夾具拆卸模式 367
22.1 無用單元收集拆卸 367
22.1.1 運行原理 367
22.1.2 使用時機 368
22.1.3 實現方式說明 368
22.1.4 啓發示例 368
22.1.5 重構說明 369
22.1.6 示例:無用單元收集拆卸 369
22.2 自動拆卸(也稱為:測試對象注冊庫) 369
22.2.1 運行原理 370
22.2.2 使用時機 370
22.2.3 實現方式說明 370
22.2.4 啓發示例 371
22.2.5 重構說明 372
22.2.6 示例:自動拆卸 372
22.2.7 示例:自動執行拆卸 374
22.3 內聯拆卸 374
22.3.1 運行原理 375
22.3.2 使用時機 375
22.3.3 實現方式說明 376
22.3.4 啓發示例 376
22.3.5 示例:天真內聯拆卸 377
22.3.6 重構說明 377
22.3.7 示例:內聯拆卸 377
22.3.8 示例:拆卸哨兵子句 378
22.3.9 示例:多種資源內聯拆卸(Java) 378
22.3.10 示例:委托拆卸 379
22.4 隱式拆卸(也稱為:關聯拆卸、調用架構拆卸、拆卸方法) 380
22.4.1 運行原理 381
22.4.2 使用時機 381
22.4.3 實現方式說明 381
22.4.4 啓發示例 381
22.4.5 重構說明 382
22.4.6 示例:隱式拆卸 382
第23章 測試替身模式 385
23.1 測試替身 (也稱為冒名頂替者) 385
23.1.1 運行原理 386
23.1.2 使用時機 386
23.1.3 實現方式說明 388
23.1.4 示例:測試替身 389
23.2 測試樁(也稱為:樁) 390
23.2.1 運行原理 390
23.2.2 使用時機 390
23.2.3 實現方式說明 391
23.2.4 啓發示例 392
23.2.5 重構說明 393
23.2.6 示例:響應器 (作為手動編碼的測試樁) 393
23.2.7 示例:響應器 (動態生成) 394
23.2.8 示例:破壞者 (作為匿名內部類) 395
23.2.9 示例:實體鏈裁剪 395
23.2.10 高級閱讀 397
23.3 測試間諜(也稱為:間諜、記錄測試樁) 397
23.3.1 運行原理 398
23.3.2 使用時機 398
23.3.3 實現方式說明 399
23.3.4 啓發示例 399
23.3.5 重構說明 400
23.3.6 示例:測試間諜 400
23.4 仿製對象 402
23.4.1 運行原理 402
23.4.2 使用時機 403
23.4.3 實現方式說明 403
23.4.4 啓發示例 404
23.4.5 重構說明 405
23.4.6 示例:仿製對象 (手動編碼的) 405
23.4.7 示例:仿製對象 (動態生成的) 406
23.4.8 高級閱讀 407
23.5 僞造對象(也稱為:啞元) 407
23.5.1 運行原理 408
23.5.2 使用時機 408
23.5.3 實現方式說明 409
23.5.4 啓發示例 410
23.5.5 重構說明 411
23.5.6 示例:僞造數據庫 411
23.5.7 高級閱讀 412
23.6 可配置的測試替身(也稱為:可配置的仿製對象、可配置的測試間諜、可配置的測試樁) 412
23.6.1 運行原理 413
23.6.2 使用時機 413
23.6.3 實現方式說明 413
23.6.4 啓發示例 415
23.6.5 重構說明 417
23.6.6 示例:使用設置者的配置接口 417
23.6.7 示例:使用錶達式生成器的配置接口 418
23.6.8 示例:配置模式 419
23.7 硬編碼的測試替身(也稱為:硬編碼的仿製對象、硬編碼的測試樁、硬編碼的測試間諜) 420
23.7.1 運行原理 421
23.7.2 使用時機 421
23.7.3 實現方式說明 421
23.7.4 啓發示例 423
23.7.5 重構說明 423
23.7.6 示例:測試替身類 424
23.7.7 示例:自分流/迴送 424
23.7.8 示例:子類化內部測試替身 425
23.7.9 示例:從僞類子類化的內部測試替身 426
23.7.10 高級閱讀 428
23.8 測試專用子類(也稱為:測試專用擴充) 429
23.8.1 運行原理 429
23.8.2 使用時機 430
23.8.3 實現方式說明 431
23.8.4 啓發示例 431
23.8.5 重構說明 433
23.8.6 示例:修改行為的子類(測試樁) 433
23.8.7 示例:修改行為的子類(代替的單態) 434
23.8.8 示例:提供行為的子類 435
23.8.9 示例:定義測試專用相等性(修改行為的子類) 436
23.8.10 示例:提供狀態的子類 437
第24章 測試組織模式 439
24.1 命名測試套件 439
24.1.1 運行原理 440
24.1.2 使用時機 440
24.1.3 實現方式說明 440
24.1.4 重構說明 441
24.1.5 示例:全部測試套件 441
24.1.6 示例:專用目的套件 442
24.1.7 示例:單個測試套件 442
24.1.8 示例:冒煙測試套件 443
24.2 測試實用程序方法 444
24.2.1 運行原理 444
24.2.2 使用時機 445
24.2.3 實現方式說明 447
24.2.4 啓發示例 447
24.2.5 重構說明 448
24.2.6 示例:測試實用程序方法 449
24.3 參數化測試 450
24.3.1 運行原理 451
24.3.2 使用時機 451
24.3.3 實現方式說明 452
24.3.4 啓發示例 453
24.3.5 重構說明 454
24.3.6 示例:參數化測試 454
24.3.7 示例:獨立錶格測試 455
24.3.8 示例:遞增的錶格測試 456
24.3.9 示例:使用架構支持的錶格測試(MbUnit) 456
24.3.10 示例:循環驅動測試(枚舉值) 457
24.3.11 示例:循環驅動測試(計算值) 457
24.4 每個類一個測試用例類 458
24.4.1 運行原理 459
24.4.2 使用時機 459
24.4.3 實現方式說明 459
24.5 每種特徵一個測試用例類 464
24.5.1 運行原理 465
24.5.2 使用時機 465
24.5.3 實現方式說明 466
24.5.4 啓發示例 466
24.5.5 重構說明 467
24.5.6 示例:每種特徵一個測試用例類 468
24.6 每個夾具一個測試用例類 469
24.6.1 運行原理 470
24.6.2 使用時機 470
24.6.3 實現方式說明 471
24.6.4 啓發示例 471
24.6.5 重構說明 473
24.6.6 示例:每個夾具一個測試用例類 473
24.7 測試用例超類 (也稱為抽象測試用例、抽象測試夾具、測試用例基類) 475
24.7.1 運行原理 476
24.7.2 使用時機 476
24.7.3 實現方式說明 477
24.7.4 啓發示例 477
24.7.5 重構說明 477
24.7.6 示例:測試用例超類 478
24.7.7 示例:測試輔助混入 478
24.8 測試輔助 480
24.8.1 運行原理 480
24.8.2 使用時機 480
24.8.3 實現方式說明 481
24.8.4 啓發示例 482
24.8.5 重構說明 482
24.8.6 示例:使用類方法的測試輔助 483
24.8.7 示例:使用實例方法的測試輔助 483
第25章 數據庫模式 485
25.1 數據庫沙盒 485
25.1.1 運行原理 486
25.1.2 使用時機 486
25.1.3 實現方式說明 486
25.1.4 啓發示例 487
25.1.5 重構說明 487
25.1.6 示例:數據庫分區方案 488
25.2 存儲過程測試 488
25.2.1 運行原理 489
25.2.2 使用時機 489
25.2.3 實現方式說明 489
25.2.4 啓發示例 491
25.2.5 重構說明 492
25.2.6 示例:數據庫內存儲過程測試 492
25.2.7 示例:遠程存儲過程測試 493
25.3 錶格截斷拆卸 493
25.3.1 運行原理 494
25.3.2 使用時機 494
25.3.3 實現方式說明 495
25.3.4 啓發示例 496
25.3.5 重構說明 496
25.3.6 示例:錶格截斷(委托)拆卸測試 496
25.3.7 示例:延遲拆卸測試 497
25.3.8 示例:使用SQL的錶格截斷拆卸 498
25.3.9 示例:使用ORM的錶格截斷拆卸 498
25.4 事務迴滾拆卸 499
25.4.1 運行原理 500
25.4.2 使用時機 500
25.4.3 實現方式說明 501
25.4.4 啓發示例 502
25.4.5 重構說明 502
25.4.6 示例:對象事務迴滾拆卸 503
25.4.7 示例:數據庫事務迴滾拆卸 504
第26章 易測性設計模式 507
26.1 依賴注入 507
26.1.1 運行原理 507
26.1.2 使用時機 508
26.1.3 實現方式說明 508
26.1.4 啓發示例 510
26.1.5 重構說明 510
26.1.6 示例:參數注入 511
26.1.7 示例:構造函數注入 511
26.1.8 示例:設置者注入 512
26.2 依賴查找(也稱為:服務定位器、對象工廠、組件代理、組件注冊庫) 513
26.2.1 運行原理 514
26.2.2 使用時機 514
26.2.3 實現方式說明 515
26.2.4 啓發示例 516
26.2.5 重構說明 517
26.2.6 示例:可配置的注冊庫 517
26.2.7 示例:代替的單態 518
26.2.8 關於名稱 520
26.3 低級對象 520
26.3.1 運行原理 521
26.3.2 使用時機 521
26.3.3 實現方式說明 522
26.3.4 啓發示例(低級可執行) 524
26.3.5 重構說明 525
26.3.6 示例:窮人的低級對象 526
26.3.7 示例:真正低級可執行 526
26.3.8 示例:低級對話 528
26.3.9 示例:低級事務控製器 531
26.4 測試掛鈎 531
26.4.1 運行原理 531
26.4.2 使用時機 532
26.4.3 實現方式說明 532
26.4.4 啓發示例 532
26.4.5 重構說明 533
26.4.6 示例:被測係統的測試掛鈎 533
26.4.7 示例:依賴組件中的測試掛鈎 533
第27章 值模式 535
27.1 字麵值(也稱為:硬編碼值、常量值) 535
27.1.1 運行原理 535
27.1.2 使用時機 535
27.1.3 實現方式說明 536
27.1.4 示例:字麵值 536
27.1.5 重構說明 537
27.1.6 示例:符號常量 537
27.1.7 示例:自述值 537
27.1.8 示例:不同值 538
27.2 派生值(也稱為:計算值) 538
27.2.1 運行原理 538
27.2.2 使用時機 539
27.2.3 啓發示例 539
27.2.4 重構說明 540
27.2.5 示例:派生預期 540
27.2.6 示例:一種壞屬性 540
27.3 生成值 542
27.3.1 運行原理 542
27.3.2 使用時機 542
27.3.3 實現方式說明 543
27.3.4 啓發示例 543
27.3.5 重構說明 544
27.3.6 示例:不同生成值 544
27.3.7 示例:相關生成值 545
27.4 啞元對象(也稱為:啞元、啞元參數、啞元值、占位符、樁) 545
27.4.1 運行原理 546
27.4.2 使用時機 546
27.4.3 實現方式說明 546
27.4.4 啓發示例 547
27.4.5 重構說明 548
27.4.6 示例:啞元值和啞元對象 548
第Ⅳ部分 附 錄
附錄A 測試重構 553
附錄B xUnit術語 559
附錄C xUnit傢族成員 565
附錄D 工具 571
附錄E 目標和原則 577
附錄F 味道、彆名和原因 579
附錄G 模式、彆名和變體 583
術語錶 595
參考文獻 619
· · · · · · (
收起)