本書是一部基于大量自測實踐詳細介紹如何編寫高質(zhì)量 Java 代碼的作品。全書共 11 章,分為三篇。
研發(fā)自測基礎(chǔ)篇(第 1~6 章),主要介紹了日常工作使用頻率高的基礎(chǔ)知識,包括軟件測試的基本概念、代碼評審的方式、單元測試等內(nèi)容。為了讓測試的編寫更容易,這一篇還介紹了測試替身,以及如何與 Spring框架相結(jié)合來編寫測試等內(nèi)容。
研發(fā)自測高級篇(第 7~10 章),首先介紹了驗證程序性能的方法和程序并發(fā)安全的相關(guān)知識,然后深入講解了什么是 TDD 和如何為重構(gòu)編寫測試等內(nèi)容。
源碼分析篇(第 11 章),對常見測試框架和庫的源碼(包括 JUnit、Mockito、JaCoCo 等)進行了分析。通過探究測試框架和庫的源碼,讓讀者更為深刻地掌握測試技術(shù)。
本書適合 Java 開發(fā)人員、負(fù)責(zé)公司軟件質(zhì)量的相關(guān)人員和測試人員閱讀。
(1)本書內(nèi)容全面,競爭力強,結(jié)構(gòu)清晰。本書以普通應(yīng)用開發(fā)者會涉及的知識點為綱要,深入剖析了這些知識點,全面而透徹。
(3)內(nèi)容豐富,層層遞進,便于理解。系統(tǒng)講解Java 開發(fā)者如何進行開發(fā)自測,幫助開發(fā)人員通過自己先來保證軟件的質(zhì)量。將測試行為提前到進入測試周期前,可以提高提測的成功率,減少開發(fā)任務(wù)在測試階段的停留時間,提高迭代效率。
(4)作者資歷深厚,擁有多年的開發(fā)經(jīng)驗,本書內(nèi)容是基于作者在工作中的積累整理而成,實戰(zhàn)性強。
林寧,Thoughtworks 軟件工程師、咨詢師,目前專注于微服務(wù)架構(gòu)設(shè)計、中間件開發(fā)和領(lǐng)域驅(qū)動設(shè)計,有大量的單元測試、API自動化測試等經(jīng)驗。長期從事國內(nèi)外企業(yè)軟件開發(fā),熟悉敏捷實踐,為國內(nèi)多家大型企業(yè)據(jù)供與領(lǐng)域驅(qū)動設(shè)計和軟件建模相關(guān)的咨詢和培訓(xùn)服務(wù)。
魏兆玉,Thoughtworks 咨詢師,從業(yè)10余年,專注于敏捷軟件開發(fā),,并為國內(nèi)外知名企業(yè)提供過人才培養(yǎng)服務(wù),其中包含敏捷全棧開發(fā)、測試驅(qū)動開發(fā)、整潔代碼與重構(gòu)、軟件設(shè)計、敏捷實踐以及Web應(yīng)用安全等方面的人才培養(yǎng),擔(dān)任過開發(fā)工程師、項目經(jīng)理和培訓(xùn)師。
目錄
研發(fā)自測基礎(chǔ)篇
第 1章 研發(fā)自測基礎(chǔ)3
1.1 軟件測試的基本概念3
1.1.1 軟件測試3
1.1.2 缺陷4
1.1.3 測試用例5
1.1.4 測試金字塔6
1.1.5 測試策略7
1.1.6 測試左移和測試右移8
1.1.7 質(zhì)量度量8
1.2 軟件的測試分類10
1.2.1 單元測試10
1.2.2 集成測試11
1.2.3 系統(tǒng)測試11
1.2.4 驗收測試11
1.2.5 靜態(tài)代碼分析12
1.2.6 安全測試12
1.2.7 性能測試12
1.3 測試用例設(shè)計入門13
1.3.1 劃分等價類13
1.3.2 邊界值分析法14
1.3.3 場景法15
1.4 開發(fā)人員自測范圍16
1.4.1 新交付的需求18
1.4.2 缺陷處理18
1.4.3 重構(gòu)18
1.4.4 數(shù)據(jù)遷移18
1.5 測試數(shù)據(jù)的構(gòu)造和安全18
1.5.1 高效構(gòu)造測試數(shù)據(jù)19
1.5.2 測試數(shù)據(jù)的安全21
1.6 小結(jié)22
第 2章 代碼評審23
2.1 常用的靜態(tài)代碼分析工具24
2.1.1 Checkstyle24
2.1.2 FindBugs34
2.1.3 ArchUnit40
2.1.4 OWASP DependencyCheck46
2.2 人工代碼評審47
2.2.1 代碼評審的場景47
2.2.2 代碼評審的工具48
2.2.3 代碼評審的注意事項48
2.2.4 Java代碼評審清單50
2.3 Git工作流和保護50
2.3.1 Git工作流50
2.3.2 Git Hooks51
2.3.3 分支保護53
2.4 小結(jié)53
第3章 單元測試基礎(chǔ)55
3.1 單元測試55
3.1.1 什么是單元測試55
3.1.2 為什么需要單元測試56
3.1.3 怎么學(xué)習(xí)單元測試56
3.1.4 搭建JUnit環(huán)境57
3.1.5 給“Hello, world!”寫一個單元測試58
3.2 斷言59
3.2.1 編寫一個簡單的斷言庫60
3.2.2 JUnit內(nèi)置的斷言方法60
3.2.3 使用assertThat和Matcher方法61
3.2.4 編寫自己的Matcher方法63
3.2.5 斷言并不只是單元測試中的概念63
3.2.6 思考題64
3.3 單元測試的設(shè)計64
3.3.1 準(zhǔn)備并清理測試數(shù)據(jù)65
3.3.2 設(shè)計單元測試用例66
3.3.3 參數(shù)化單元測試用例69
3.4 單元測試的使用技巧70
3.4.1 測試異常70
3.4.2 測試覆蓋率72
3.4.3 使用JUnit Rule73
3.4.4 其他技巧74
3.4.5 新手容易犯的錯誤75
3.5 基于JUnit 5實現(xiàn)測試76
3.5.1 JUnit 5的架構(gòu)說明76
3.5.2 使用JUnit 577
3.5.3 更強的斷言能力78
3.5.4 嵌套測試78
3.5.5 拓展的變化80
3.6 Java單元測試的原則和約定80
3.6.1 FIRST原則80
3.6.2 單元測試的約定81
3.7 小結(jié)81
第4章 測試替身82
4.1 測試替身簡介82
4.2 Mockito84
4.2.1 使用mock方法85
4.2.2 捕捉參數(shù)對象87
4.2.3 設(shè)置模擬對象的行為88
4.2.4 參數(shù)匹配器89
4.2.5 使用spy方法90
4.2.6 使用注解91
4.2.7 其他技巧93
4.3 增強測試:靜態(tài)、私有方法的處理94
4.3.1 模擬靜態(tài)方法94
4.3.2 模擬構(gòu)造方法97
4.3.3 模擬私有方法98
4.3.4 反射工具箱99
4.4 測試代碼的結(jié)構(gòu)模式100
4.4.1 準(zhǔn)備-執(zhí)行-斷言100
4.4.2 四階段測試100
4.5 基于測試替身的反思101
4.5.1 “大泥球”101
4.5.2 分層過多102
4.5.3 濫用測試替身102
4.6 小結(jié)103
第5章 Spring應(yīng)用的測試104
5.1 理解Spring測試體系105
5.2 啟動Spring上下文測試106
5.3 啟動Spring Boot上下文測試109
5.3.1 @SpringBootTest注解109
5.3.2 對Bean的模擬和監(jiān)視112
5.3.3 Spring Boot切片配置113
5.4 分層測試和測試策略117
5.4.1 分層測試策略117
5.4.2 MockMvc的執(zhí)行原理118
5.4.3 內(nèi)嵌基礎(chǔ)設(shè)施120
5.5 常用的測試工具集122
5.5.1 Spring Test庫提供的工具集122
5.5.2 spring-boot-test庫提供的工具集123
5.6 小結(jié)125
第6章 RESTful API測試126
6.1 RESTful API測試工具集126
6.1.1 REST Assured127
6.1.2 MariaDB128
6.1.3 DbUnit129
6.2 API測試實例131
6.3 使用JsonPath斷言136
6.4 鑒權(quán)138
6.4.1 Basic鑒權(quán)138
6.4.2 Token鑒權(quán)138
6.4.3 Cookie鑒權(quán)139
6.5 文件處理140
6.6 模擬第三方API140
6.6.1 使用適配器模式模擬140
6.6.2 WireMock143
6.7 API自動化測試策略150
6.7.1 應(yīng)用API151
6.7.2 領(lǐng)域API152
6.8 小結(jié)154
研發(fā)自測高級篇
第7章 性能和并發(fā)檢測157
7.1 微基準(zhǔn)性能測試158
7.1.1 使用Maven構(gòu)建微基準(zhǔn)性能測試158
7.1.2 一個直觀的示例160
7.1.3 使用JUnit運行微基準(zhǔn)性能測試161
7.2 API性能測試163
7.2.1 JMeter介紹163
7.2.2 安裝JMeter164
7.2.3 設(shè)計測試計劃165
7.2.4 執(zhí)行測試計劃170
7.2.5 理解JMeter173
7.3 并發(fā)檢測176
7.3.1 幾種并發(fā)模型176
7.3.2 并發(fā)問題類型180
7.3.3 并發(fā)測試技術(shù)181
7.3.4 并發(fā)問題的檢測實例182
7.4 小結(jié)190
第8章 測試驅(qū)動開發(fā)191
8.1 理解TDD191
8.1.1 TDD的多重含義191
8.1.2 TDD的操作過程192
8.1.3 TDD的價值193
8.2 TDD的操作指南193
8.3 TDD的實例演示195
8.3.1 任務(wù)拆解和環(huán)境搭建195
8.3.2 第 一輪任務(wù)196
8.3.3 第二輪任務(wù)198
8.3.4 第三輪任務(wù)199
8.4 使用TDD的技巧201
8.4.1 任務(wù)的拆解技巧201
8.4.2 善于使用快捷鍵202
8.4.3 只為必要的代碼編寫測試203
8.5 總結(jié)203
第9章 測試工程化204
9.1 測試工程化簡介204
9.2 搭建構(gòu)建平臺206
9.2.1 CI/CD工具選型206
9.2.2 使用Jenkins搭建構(gòu)建平臺207
9.2.3 Jenkins插件的介紹208
9.3 創(chuàng)建Jenkins項目212
9.3.1 Freestyle212
9.3.2 普通流水線218
9.3.3 多分支流水線223
9.3.4 并行流水線227
9.4 配置測試報告發(fā)布工具并統(tǒng)計測試覆蓋率228
9.4.1 配置測試報告發(fā)布工具229
9.4.2 統(tǒng)計Java測試覆蓋率231
9.5 小結(jié)235
第 10章 測試守護重構(gòu)236
10.1 理解接口237
10.2 守護“類”級別的重構(gòu)239
10.2.1 提取測試數(shù)據(jù)240
10.2.2 參考測試覆蓋率241
10.3 使用契約測試保護API重構(gòu)242
10.3.1 契約測試介紹242
10.3.2 Pact244
10.4 為數(shù)據(jù)遷移腳本編寫測試248
10.4.1 Spring Batch248
10.4.2 為Spring Batch腳本編寫測試252
10.4.3 Reader、Writer和Processor的測試說明254
10.5 漸進式重構(gòu)255
10.5.1 特性開關(guān)255
10.5.2 灰度開關(guān)265
10.5.3 切換266
10.5.4 數(shù)據(jù)雙寫267
10.5.5 關(guān)于特性開關(guān)的測試策略269
10.6 小結(jié)269
源碼分析篇
第 11章 測試框架的源碼分析273
11.1 源碼分析的技巧273
11.2 JUnit源碼分析274
11.2.1 使用命令行方式運行測試274
11.2.2 IntelliJ IDEA引導(dǎo)JUnit運行的原理277
11.2.3 JUnitCore的分析282
11.2.4 JUnit4 Runner的分析283
11.2.5 斷言分析289
11.2.6 完成JUnit源碼分析的收獲290
11.3 Mockito的源碼分析292
11.3.1 針對mock方法的分析292
11.3.2 針對when方法的分析297
11.3.3 針對verify方法的分析300
11.4 JaCoCo的源碼分析301
11.4.1 Java agent的基本用法302
11.4.2 Java agent的調(diào)試方法310
11.4.3 JaCoCo agent的啟動原理312
11.4.4 JaCoCo探針的插樁過程316
11.4.5 IntelliJ IDEA測試覆蓋率的實現(xiàn)327
11.5 小結(jié)327
附錄A 測試策略模板329
附錄B 測試反模式332