本書(shū)全面介紹JUnit 5的新特性及其主要應(yīng)用。全書(shū)共22章,分為五部分。部分介紹JUnit 的核心、JUnit的體系結(jié)構(gòu)、從JUnit 4向JUnit 5遷移、軟件測(cè)試原則等內(nèi)容;第二部分介紹軟件測(cè)試質(zhì)量、用stub和mock object進(jìn)行測(cè)試、容器內(nèi)測(cè)試等內(nèi)容;第三部分介紹用Maven和Gradle工具運(yùn)行JUnit測(cè)試、IDE對(duì)JUnit 5的支持、JUnit 5的持續(xù)集成等內(nèi)容;第四部分介紹JUnit 5擴(kuò)展模型,表示層測(cè)試,Spring、Spring Boot和REST API以及數(shù)據(jù)庫(kù)應(yīng)用程序的測(cè)試等內(nèi)容;第五部分介紹使用JUnit 5進(jìn)行測(cè)試驅(qū)動(dòng)開(kāi)發(fā)和行為驅(qū)動(dòng)開(kāi)發(fā),以及用JUnit 5實(shí)現(xiàn)測(cè)試金字塔策略等內(nèi)容。
本書(shū)既適合剛接觸JUnit框架的Java開(kāi)發(fā)人員閱讀,也適合想要了解JUnit 5新特性的、經(jīng)驗(yàn)豐富的JUnit開(kāi)發(fā)人員學(xué)習(xí),尤其適合企業(yè)級(jí)Java開(kāi)發(fā)人員閱讀。本書(shū)還可作為高等院校學(xué)生軟件測(cè)試課程的參考用書(shū)。
1.JUnit 5實(shí)戰(zhàn)類(lèi)圖書(shū)。涵蓋從JUnit 4向JUnit 5遷移、軟件測(cè)試原則等內(nèi)容,讓讀者深入了解JUnit框架。
2.細(xì)致講解Java開(kāi)發(fā)人員進(jìn)行單元測(cè)試和集成測(cè)試的實(shí)用框架,有效測(cè)試自動(dòng)化、測(cè)試驅(qū)動(dòng)開(kāi)發(fā)和行為驅(qū)動(dòng)開(kāi)發(fā)。
4.大量真實(shí)世界中的應(yīng)用程序案例,包括Spring、Spring Boot 以及 REST API 測(cè)試,更好地掌握如何在實(shí)際項(xiàng)目中使用JUnit進(jìn)行測(cè)試。
5.將 JUnit 5 與 Maven/Gradle 結(jié)合起來(lái)使用,提供大量實(shí)用的建議和技巧,幫助讀者在項(xiàng)目中快速而有效地使用JUnit框架。
克特林·圖多塞(Catalin Tudose),擁有計(jì)算機(jī)科學(xué)專(zhuān)業(yè)的博士學(xué)位,擔(dān)任過(guò) Java 高級(jí)開(kāi)發(fā)員和技術(shù)團(tuán)隊(duì)帶頭人,有超過(guò) 15年的 Java 開(kāi)發(fā)經(jīng)驗(yàn)。
第 一部分 JUnit
第 1章 JUnit起步 3
1.1 證明程序的可運(yùn)行性 4
1.2 從零開(kāi)始 5
1.2.1 單元測(cè)試框架的規(guī)則 8
1.2.2 添加單元測(cè)試 8
1.3 安裝JUnit 9
1.4 使用JUnit測(cè)試 11
1.5 小結(jié) 13
第 2章 探索JUnit的核心 14
2.1 核心注解 15
2.1.1 @DisplayName注解 17
2.1.2 @Disabled注解 18
2.2 嵌套測(cè)試 20
2.3 標(biāo)記測(cè)試 21
2.4 斷言 22
2.5 假設(shè) 26
2.6 JUnit 5的依賴(lài)注入 28
2.6.1 TestInfoParameterResolver 28
2.6.2 TestReporterParameterResolver 29
2.6.3 RepetitionInfoParameterResolver 30
2.7 重復(fù)測(cè)試 30
2.8 參數(shù)化測(cè)試 32
2.9 動(dòng)態(tài)測(cè)試 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)動(dòng)鞋制造商 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 所需的依賴(lài)項(xiàng) 58
4.3 注解、類(lèi)和方法 60
4.3.1 等價(jià)的注解、類(lèi)和方法 60
4.3.2 分類(lèi)和標(biāo)記 64
4.3.3 遷移Hamcrest匹配器功能 69
4.3.4 規(guī)則與擴(kuò)展模型 71
4.3.5 自定義規(guī)則 74
4.4 小結(jié) 78
第5章 軟件測(cè)試原則 79
5.1 單元測(cè)試的必要性 79
5.1.1 帶來(lái)更高的測(cè)試覆蓋率 80
5.1.2 提高團(tuán)隊(duì)的工作效率 80
5.1.3 檢測(cè)出衰退跡象和減少調(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 測(cè)試類(lèi)型 83
5.2.1 單元測(cè)試 84
5.2.2 集成測(cè)試 84
5.2.3 系統(tǒng)測(cè)試 85
5.2.4 驗(yàn)收測(cè)試 85
5.3 黑盒測(cè)試和白盒測(cè)試的對(duì)比 86
5.3.1 黑盒測(cè)試 86
5.3.2 白盒測(cè)試 86
5.3.3 黑盒測(cè)試和白盒測(cè)試的優(yōu)點(diǎn)和缺點(diǎn) 87
5.4 小結(jié) 88
第二部分 不同的測(cè)試策略
第6章 測(cè)試質(zhì)量 91
6.1 測(cè)試覆蓋率度量 91
6.1.1 測(cè)試覆蓋率簡(jiǎn)介 92
6.1.2 代碼覆蓋率度量工具 93
6.2 編寫(xiě)易于測(cè)試的代碼 96
6.2.1 理解公共API契約 97
6.2.2 減少依賴(lài) 97
6.2.3 創(chuàng)建簡(jiǎn)單的構(gòu)造方法 98
6.2.4 遵循迪米特法則 99
6.2.5 避開(kāi)隱藏的依賴(lài)項(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 測(cè)試驅(qū)動(dòng)開(kāi)發(fā) 104
6.3.1 調(diào)整開(kāi)發(fā)周期 104
6.3.2 TDD的兩個(gè)核心步驟 105
6.4 行為驅(qū)動(dòng)開(kāi)發(fā) 106
6.5 突變測(cè)試 106
6.6 開(kāi)發(fā)周期中的測(cè)試 107
6.7 小結(jié) 110
第7章 用stub進(jìn)行粗粒度測(cè)試 111
7.1 stub簡(jiǎn)介 112
7.2 用stub測(cè)試一個(gè)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)建第 一個(gè)stub測(cè)試 117
7.3.2 回顧第 一個(gè)stub測(cè)試 120
7.4 替換連接 120
7.4.1 創(chuàng)建自定義的URL協(xié)議處理器 121
7.4.2 創(chuàng)建一個(gè)JDK的HttpURLConnection stub 122
7.4.3 運(yùn)行測(cè)試 123
7.5 小結(jié) 124
第8章 用mock object進(jìn)行測(cè)試 125
8.1 mock object簡(jiǎn)介 125
8.2 用mock object進(jìn)行單元測(cè)試 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 示例方法的測(cè)試 134
8.4.3 第 一個(gè)嘗試:簡(jiǎn)單的方法重構(gòu)技巧 135
8.4.4 第二個(gè)嘗試:使用類(lèi)工廠進(jìn)行重構(gòu) 137
8.5 把mocks用作特洛伊木馬 139
8.6 mock框架簡(jiǎn)介 141
8.6.1 使用EasyMock 142
8.6.2 使用JMock 146
8.6.3 使用Mockito 150
8.7 小結(jié) 153
第9章 容器內(nèi)測(cè)試 154
9.1 標(biāo)準(zhǔn)單元測(cè)試的局限性 154
9.2 mock object解決方法 155
9.3 容器內(nèi)測(cè)試的步驟 157
9.3.1 實(shí)現(xiàn)策略 157
9.3.2 容器內(nèi)測(cè)試框架 158
9.4 stub、mock object和容器內(nèi)測(cè)試的對(duì)比 158
9.4.1 對(duì)stub的評(píng)價(jià) 159
9.4.2 對(duì)mock object的評(píng)價(jià) 159
9.4.3 對(duì)容器內(nèi)測(cè)試的評(píng)價(jià) 160
9.5 用Arquillian進(jìn)行測(cè)試 161
9.6 小結(jié) 168
第三部分 運(yùn)用JUnit 5及其他工具
第 10章 在Maven 3中運(yùn)行JUnit測(cè)試 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測(cè)試 184
11.1 Gradle簡(jiǎn)介 184
11.2 創(chuàng)建Gradle項(xiàng)目 186
11.3 使用Gradle插件 190
11.4 從頭開(kāi)始創(chuàng)建Gradle項(xiàng)目,再用JUnit 5測(cè)試 190
11.5 比較Gradle和Maven 194
11.6 小結(jié) 195
第 12章 IDE對(duì)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ù)集成測(cè)試 212
13.2 Jenkins簡(jiǎn)介 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ò)展模型簡(jiǎn)介 233
14.2 創(chuàng)建JUnit 5擴(kuò)展 234
14.3 使用可用的擴(kuò)展點(diǎn)編寫(xiě)JUnit 5測(cè)試 237
14.3.1 將乘客信息持久化到數(shù)據(jù)庫(kù)中 237
14.3.2 檢查乘客的性 246
14.4 小結(jié) 248
第 15章 表示層測(cè)試 249
15.1 選擇測(cè)試框架 250
15.2 HtmlUnit簡(jiǎn)介 250
15.3 編寫(xiě)HtmlUnit測(cè)試 252
15.3.1 HTML斷言 252
15.3.2 對(duì)特定的Web瀏覽器進(jìn)行測(cè)試 252
15.3.3 對(duì)多個(gè)Web瀏覽器進(jìn)行測(cè)試 253
15.3.4 創(chuàng)建獨(dú)立的測(cè)試 254
15.3.5 測(cè)試表單 256
15.3.6 測(cè)試JavaScript 257
15.4 Selenium簡(jiǎn)介 261
15.5 編寫(xiě)Selenium測(cè)試 262
15.5.1 對(duì)特定的Web瀏覽器進(jìn)行測(cè)試 264
15.5.2 使用Web瀏覽器測(cè)試導(dǎo)航 265
15.5.3 測(cè)試多個(gè)Web瀏覽器 266
15.5.4 用不同的Web瀏覽器測(cè)試Google搜索和導(dǎo)航 268
15.5.5 測(cè)試網(wǎng)站的身份驗(yàn)證 270
15.6 HtmlUnit與Selenium的對(duì)比 275
15.7 小結(jié) 275
第 16章 Spring應(yīng)用程序測(cè)試 277
16.1 Spring框架簡(jiǎn)介 277
16.2 依賴(lài)注入簡(jiǎn)介 278
16.3 構(gòu)建和測(cè)試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測(cè)試 290
16.6 小結(jié) 296
第 17章 Spring Boot應(yīng)用程序測(cè)試 297
17.1 Spring Boot簡(jiǎn)介 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)特定測(cè)試的配置 303
17.5 在Spring Boot應(yīng)用中添加和測(cè)試新特性 305
17.6 小結(jié) 309
第 18章 REST API測(cè)試 311
18.1 REST應(yīng)用程序簡(jiǎn)介 311
18.2 創(chuàng)建RESTful API來(lái)管理實(shí)體 312
18.3 創(chuàng)建RESTful API來(lái)管理兩個(gè)相關(guān)實(shí)體 319
18.4 測(cè)試RESTful API 326
18.5 小結(jié) 330
第 19章 數(shù)據(jù)庫(kù)應(yīng)用程序測(cè)試 331
19.1 數(shù)據(jù)庫(kù)單元測(cè)試阻抗不匹配 331
19.1.1 單元測(cè)試必須運(yùn)行獨(dú)立的代碼 332
19.1.2 單元測(cè)試必須易于編寫(xiě)和運(yùn)行 332
19.1.3 單元測(cè)試必須快速運(yùn)行 333
19.2 測(cè)試JDBC應(yīng)用程序 333
19.3 測(cè)試Spring JDBC應(yīng)用程序 342
19.4 測(cè)試Hibernate應(yīng)用程序 349
19.5 測(cè)試Spring Hibernate應(yīng)用程序 354
19.6 測(cè)試數(shù)據(jù)庫(kù)應(yīng)用程序的方法比較 360
19.7 小結(jié) 361
第五部分 用JUnit 5開(kāi)發(fā)應(yīng)用程序
第 20章 用JUnit 5進(jìn)行測(cè)試驅(qū)動(dòng)開(kāi)發(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 增加一種高級(jí)航班 379
20.5.2 同一名乘客只能添加一次 387
20.6 小結(jié) 390
第 21章 使用JUnit 5進(jìn)行行為驅(qū)動(dòng)開(kāi)發(fā) 391
21.1 行為驅(qū)動(dòng)開(kāi)發(fā)簡(jiǎn)介 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簡(jiǎn)介 395
21.2.2 將TDD特性遷移到Cucumber中 396
21.2.3 使用Cucumber增加一個(gè)新功能 403
21.3 使用JBehave和JUnit 5操作BDD風(fēng)格 410
21.3.1 JBehave簡(jiǎn)介 410
21.3.2 將TDD特性遷移到JBehave中 410
21.3.3 使用JBehave增加一個(gè)新功能 416
21.4 Cucumber與Jbehave的比較 423
21.5 小結(jié) 423
第 22章 用JUnit 5實(shí)現(xiàn)測(cè)試金字塔策略 424
22.1 軟件測(cè)試的層次 424
22.2 單元測(cè)試:隔離運(yùn)行的基本組件 425
22.3 集成測(cè)試:?jiǎn)卧M合 435
22.4 系統(tǒng)測(cè)試:考查完整的 軟件 442
22.4.1 使用模擬的外部依賴(lài)項(xiàng)進(jìn)行測(cè)試 443
22.4.2 使用部分實(shí)現(xiàn)的外部依賴(lài)項(xiàng)進(jìn)行測(cè)試 447
22.4.3 使用完全實(shí)現(xiàn)的外部依賴(lài)項(xiàng)進(jìn)行測(cè)試 449
22.5 驗(yàn)收測(cè)試:軟件滿(mǎn)足業(yè)務(wù)需求 452
22.6 小結(jié) 461
附錄A Maven 462
A.1 約定優(yōu)于配置 462
A.2 強(qiáng)依賴(lài)管理 462
A.3 Maven的構(gòu)建生命周期 463
A.4 基于插件的體系結(jié)構(gòu) 465
A.5 Maven的項(xiàng)目對(duì)象模型 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