本書全面介紹JUnit 5的新特性及其主要應(yīng)用。全書共22章,分為五部分。部分介紹JUnit 的核心、JUnit的體系結(jié)構(gòu)、從JUnit 4向JUnit 5遷移、軟件測試原則等內(nèi)容;第二部分介紹軟件測試質(zhì)量、用stub和mock object進(jìn)行測試、容器內(nèi)測試等內(nèi)容;第三部分介紹用Maven和Gradle工具運(yùn)行JUnit測試、IDE對JUnit 5的支持、JUnit 5的持續(xù)集成等內(nèi)容;第四部分介紹JUnit 5擴(kuò)展模型,表示層測試,Spring、Spring Boot和REST API以及數(shù)據(jù)庫應(yīng)用程序的測試等內(nèi)容;第五部分介紹使用JUnit 5進(jìn)行測試驅(qū)動開發(fā)和行為驅(qū)動開發(fā),以及用JUnit 5實(shí)現(xiàn)測試金字塔策略等內(nèi)容。
本書既適合剛接觸JUnit框架的Java開發(fā)人員閱讀,也適合想要了解JUnit 5新特性的、經(jīng)驗(yàn)豐富的JUnit開發(fā)人員學(xué)習(xí),尤其適合企業(yè)級Java開發(fā)人員閱讀。本書還可作為高等院校學(xué)生軟件測試課程的參考用書。
1.JUnit 5實(shí)戰(zhàn)類圖書。涵蓋從JUnit 4向JUnit 5遷移、軟件測試原則等內(nèi)容,讓讀者深入了解JUnit框架。
2.細(xì)致講解Java開發(fā)人員進(jìn)行單元測試和集成測試的實(shí)用框架,有效測試自動化、測試驅(qū)動開發(fā)和行為驅(qū)動開發(fā)。
4.大量真實(shí)世界中的應(yīng)用程序案例,包括Spring、Spring Boot 以及 REST API 測試,更好地掌握如何在實(shí)際項(xiàng)目中使用JUnit進(jìn)行測試。
5.將 JUnit 5 與 Maven/Gradle 結(jié)合起來使用,提供大量實(shí)用的建議和技巧,幫助讀者在項(xiàng)目中快速而有效地使用JUnit框架。
克特林·圖多塞(Catalin Tudose),擁有計(jì)算機(jī)科學(xué)專業(yè)的博士學(xué)位,擔(dān)任過 Java 高級開發(fā)員和技術(shù)團(tuán)隊(duì)帶頭人,有超過 15年的 Java 開發(fā)經(jīng)驗(yàn)。
第 一部分 JUnit
第 1章 JUnit起步 3
1.1 證明程序的可運(yùn)行性 4
1.2 從零開始 5
1.2.1 單元測試框架的規(guī)則 8
1.2.2 添加單元測試 8
1.3 安裝JUnit 9
1.4 使用JUnit測試 11
1.5 小結(jié) 13
第 2章 探索JUnit的核心 14
2.1 核心注解 15
2.1.1 @DisplayName注解 17
2.1.2 @Disabled注解 18
2.2 嵌套測試 20
2.3 標(biāo)記測試 21
2.4 斷言 22
2.5 假設(shè) 26
2.6 JUnit 5的依賴注入 28
2.6.1 TestInfoParameterResolver 28
2.6.2 TestReporterParameterResolver 29
2.6.3 RepetitionInfoParameterResolver 30
2.7 重復(fù)測試 30
2.8 參數(shù)化測試 32
2.9 動態(tài)測試 35
2.10 使用Hamcrest 匹配器 37
2.11 小結(jié) 41
第3章 JUnit的體系結(jié)構(gòu) 42
3.1 軟件體系結(jié)構(gòu)的概念和重要性 42
3.1.1 故事一:電話簿 43
3.1.2 故事二:運(yùn)動鞋制造商 43
3.2 JUnit 4的體系結(jié)構(gòu) 44
3.2.1 JUnit 4模塊化 44
3.2.2 JUnit 4運(yùn)行器 45
3.2.3 JUnit 4規(guī)則 47
3.2.4 JUnit 4體系結(jié)構(gòu)的缺點(diǎn) 52
3.3 JUnit 5的體系結(jié)構(gòu) 52
3.3.1 JUnit 5模塊化 52
3.3.2 JUnit Platform 53
3.3.3 JUnit Jupiter 53
3.3.4 JUnit Vintage 54
3.3.5 JUnit 5體系結(jié)構(gòu)的全景 54
3.4 小結(jié) 56
第4章 從JUnit 4向JUnit 5遷移 57
4.1 從JUnit 4向JUnit 5跨越 57
4.2 所需的依賴項(xiàng) 58
4.3 注解、類和方法 60
4.3.1 等價的注解、類和方法 60
4.3.2 分類和標(biāo)記 64
4.3.3 遷移Hamcrest匹配器功能 69
4.3.4 規(guī)則與擴(kuò)展模型 71
4.3.5 自定義規(guī)則 74
4.4 小結(jié) 78
第5章 軟件測試原則 79
5.1 單元測試的必要性 79
5.1.1 帶來更高的測試覆蓋率 80
5.1.2 提高團(tuán)隊(duì)的工作效率 80
5.1.3 檢測出衰退跡象和減少調(diào)試次數(shù) 80
5.1.4 自信地重構(gòu) 80
5.1.5 改進(jìn)實(shí)現(xiàn) 82
5.1.6 文檔化預(yù)期行為 82
5.1.7 啟用代碼覆蓋率和其他指標(biāo) 83
5.2 測試類型 83
5.2.1 單元測試 84
5.2.2 集成測試 84
5.2.3 系統(tǒng)測試 85
5.2.4 驗(yàn)收測試 85
5.3 黑盒測試和白盒測試的對比 86
5.3.1 黑盒測試 86
5.3.2 白盒測試 86
5.3.3 黑盒測試和白盒測試的優(yōu)點(diǎn)和缺點(diǎn) 87
5.4 小結(jié) 88
第二部分 不同的測試策略
第6章 測試質(zhì)量 91
6.1 測試覆蓋率度量 91
6.1.1 測試覆蓋率簡介 92
6.1.2 代碼覆蓋率度量工具 93
6.2 編寫易于測試的代碼 96
6.2.1 理解公共API契約 97
6.2.2 減少依賴 97
6.2.3 創(chuàng)建簡單的構(gòu)造方法 98
6.2.4 遵循迪米特法則 99
6.2.5 避開隱藏的依賴項(xiàng)和全局狀態(tài) 100
6.2.6 優(yōu)先使用泛型方法 101
6.2.7 組合優(yōu)于繼承 102
6.2.8 多態(tài)優(yōu)于條件 102
6.3 測試驅(qū)動開發(fā) 104
6.3.1 調(diào)整開發(fā)周期 104
6.3.2 TDD的兩個核心步驟 105
6.4 行為驅(qū)動開發(fā) 106
6.5 突變測試 106
6.6 開發(fā)周期中的測試 107
6.7 小結(jié) 110
第7章 用stub進(jìn)行粗粒度測試 111
7.1 stub簡介 112
7.2 用stub測試一個HTTP連接 113
7.2.1 選擇stub的使用方案 115
7.2.2 用Jetty充當(dāng)嵌入式服務(wù)器 115
7.3 用stub替換服務(wù)器資源 117
7.3.1 構(gòu)建第 一個stub測試 117
7.3.2 回顧第 一個stub測試 120
7.4 替換連接 120
7.4.1 創(chuàng)建自定義的URL協(xié)議處理器 121
7.4.2 創(chuàng)建一個JDK的HttpURLConnection stub 122
7.4.3 運(yùn)行測試 123
7.5 小結(jié) 124
第8章 用mock object進(jìn)行測試 125
8.1 mock object簡介 125
8.2 用mock object進(jìn)行單元測試 126
8.3 用mock object進(jìn)行重構(gòu) 129
8.3.1 重構(gòu)示例 130
8.3.2 重構(gòu)方面的考慮 131
8.4 模擬HTTP連接 133
8.4.1 mock object的定義 133
8.4.2 示例方法的測試 134
8.4.3 第 一個嘗試:簡單的方法重構(gòu)技巧 135
8.4.4 第二個嘗試:使用類工廠進(jìn)行重構(gòu) 137
8.5 把mocks用作特洛伊木馬 139
8.6 mock框架簡介 141
8.6.1 使用EasyMock 142
8.6.2 使用JMock 146
8.6.3 使用Mockito 150
8.7 小結(jié) 153
第9章 容器內(nèi)測試 154
9.1 標(biāo)準(zhǔn)單元測試的局限性 154
9.2 mock object解決方法 155
9.3 容器內(nèi)測試的步驟 157
9.3.1 實(shí)現(xiàn)策略 157
9.3.2 容器內(nèi)測試框架 158
9.4 stub、mock object和容器內(nèi)測試的對比 158
9.4.1 對stub的評價 159
9.4.2 對mock object的評價 159
9.4.3 對容器內(nèi)測試的評價 160
9.5 用Arquillian進(jìn)行測試 161
9.6 小結(jié) 168
第三部分 運(yùn)用JUnit 5及其他工具
第 10章 在Maven 3中運(yùn)行JUnit測試 171
10.1 建立Maven項(xiàng)目 171
10.2 使用Maven插件 174
10.2.1 Maven的Compiler插件 175
10.2.2 Maven的Surefire插件 176
10.2.3 用Maven生成HTML格式的JUnit報(bào)告 178
10.3 集成所有 178
10.4 Maven的挑戰(zhàn)性 183
10.5 小結(jié) 183
第 11章 在Gradle 6中運(yùn)行JUnit測試 184
11.1 Gradle簡介 184
11.2 創(chuàng)建Gradle項(xiàng)目 186
11.3 使用Gradle插件 190
11.4 從頭開始創(chuàng)建Gradle項(xiàng)目,再用JUnit 5測試 190
11.5 比較Gradle和Maven 194
11.6 小結(jié) 195
第 12章 IDE對JUnit 5的支持 196
12.1 JUnit 5與IntelliJ IDEA集成 197
12.2 JUnit 5與Eclipse集成 202
12.3 JUnit 5與NetBeans集成 206
12.4 JUnit 5與IntelliJ IDEA、Eclipse和NetBeans集成的比較 211
12.5 小結(jié) 211
第 13章 JUnit 5的持續(xù)集成 212
13.1 持續(xù)集成測試 212
13.2 Jenkins簡介 214
13.3 團(tuán)隊(duì)實(shí)踐持續(xù)集成 217
13.4 配置Jenkins 222
13.5 在CI環(huán)境中處理任務(wù) 225
13.6 小結(jié) 230
第四部分 使用現(xiàn)代框架和JUnit 5
第 14章 JUnit 5擴(kuò)展模型 233
14.1 JUnit 5擴(kuò)展模型簡介 233
14.2 創(chuàng)建JUnit 5擴(kuò)展 234
14.3 使用可用的擴(kuò)展點(diǎn)編寫JUnit 5測試 237
14.3.1 將乘客信息持久化到數(shù)據(jù)庫中 237
14.3.2 檢查乘客的性 246
14.4 小結(jié) 248
第 15章 表示層測試 249
15.1 選擇測試框架 250
15.2 HtmlUnit簡介 250
15.3 編寫HtmlUnit測試 252
15.3.1 HTML斷言 252
15.3.2 對特定的Web瀏覽器進(jìn)行測試 252
15.3.3 對多個Web瀏覽器進(jìn)行測試 253
15.3.4 創(chuàng)建獨(dú)立的測試 254
15.3.5 測試表單 256
15.3.6 測試JavaScript 257
15.4 Selenium簡介 261
15.5 編寫Selenium測試 262
15.5.1 對特定的Web瀏覽器進(jìn)行測試 264
15.5.2 使用Web瀏覽器測試導(dǎo)航 265
15.5.3 測試多個Web瀏覽器 266
15.5.4 用不同的Web瀏覽器測試Google搜索和導(dǎo)航 268
15.5.5 測試網(wǎng)站的身份驗(yàn)證 270
15.6 HtmlUnit與Selenium的對比 275
15.7 小結(jié) 275
第 16章 Spring應(yīng)用程序測試 277
16.1 Spring框架簡介 277
16.2 依賴注入簡介 278
16.3 構(gòu)建和測試Spring應(yīng)用程序 283
16.3.1 以編程方式創(chuàng)建Spring上下文 283
16.3.2 使用Spring TestContext框架 286
16.4 為JUnit Jupiter使用SpringExtension 288
16.5 添加新特性并使用JUnit 5測試 290
16.6 小結(jié) 296
第 17章 Spring Boot應(yīng)用程序測試 297
17.1 Spring Boot簡介 297
17.2 用Spring Initializr創(chuàng)建項(xiàng)目 298
17.3 將Spring應(yīng)用遷移到Spring Boot中 300
17.4 為Spring Boot實(shí)現(xiàn)特定測試的配置 303
17.5 在Spring Boot應(yīng)用中添加和測試新特性 305
17.6 小結(jié) 309
第 18章 REST API測試 311
18.1 REST應(yīng)用程序簡介 311
18.2 創(chuàng)建RESTful API來管理實(shí)體 312
18.3 創(chuàng)建RESTful API來管理兩個相關(guān)實(shí)體 319
18.4 測試RESTful API 326
18.5 小結(jié) 330
第 19章 數(shù)據(jù)庫應(yīng)用程序測試 331
19.1 數(shù)據(jù)庫單元測試阻抗不匹配 331
19.1.1 單元測試必須運(yùn)行獨(dú)立的代碼 332
19.1.2 單元測試必須易于編寫和運(yùn)行 332
19.1.3 單元測試必須快速運(yùn)行 333
19.2 測試JDBC應(yīng)用程序 333
19.3 測試Spring JDBC應(yīng)用程序 342
19.4 測試Hibernate應(yīng)用程序 349
19.5 測試Spring Hibernate應(yīng)用程序 354
19.6 測試數(shù)據(jù)庫應(yīng)用程序的方法比較 360
19.7 小結(jié) 361
第五部分 用JUnit 5開發(fā)應(yīng)用程序
第 20章 用JUnit 5進(jìn)行測試驅(qū)動開發(fā) 365
20.1 TDD的主要概念 365
20.2 航班管理應(yīng)用程序 366
20.3 將航班管理應(yīng)用程序遷移到TDD 371
20.4 重構(gòu)航班管理應(yīng)用程序 375
20.5 使用TDD引入新特性 379
20.5.1 增加一種高級航班 379
20.5.2 同一名乘客只能添加一次 387
20.6 小結(jié) 390
第 21章 使用JUnit 5進(jìn)行行為驅(qū)動開發(fā) 391
21.1 行為驅(qū)動開發(fā)簡介 391
21.1.1 一種新特性的引入 392
21.1.2 從需求分析到驗(yàn)收標(biāo)準(zhǔn) 392
21.1.3 BDD的優(yōu)點(diǎn)和挑戰(zhàn)性 393
21.2 使用Cucumber和JUnit 5操作BDD風(fēng)格 394
21.2.1 Cucumber簡介 395
21.2.2 將TDD特性遷移到Cucumber中 396
21.2.3 使用Cucumber增加一個新功能 403
21.3 使用JBehave和JUnit 5操作BDD風(fēng)格 410
21.3.1 JBehave簡介 410
21.3.2 將TDD特性遷移到JBehave中 410
21.3.3 使用JBehave增加一個新功能 416
21.4 Cucumber與Jbehave的比較 423
21.5 小結(jié) 423
第 22章 用JUnit 5實(shí)現(xiàn)測試金字塔策略 424
22.1 軟件測試的層次 424
22.2 單元測試:隔離運(yùn)行的基本組件 425
22.3 集成測試:單元組合 435
22.4 系統(tǒng)測試:考查完整的 軟件 442
22.4.1 使用模擬的外部依賴項(xiàng)進(jìn)行測試 443
22.4.2 使用部分實(shí)現(xiàn)的外部依賴項(xiàng)進(jìn)行測試 447
22.4.3 使用完全實(shí)現(xiàn)的外部依賴項(xiàng)進(jìn)行測試 449
22.5 驗(yàn)收測試:軟件滿足業(yè)務(wù)需求 452
22.6 小結(jié) 461
附錄A Maven 462
A.1 約定優(yōu)于配置 462
A.2 強(qiáng)依賴管理 462
A.3 Maven的構(gòu)建生命周期 463
A.4 基于插件的體系結(jié)構(gòu) 465
A.5 Maven的項(xiàng)目對象模型 466
A.6 安裝Maven 467
附錄B Gradle 468
B.1 安裝Gradle 468
B.2 創(chuàng)建Gradle任務(wù) 470
附錄C IDE 473
C.1 安裝IntelliJ IDEA 473
C.2 安裝Eclipse 474
C.3 安裝NetBeans 475
附錄D Jenkins 476