《JUnit實戰(第2版)》是2019年8月人民郵電出版社出版的圖書,作者是[美]Petar Tahchiev、Felipe Leme、Vincent Massol、Gary Gregory。
內容簡介,圖書目錄,
內容簡介
《JUnit實戰(第 2版)》從認識JUnit、不同的測試策略、JUnit與構建過程、JUnit擴展4個方面,由淺入深、由易到難地對JUnit展開了系統的講解,包括探索JUnit的核心、軟體測試原則、測試覆蓋率與開發、使用stub進行粗粒度測試、使用mock objects進行測試、容器內測試、從Ant中運墊霸蒸鑽行JUnit測試、從Maven2中運行JUnit測試、持續集成工具、表示層的測試、Ajax測試、使用Cactus進行伺服器端的Java測試、測試JSF應用程式、測試OSGi組件、測試資料庫訪問、測試基於JPA的應用程式、JUnit的其他用法等內容。
《JUnit實戰(第 2版)》不僅僅介紹了使用JUnit框架測試項目必須掌握的核心概念,還指導讀者如何使用JUnit框架編寫自己的測試用例,並針對在編寫代碼的過程中如何使得代碼可測試給出建議。本書還介紹了基礎的軟體開發應婆辣原則,如測試驅動開發(TDD)等,以便指導用戶如何使用不同的工具來測試典型Java EE應用程式的每一層。此外,本書也提供了幾個附錄,以幫助讀者快速轉換到**新版本的JUnit,並且能夠輕鬆地集成自己喜歡的IDE。
《JUnit實戰(第 2版)》適合於已具有一定Java編程基礎的讀者,以及在Java平台下進行各類軟體開發的開發人員、測試人員。對於單元測試學習者和編程愛好者來說,本書則具有極高的學習參考價值。
圖書目錄
第 1部分 認識JUnit
第譽剃戶1章 JUnit起步 3
1.1 證實它能運行 4
1.2 從零開始 6
1.3 理解單元測試框架 8
1.4 JUnit的設計目標 9
1.5 安裝JUnit 9
1.6 使用JUnit測試 10
1.7 小結 13
第 2章 探索JUnit的核心 14
2.1 探索JUnit核心 15
2.2 運行參數化測試 17
2.3 JUnit的測試運行器 18
2.3.1 測愉阿甩試運行欠探酷器簡介 18
2.3.2 JUnitCore fa ade 19
2.3.3 自定義測試運行器 20
2.4 用Suite來組合測試 20
2.4.1 組合一組測試類 20
2.4.2 組合一組測試集 21
2.4.3 Suite、IDE、Ant與Maven 22
2.5 小結 23
第3章 掌握JUnit 24
3.1 引入controller組件 24
3.1.1 設計接口 25
3.1.2 實現基類 27
3.2 讓我們來測試它 29
3.2.1 測試DefaultController 29
3.2.2 添加一個處理器 30
3.2.3 請求處理 33
3.2.4 改進testProcessRequest 37
3.3 測試異常處理 38
3.3.1 模擬異常條件 39
3.3.2 測試異常 42
3.4 逾時測試 43
3.5 引入Hamcrest匹配器 45
3.6 創建測試項目 48
3.7 小結 49
第4章 軟體測試原則 50
4.1 單元測試的必要性 51
4.1.1 帶來更高的測試覆蓋率 51
4.1.2 提高團隊效率 51
4.1.3 監測衰退和減少調試 51
4.1.4 自信廈想立重地重構 52
4.1.5 改進實現 52
4.1.6 將預期的行為文檔化 53
4.1.7 啟用代碼覆蓋率以及其他指標 53
4.2 測試類型 54
4.2.1 軟體測試的4種類型 54
4.2.2 單元測試的3種類型 57
4.3 黑盒測試與白盒測試 58
4.4 小結 60
第 2部分 不同的測試策略
第5章 測試覆蓋率與開發 63
5.1 測量測試覆蓋率 63
5.1.1 測試覆蓋率簡介 64
5.1.2 Cobertura簡介 64
5.1.3 生成測試覆蓋率報告 66
5.1.4 結合黑盒與白盒測試 67
5.2 編寫可測試的代碼 68
5.2.1 公共API是協定 良夜68
5.2.2 減少依賴關係 68
5.2.3 創建簡單的構造函式 69
5.2.4 遵循**少知識原則 70
5.2.5 避免隱藏的依賴關係與全局狀態 70
5.2.6 單態模式的優點和缺點 71
5.2.7 優先使用通用方法 72
5.2.8 組合優先於繼承 73
5.2.9 多態優先於條件語句 73
5.3 測試驅動開發 74
5.3.1 調整開發周期 74
5.3.2 TDD的兩個步驟 75
5.4 在開發周期中的測試 76
5.5 小結 79
第6章 使用stub進行粗粒度測試 80
6.1 stub簡介 81
6.2 使用stub測試一個HTTP連線 82
6.2.1 選擇使用stub的方案 83
6.2.2 使用Jetty作為嵌入式伺服器 84
6.3 使用stub替換Web伺服器資源 86
6.3.1 建立第 一個stub測試 86
6.3.2 針對故障情況進行測試 89
6.3.3 回顧第 一個stub測試 90
6.4 替換連線 91
6.4.1 創建自定義的URL協定處理器 91
6.4.2 創建一個JDK的HttpURLConnection stub 92
6.4.3 運行測試 93
6.5 小結 94
第7章 使用mock objects進行測試 95
7.1 mock objects簡介 96
7.2 使用mock objects進行單元測試 96
7.3 使用mock objects來重構 99
7.3.1 重構示例 100
7.4 替換一個HTTP連線 102
7.4.1 定義mock objects 103
7.4.2 測試一個簡單的方法 104
7.4.3 第 一次嘗試:簡單的方法重構技巧 104
7.4.4 第 二個嘗試:使用類工廠來重構 106
7.5 把mocks用作特洛伊木馬 109
7.6 介紹mock框架 112
7.6.1 使用EasyMock 112
7.6.2 使用JMock 116
7.7 小結 119
第8章 容器內測試 121
8.1 標準單元測試的局限性 121
8.2 mock objects解決方案 122
8.3 容器內測試 124
8.3.1 實現策略 124
8.3.2 容器內測試框架 125
8.4 比較stub、mock objects和容器內測試 125
8.4.1 stub的優點與缺點 125
8.4.2 mock objects的優點和缺點 126
8.4.3 容器內測試的優點與缺點 127
8.4.4 容器內測試與容器外測試 129
8.5 小結 129
第3部分 JUnit與構建過程
第9章 從Ant中運行JUnit測試 133
9.1 生命中的一 天 133
9.2 從Ant中運行測試 134
9.3 認識並安裝Ant 135
9.4 Ant的目標、項目、屬性以及任務 136
9.4.1 javac任務 138
9.4.2 JUnit任務 139
9.5 讓Ant來執行任務 140
9.6 使用Ivy進行依賴管理 141
9.7 創建HTML報告 143
9.8 批處理測試 145
9.9 小結 147
第 10章 從Maven2中運行JUnit測試 148
10.1 Maven的功能 149
10.1.1 約定優於配置 149
10.1.2 強大的依賴管理 150
10.1.3 Maven的構建生命周期 151
10.1.4 基於外掛程式的架構 152
10.1.5 Maven項目對象模型 153
10.2 建立一個Maven項目 155
10.3 Maven外掛程式的引入 159
10.3.1 Maven的Compiler外掛程式 159
10.3.2 Maven的Surefire外掛程式 160
10.3.3 使用Maven生成HTML格式的JUnit報告 162
10.4 Maven的不足 163
10.5 小結 164
第 11章 持續集成工具 165
11.1 嘗試持續集成 165
11.1.1 持續集成測試 166
11.2 拯救用戶的CruiseControl 168
11.2.1 開始使用CruiseControl 168
11.2.2 創建一個示例項目 169
11.2.3 解析CruiseControl配置檔案 169
11.3 另一個持續集成工具——Hudson 174
11.3.1 Hudson簡介 175
11.3.2 安裝 175
11.3.3 配置Hudson 176
11.3.4 配置Hudson中的項目 177
11.4 持續集成的優勢 180
11.5 小結 180
第4部分 JUnit擴展
第 12章 表示層的測試 185
12.1 選擇測試框架 186
12.2 HtmlUnit簡介 186
12.2.1 一個實例 186
12.3 編寫HtmlUnit測試 187
12.3.1 HTML斷言 187
12.3.2 對特定的Web瀏覽器進行測試 188
12.3.3 測試多個Web瀏覽器 188
12.3.4 創建獨立的測試 189
12.3.5 導航對象模型 191
12.3.6 通過特定的元素類型訪問元素 191
12.3.7 通過名字與索引訪問元素 191
12.3.8 通過引用訪問元素 192
12.3.9 使用XPath 193
12.3.10 測試失敗和異常 194
12.3.11 應用程式與網路導航 195
12.3.12 使用HtmlUnit測試表單 197
12.3.13 測試框架(frame) 198
12.3.14 測試JavaScript 199
12.3.15 測試CSS 201
12.3.16 SSL錯誤 202
12.4 集成HtmlUnit和Cactus 202
12.4.1 在Cactus中編寫測試 202
12.5 Selenium簡介 204
12.6 生成Selenium測試 206
12.6.1 一個實例 206
12.7 運行Selenium測試 207
12.7.1 管理Selenium伺服器 207
12.7.2 使用JUnit 4運行Selenium測試 208
12.8 編寫Selenium測試 211
12.8.1 針對特定的Web瀏覽器進行測試 211
12.8.2 測試多個瀏覽器 212
12.8.3 應用程式和網路導航 214
12.8.4 通過引用訪問元素 215
12.8.5 通過異常使測試失敗 215
12.8.6 使用Selenium測試表單 216
12.8.7 測試JavaScript告警 216
12.8.8 捕獲一個JUnit 3測試失敗的截屏 217
12.8.9 捕獲一個JUnit 4測試失敗的截屏 217
12.9 HtmlUnit與Selenium 218
12.10 小結 219
第 13章 Ajax測試 220
13.1 Ajax應用程式難以測試的原因 221
13.1.1 傳統的Web互動 221
13.1.2 Ajax互動 221
13.1.3 一個嶄新的世界 223
13.1.4 測試的挑戰 223
13.2 Ajax的測試模式 223
13.2.1 功能測試 224
13.2.2 客戶端腳本單元測試 224
13.2.3 服務測試 225
13.3 功能測試 225
13.3.1 使用Seleniun進行功能測試 225
13.3.2 使用HtmlUnit進行功能測試 229
13.4 JavaScript測試 231
13.4.1 使用RhinoUnit測試JavaScript 231
13.4.2 使用JsUnit測試JavaScript 234
13.4.3 編寫JsUnit測試用例 234
13.4.4 編寫JsUnit測試集 236
13.4.5 手動運行JsUnit測試用例 237
13.4.6 使用Ant自動運行JsUnit測試用例 238
13.5 RhinoUnit與JsUnit 241
13.6 使用JSLint檢驗**佳實踐 241
13.7 使用HttpClient測試服務 243
13.7.1 調用XML服務 243
13.7.2 驗證XML回響 244
13.7.3 驗證JSON回響 245
13.8 測試Google Web工具箱應用程式 247
13.8.1 為GWT應用程式選擇測試框架 247
13.8.2 手動創建GWTTestCase 249
13.8.3 使用junitCreator創建GWTTestCase 251
13.8.4 運行測試用例 252
13.8.5 安裝和拆卸測試 252
13.8.6 創建測試集 252
13.8.7 運行測試集 253
13.9 小結 253
第 14章 使用Cactus進行伺服器端的Java測試 255
14.1 什麼是Cactus? 256
14.2 使用Cactus進行測試 256
14.2.1 你可以使用Cactus測試的Java組件 256
14.2.2 一般原則 257
14.2.3 Cactus如何工作 259
14.3 測試servlet和filters 261
14.3.1 介紹管理應用程式 262
14.3.2 使用Cactus編寫servlet測試 262
14.4 測試JSP 268
14.4.1 回顧管理應用程式 268
14.4.2 什麼是JSP單元測試? 269
14.4.3 單獨使用Cactus對JSP進行單元測試 269
14.4.4 利用SQL結果數據執行JSP 270
14.5 測試EJB 272
14.6 什麼是Cargo 274
14.7 使用Ant執行Cactus測試 275
14.7.1 用來準備檔案的Cactus 275
14.8 使用Maven2x執行Cactus測試 280
14.8.1 Maven2 cactifywar MOJO 280
14.8.2 Maven2 cactifyear MOJO 284
14.9 從瀏覽器執行Cactus測試 285
14.10 小結 286
第 15章 測試JSF應用程式 287
15.1 引入JSF 288
15.2 介紹示例應用程式 289
15.3 測試JSF應用程式時的典型問題 295
15.4 測試JSF應用程式的策略 296
15.4.1 黑盒方法 296
15.4.2 Mock object援救 296
15.5 使用JSUnit測試示例應用程式 298
15.5.1 從瀏覽器執行一個JSFUnit測試 299
15.5.2 使用JSFUnit測試Ajax 299
15.6 使用HtmlUnit與JSFUnit 301
15.7 JSF應用程式的性能測試 302
15.8 小結 304
第 16章 測試OSGi組件 305
16.1 OSGi簡介 306
16.2 第 一個OSGi服務 307
16.2.1 示例應用程式 310
16.3 測試OSGi服務 313
16.3.1 Mock objects 313
16.4 引入JUnit4OSGi 316
16.5 小結 320
第 17章 測試資料庫訪問 321
17.1 資料庫單元測試的阻抗不匹配 322
17.1.1 單元測試必須執行隔離的代碼 322
17.1.2 單元測試必須易於編寫和運行 322
17.1.3 單元測試必須運行快速 323
17.2 DbUnit介紹 323
17.2.1 示例應用程式 324
17.2.2 設定DbUnit並運行示例應用程式 325
17.3 使用數據集來填充資料庫 325
17.3.1 剖析DatabaseOperation 329
17.4 用數據集斷言資料庫狀態 330
17.4.1 過濾數據集 332
17.4.2 忽略數據列 332
17.5 使用ReplacementDataSet轉換數據 334
17.5.1 使用ReplacementDataSet處理不同的ID問題 334
17.5.2 處理NULL值 336
17.6 從已有的資料庫數據中創建數據集 340
17.7 高 級技術 341
17.7.1 DbUnit與模板設計模式 341
17.7.2 通過自定義注釋提高重用 344
17.7.3 在數據集中使用表達式語言 346
17.8 資料庫訪問測試的**佳做法 349
17.8.1 每個開 發者使用一個資料庫 349
17.8.2 確保目標資料庫被測試 350
17.8.3 為載入和存儲數據創建互補測試 350
17.8.4 編寫載入測試用例時,應涵蓋所有基本場景 350
17.8.5 計畫數據集的使用 351
17.8.6 測試清理 351
17.9 小結 352
第 18章 測試基於JPA的應用程式 353
18.1 測試多層應用程式 354
18.1.1 示例應用程式 354
18.1.2 多層、多種測試策略 356
18.2 JPA測試的方方面面 359
18.3 準備基礎設施 360
18.4 測試JPA實體映射 364
18.4.1 使用JPA ID生成器集成測試用例 365
18.5 測試基於JPA的DAO 371
18.6 測試外鍵名字 376
18.7 小結 379
第 19章 JUnit的其他用法 380
19.1 介紹 381
19.1.1 工具概述 381
19.1.2 運行示例 382
19.2 透明地使用mock 382
19.2.1 Unitils的EasyMock支持 383
19.2.2 FEST-Mocks 385
19.2.3 Mycila 386
19.3 DbUnit集成 388
19.4 使斷言更簡單 391
19.4.1 JUnit-addons斷言包 392
19.4.2 Unitlis的ReflectionAssert 393
19.4.3 FEST流暢斷言模組 395
19.4.4 Mylica繼承斷言 396
19.5 使用反射繞過封裝 397
19.5.1 內部替代物 397
19.5.2 JUnit-addons 399
19.5.3 FEST-Reflect 400
19.6 小結 401
附錄A JUnit 3和JUnit 4之間的不同 403
A.1 全球的需求變化 403
A.1.1 JDK的要求 403
A.1.2 向後/向前兼容 404
A.2 API中的變化 404
A.2.1 包結構 404
A.2.2 構造函式 404
A.2.3 擴展TestCase 404
A.2.4 測試方法名稱 405
A.3 注釋與新增的靜態導入 405
A.3.1 @Before與@After注釋 405
A.3.2 @BeforeClass和@AfterClass注釋 406
A.3.3 忽略測試的差異 406
A.3.4 靜態導入 407
A.3.5 異常測試 407
A.3.6 逾時測試 408
A.4 新的JUnit runners 408
A.4.1 測試運行器(Test runner) 408
A.4.2 測試集 409
A.4.3 參數化測試 409
A.5 新的斷言和假設 410
A.5.1 Hamcrest斷言 411
A.5.2 假設 411
A.5.3 新斷言 412
A.5.4 斷言錯誤 412
附錄B 使用自定義的運行器和匹配器擴展JUnitAPI 413
B.1 介紹攔截器模式 414
B.2 實現自定義運行器 414
B.3 實現自定義匹配器 420
附錄C 本書原始碼 425
C.1 獲取原始碼 425
C.2 原始碼概覽 426
C.3 外部庫 427
C.4 JAR版本 427
C.5 結構約定 428
附錄D JUnit IDE集成 429
D.1 JUnit與Eclipse的集成 429
D.1.1 安裝Eclipse 429
D.1.2 從原始碼創建Eclipse項目 430
D.1.3 從Eclipse運行JUnit測試 430
D.1.4 從Eclipse運行Ant腳本 431
D.2 引入JUnitMAX Eclipse外掛程式 433
D.2.1 集成在你的開發周期中 433
D.2.2 執行順序 434
D.2.3 恢復到上一個穩定版本 434
D.3 JUnit與NetBeans集成 434
D.3.1 安裝NetBeans 434
D.3.2 從原始碼中創建NetBeans項目 435
D.3.3 從NetBeans運行JUnit測試 435
D.3.4 從NetBeans運行Ant腳本 437
附錄E 安裝軟體 439
E.1 安裝HtmlUnit 439
E.1.1 標準配置 439
E.1.2 Eclipse的配置 440
E.2 使用HtmlUnit配置Cactus 441
E.3 安裝Selenium 442
E.4 安裝RhinoUnit 442
E.5 安裝JsUnit 442
3.4 逾時測試 43
3.5 引入Hamcrest匹配器 45
3.6 創建測試項目 48
3.7 小結 49
第4章 軟體測試原則 50
4.1 單元測試的必要性 51
4.1.1 帶來更高的測試覆蓋率 51
4.1.2 提高團隊效率 51
4.1.3 監測衰退和減少調試 51
4.1.4 自信地重構 52
4.1.5 改進實現 52
4.1.6 將預期的行為文檔化 53
4.1.7 啟用代碼覆蓋率以及其他指標 53
4.2 測試類型 54
4.2.1 軟體測試的4種類型 54
4.2.2 單元測試的3種類型 57
4.3 黑盒測試與白盒測試 58
4.4 小結 60
第 2部分 不同的測試策略
第5章 測試覆蓋率與開發 63
5.1 測量測試覆蓋率 63
5.1.1 測試覆蓋率簡介 64
5.1.2 Cobertura簡介 64
5.1.3 生成測試覆蓋率報告 66
5.1.4 結合黑盒與白盒測試 67
5.2 編寫可測試的代碼 68
5.2.1 公共API是協定 68
5.2.2 減少依賴關係 68
5.2.3 創建簡單的構造函式 69
5.2.4 遵循**少知識原則 70
5.2.5 避免隱藏的依賴關係與全局狀態 70
5.2.6 單態模式的優點和缺點 71
5.2.7 優先使用通用方法 72
5.2.8 組合優先於繼承 73
5.2.9 多態優先於條件語句 73
5.3 測試驅動開發 74
5.3.1 調整開發周期 74
5.3.2 TDD的兩個步驟 75
5.4 在開發周期中的測試 76
5.5 小結 79
第6章 使用stub進行粗粒度測試 80
6.1 stub簡介 81
6.2 使用stub測試一個HTTP連線 82
6.2.1 選擇使用stub的方案 83
6.2.2 使用Jetty作為嵌入式伺服器 84
6.3 使用stub替換Web伺服器資源 86
6.3.1 建立第 一個stub測試 86
6.3.2 針對故障情況進行測試 89
6.3.3 回顧第 一個stub測試 90
6.4 替換連線 91
6.4.1 創建自定義的URL協定處理器 91
6.4.2 創建一個JDK的HttpURLConnection stub 92
6.4.3 運行測試 93
6.5 小結 94
第7章 使用mock objects進行測試 95
7.1 mock objects簡介 96
7.2 使用mock objects進行單元測試 96
7.3 使用mock objects來重構 99
7.3.1 重構示例 100
7.4 替換一個HTTP連線 102
7.4.1 定義mock objects 103
7.4.2 測試一個簡單的方法 104
7.4.3 第 一次嘗試:簡單的方法重構技巧 104
7.4.4 第 二個嘗試:使用類工廠來重構 106
7.5 把mocks用作特洛伊木馬 109
7.6 介紹mock框架 112
7.6.1 使用EasyMock 112
7.6.2 使用JMock 116
7.7 小結 119
第8章 容器內測試 121
8.1 標準單元測試的局限性 121
8.2 mock objects解決方案 122
8.3 容器內測試 124
8.3.1 實現策略 124
8.3.2 容器內測試框架 125
8.4 比較stub、mock objects和容器內測試 125
8.4.1 stub的優點與缺點 125
8.4.2 mock objects的優點和缺點 126
8.4.3 容器內測試的優點與缺點 127
8.4.4 容器內測試與容器外測試 129
8.5 小結 129
第3部分 JUnit與構建過程
第9章 從Ant中運行JUnit測試 133
9.1 生命中的一 天 133
9.2 從Ant中運行測試 134
9.3 認識並安裝Ant 135
9.4 Ant的目標、項目、屬性以及任務 136
9.4.1 javac任務 138
9.4.2 JUnit任務 139
9.5 讓Ant來執行任務 140
9.6 使用Ivy進行依賴管理 141
9.7 創建HTML報告 143
9.8 批處理測試 145
9.9 小結 147
第 10章 從Maven2中運行JUnit測試 148
10.1 Maven的功能 149
10.1.1 約定優於配置 149
10.1.2 強大的依賴管理 150
10.1.3 Maven的構建生命周期 151
10.1.4 基於外掛程式的架構 152
10.1.5 Maven項目對象模型 153
10.2 建立一個Maven項目 155
10.3 Maven外掛程式的引入 159
10.3.1 Maven的Compiler外掛程式 159
10.3.2 Maven的Surefire外掛程式 160
10.3.3 使用Maven生成HTML格式的JUnit報告 162
10.4 Maven的不足 163
10.5 小結 164
第 11章 持續集成工具 165
11.1 嘗試持續集成 165
11.1.1 持續集成測試 166
11.2 拯救用戶的CruiseControl 168
11.2.1 開始使用CruiseControl 168
11.2.2 創建一個示例項目 169
11.2.3 解析CruiseControl配置檔案 169
11.3 另一個持續集成工具——Hudson 174
11.3.1 Hudson簡介 175
11.3.2 安裝 175
11.3.3 配置Hudson 176
11.3.4 配置Hudson中的項目 177
11.4 持續集成的優勢 180
11.5 小結 180
第4部分 JUnit擴展
第 12章 表示層的測試 185
12.1 選擇測試框架 186
12.2 HtmlUnit簡介 186
12.2.1 一個實例 186
12.3 編寫HtmlUnit測試 187
12.3.1 HTML斷言 187
12.3.2 對特定的Web瀏覽器進行測試 188
12.3.3 測試多個Web瀏覽器 188
12.3.4 創建獨立的測試 189
12.3.5 導航對象模型 191
12.3.6 通過特定的元素類型訪問元素 191
12.3.7 通過名字與索引訪問元素 191
12.3.8 通過引用訪問元素 192
12.3.9 使用XPath 193
12.3.10 測試失敗和異常 194
12.3.11 應用程式與網路導航 195
12.3.12 使用HtmlUnit測試表單 197
12.3.13 測試框架(frame) 198
12.3.14 測試JavaScript 199
12.3.15 測試CSS 201
12.3.16 SSL錯誤 202
12.4 集成HtmlUnit和Cactus 202
12.4.1 在Cactus中編寫測試 202
12.5 Selenium簡介 204
12.6 生成Selenium測試 206
12.6.1 一個實例 206
12.7 運行Selenium測試 207
12.7.1 管理Selenium伺服器 207
12.7.2 使用JUnit 4運行Selenium測試 208
12.8 編寫Selenium測試 211
12.8.1 針對特定的Web瀏覽器進行測試 211
12.8.2 測試多個瀏覽器 212
12.8.3 應用程式和網路導航 214
12.8.4 通過引用訪問元素 215
12.8.5 通過異常使測試失敗 215
12.8.6 使用Selenium測試表單 216
12.8.7 測試JavaScript告警 216
12.8.8 捕獲一個JUnit 3測試失敗的截屏 217
12.8.9 捕獲一個JUnit 4測試失敗的截屏 217
12.9 HtmlUnit與Selenium 218
12.10 小結 219
第 13章 Ajax測試 220
13.1 Ajax應用程式難以測試的原因 221
13.1.1 傳統的Web互動 221
13.1.2 Ajax互動 221
13.1.3 一個嶄新的世界 223
13.1.4 測試的挑戰 223
13.2 Ajax的測試模式 223
13.2.1 功能測試 224
13.2.2 客戶端腳本單元測試 224
13.2.3 服務測試 225
13.3 功能測試 225
13.3.1 使用Seleniun進行功能測試 225
13.3.2 使用HtmlUnit進行功能測試 229
13.4 JavaScript測試 231
13.4.1 使用RhinoUnit測試JavaScript 231
13.4.2 使用JsUnit測試JavaScript 234
13.4.3 編寫JsUnit測試用例 234
13.4.4 編寫JsUnit測試集 236
13.4.5 手動運行JsUnit測試用例 237
13.4.6 使用Ant自動運行JsUnit測試用例 238
13.5 RhinoUnit與JsUnit 241
13.6 使用JSLint檢驗**佳實踐 241
13.7 使用HttpClient測試服務 243
13.7.1 調用XML服務 243
13.7.2 驗證XML回響 244
13.7.3 驗證JSON回響 245
13.8 測試Google Web工具箱應用程式 247
13.8.1 為GWT應用程式選擇測試框架 247
13.8.2 手動創建GWTTestCase 249
13.8.3 使用junitCreator創建GWTTestCase 251
13.8.4 運行測試用例 252
13.8.5 安裝和拆卸測試 252
13.8.6 創建測試集 252
13.8.7 運行測試集 253
13.9 小結 253
第 14章 使用Cactus進行伺服器端的Java測試 255
14.1 什麼是Cactus? 256
14.2 使用Cactus進行測試 256
14.2.1 你可以使用Cactus測試的Java組件 256
14.2.2 一般原則 257
14.2.3 Cactus如何工作 259
14.3 測試servlet和filters 261
14.3.1 介紹管理應用程式 262
14.3.2 使用Cactus編寫servlet測試 262
14.4 測試JSP 268
14.4.1 回顧管理應用程式 268
14.4.2 什麼是JSP單元測試? 269
14.4.3 單獨使用Cactus對JSP進行單元測試 269
14.4.4 利用SQL結果數據執行JSP 270
14.5 測試EJB 272
14.6 什麼是Cargo 274
14.7 使用Ant執行Cactus測試 275
14.7.1 用來準備檔案的Cactus 275
14.8 使用Maven2x執行Cactus測試 280
14.8.1 Maven2 cactifywar MOJO 280
14.8.2 Maven2 cactifyear MOJO 284
14.9 從瀏覽器執行Cactus測試 285
14.10 小結 286
第 15章 測試JSF應用程式 287
15.1 引入JSF 288
15.2 介紹示例應用程式 289
15.3 測試JSF應用程式時的典型問題 295
15.4 測試JSF應用程式的策略 296
15.4.1 黑盒方法 296
15.4.2 Mock object援救 296
15.5 使用JSUnit測試示例應用程式 298
15.5.1 從瀏覽器執行一個JSFUnit測試 299
15.5.2 使用JSFUnit測試Ajax 299
15.6 使用HtmlUnit與JSFUnit 301
15.7 JSF應用程式的性能測試 302
15.8 小結 304
第 16章 測試OSGi組件 305
16.1 OSGi簡介 306
16.2 第 一個OSGi服務 307
16.2.1 示例應用程式 310
16.3 測試OSGi服務 313
16.3.1 Mock objects 313
16.4 引入JUnit4OSGi 316
16.5 小結 320
第 17章 測試資料庫訪問 321
17.1 資料庫單元測試的阻抗不匹配 322
17.1.1 單元測試必須執行隔離的代碼 322
17.1.2 單元測試必須易於編寫和運行 322
17.1.3 單元測試必須運行快速 323
17.2 DbUnit介紹 323
17.2.1 示例應用程式 324
17.2.2 設定DbUnit並運行示例應用程式 325
17.3 使用數據集來填充資料庫 325
17.3.1 剖析DatabaseOperation 329
17.4 用數據集斷言資料庫狀態 330
17.4.1 過濾數據集 332
17.4.2 忽略數據列 332
17.5 使用ReplacementDataSet轉換數據 334
17.5.1 使用ReplacementDataSet處理不同的ID問題 334
17.5.2 處理NULL值 336
17.6 從已有的資料庫數據中創建數據集 340
17.7 高 級技術 341
17.7.1 DbUnit與模板設計模式 341
17.7.2 通過自定義注釋提高重用 344
17.7.3 在數據集中使用表達式語言 346
17.8 資料庫訪問測試的**佳做法 349
17.8.1 每個開 發者使用一個資料庫 349
17.8.2 確保目標資料庫被測試 350
17.8.3 為載入和存儲數據創建互補測試 350
17.8.4 編寫載入測試用例時,應涵蓋所有基本場景 350
17.8.5 計畫數據集的使用 351
17.8.6 測試清理 351
17.9 小結 352
第 18章 測試基於JPA的應用程式 353
18.1 測試多層應用程式 354
18.1.1 示例應用程式 354
18.1.2 多層、多種測試策略 356
18.2 JPA測試的方方面面 359
18.3 準備基礎設施 360
18.4 測試JPA實體映射 364
18.4.1 使用JPA ID生成器集成測試用例 365
18.5 測試基於JPA的DAO 371
18.6 測試外鍵名字 376
18.7 小結 379
第 19章 JUnit的其他用法 380
19.1 介紹 381
19.1.1 工具概述 381
19.1.2 運行示例 382
19.2 透明地使用mock 382
19.2.1 Unitils的EasyMock支持 383
19.2.2 FEST-Mocks 385
19.2.3 Mycila 386
19.3 DbUnit集成 388
19.4 使斷言更簡單 391
19.4.1 JUnit-addons斷言包 392
19.4.2 Unitlis的ReflectionAssert 393
19.4.3 FEST流暢斷言模組 395
19.4.4 Mylica繼承斷言 396
19.5 使用反射繞過封裝 397
19.5.1 內部替代物 397
19.5.2 JUnit-addons 399
19.5.3 FEST-Reflect 400
19.6 小結 401
附錄A JUnit 3和JUnit 4之間的不同 403
A.1 全球的需求變化 403
A.1.1 JDK的要求 403
A.1.2 向後/向前兼容 404
A.2 API中的變化 404
A.2.1 包結構 404
A.2.2 構造函式 404
A.2.3 擴展TestCase 404
A.2.4 測試方法名稱 405
A.3 注釋與新增的靜態導入 405
A.3.1 @Before與@After注釋 405
A.3.2 @BeforeClass和@AfterClass注釋 406
A.3.3 忽略測試的差異 406
A.3.4 靜態導入 407
A.3.5 異常測試 407
A.3.6 逾時測試 408
A.4 新的JUnit runners 408
A.4.1 測試運行器(Test runner) 408
A.4.2 測試集 409
A.4.3 參數化測試 409
A.5 新的斷言和假設 410
A.5.1 Hamcrest斷言 411
A.5.2 假設 411
A.5.3 新斷言 412
A.5.4 斷言錯誤 412
附錄B 使用自定義的運行器和匹配器擴展JUnitAPI 413
B.1 介紹攔截器模式 414
B.2 實現自定義運行器 414
B.3 實現自定義匹配器 420
附錄C 本書原始碼 425
C.1 獲取原始碼 425
C.2 原始碼概覽 426
C.3 外部庫 427
C.4 JAR版本 427
C.5 結構約定 428
附錄D JUnit IDE集成 429
D.1 JUnit與Eclipse的集成 429
D.1.1 安裝Eclipse 429
D.1.2 從原始碼創建Eclipse項目 430
D.1.3 從Eclipse運行JUnit測試 430
D.1.4 從Eclipse運行Ant腳本 431
D.2 引入JUnitMAX Eclipse外掛程式 433
D.2.1 集成在你的開發周期中 433
D.2.2 執行順序 434
D.2.3 恢復到上一個穩定版本 434
D.3 JUnit與NetBeans集成 434
D.3.1 安裝NetBeans 434
D.3.2 從原始碼中創建NetBeans項目 435
D.3.3 從NetBeans運行JUnit測試 435
D.3.4 從NetBeans運行Ant腳本 437
附錄E 安裝軟體 439
E.1 安裝HtmlUnit 439
E.1.1 標準配置 439
E.1.2 Eclipse的配置 440
E.2 使用HtmlUnit配置Cactus 441
E.3 安裝Selenium 442
E.4 安裝RhinoUnit 442
E.5 安裝JsUnit 442