為什么寫(xiě)這本書(shū)
技術(shù)在變,市場(chǎng)在變,需求在變,用戶(hù)的訴求在變,一切都在快速變化著。因此,在某個(gè)固定時(shí)間進(jìn)行軟件發(fā)布的傳統(tǒng)作業(yè)方式已經(jīng)遠(yuǎn)遠(yuǎn)無(wú)法適應(yīng)當(dāng)下急速變化的世界。
越來(lái)越多的公司和團(tuán)隊(duì)在追求以快的速度交付軟件,像谷歌這樣的互聯(lián)網(wǎng)公司甚至在幾分鐘之內(nèi)就可以提交一個(gè)具備交付能力的軟件版本,而國(guó)內(nèi)的阿里則能夠在一小時(shí)以?xún)?nèi)發(fā)布一整套全量功能的淘寶、天貓商城為用戶(hù)服務(wù)。
快的前提是高質(zhì)量的交付,而高質(zhì)量的交付則離不開(kāi)一套穩(wěn)健的持續(xù)(continuous)環(huán)境。所謂的持續(xù),并不是一直運(yùn)行(always running),而是具備持續(xù)運(yùn)行(always ready to run)的能力。因此,基于持續(xù)概念衍生出了持續(xù)集成(CI)、持續(xù)交付和持續(xù)部署(CD)等工程實(shí)踐,在每一個(gè)細(xì)分領(lǐng)域中又誕生了琳瑯滿(mǎn)目的工具和工具組合,如何在如此之多的工具中挑選出合適的工具集來(lái)構(gòu)建自己的持續(xù)環(huán)境呢?這正是本書(shū)所要解決的問(wèn)題。只有真正理解了什么是持續(xù)集成、持續(xù)交付和持續(xù)部署,才能理解單元測(cè)試、功能測(cè)試,以及集成環(huán)境中每一個(gè)環(huán)節(jié)的作用和重要性。
本書(shū)將從理論、實(shí)踐的角度出發(fā),為讀者介紹CI/CD環(huán)節(jié)中不同工具的使用和整合,使讀者能夠快速搭建起適合自己團(tuán)隊(duì)的持續(xù)構(gòu)建環(huán)境。
【讀者對(duì)象】本書(shū)適合以下讀者:
●從事軟件測(cè)試的人員
●Java程序開(kāi)發(fā)者
●從事Java系統(tǒng)架構(gòu)的架構(gòu)師
●開(kāi)設(shè)Java課程的專(zhuān)業(yè)院校和培訓(xùn)機(jī)構(gòu)
【如何閱讀本書(shū)】
本書(shū)包含四大部分,共10章。
部分(第1~4章)主要圍繞如何提高軟件的開(kāi)發(fā)質(zhì)量和效率展開(kāi),詳細(xì)講述了單元測(cè)試的常用工具和實(shí)踐,并給出了持續(xù)集成、持續(xù)交付、持續(xù)部署等概念;
第二部分(第5~6章)詳細(xì)講解了兩個(gè)常用的mock工具M(jìn)ockito和Powermock,通過(guò)實(shí)例詳盡地講解了它們的語(yǔ)法規(guī)則和使用場(chǎng)景,目的是讓開(kāi)發(fā)者在盡可能不修改軟件源代碼和程序結(jié)構(gòu)的前提下確保軟件具備可測(cè)試性;
第三部分(第7~8章)為讀者詳細(xì)講述了兩個(gè)行為驅(qū)動(dòng)開(kāi)發(fā)工具(功能測(cè)試)Concordion和Cucumber的使用,這兩個(gè)工具可以幫助我們很好地完成功能測(cè)試、驗(yàn)收測(cè)試、回歸測(cè)試等工作;
第四部分(第9~10章)綜合前面三部分的知識(shí)點(diǎn),并引入代碼風(fēng)格檢查、靜態(tài)代碼分析、第三方依賴(lài)安全性檢查、企業(yè)內(nèi)部私服的原理和搭建、Ansible自動(dòng)化軟件部署工具、Jenkins Pipeline等知識(shí),構(gòu)建了一個(gè)完整的CI/CD流程。
書(shū)中出現(xiàn)的代碼及工具均已上傳至GitHub,讀者可以下載參閱。
隨書(shū)代碼-I:https://github.com/wangwenjun/cicd
隨書(shū)代碼-II:https://github.com/wangwenjun/cicd-powermock
Jenkins插件:https://github.com/wangwenjun/jenkins_plugins
綜合實(shí)例:https://github.com/wangwenjun/simple_application
綜合實(shí)例功能測(cè)試:https://github.com/wangwenjun/simple_application_acceptance
Ansible相關(guān)腳本:https://github.com/wangwenjun/ansible_tutorial
【在本店購(gòu)書(shū)可免費(fèi)獲得心藍(lán)說(shuō)Java配套視頻課程,關(guān)注華章計(jì)算機(jī)回復(fù)69020加入讀者群,了解獲取方式】
【部分 提高軟件的開(kāi)發(fā)質(zhì)量及開(kāi)發(fā)效率】
第1章 單元測(cè)試與TDD3
1.1 單元測(cè)試的定義3
1.2 單元測(cè)試的好處5
1.3 單元測(cè)試的FIRST原則6
1.4 JUnit實(shí)踐10
1.5 測(cè)試驅(qū)動(dòng)開(kāi)發(fā)14
1.5.1 紅綠重構(gòu)15
1.5.2 TDD工作流程16
1.5.3 TDD實(shí)踐17
1.6 本章總結(jié)26
第2章 Hamcrest:優(yōu)雅強(qiáng)大的對(duì)象匹配器27
2.1 Hamcrest概述27
2.2 Hamcrest對(duì)象匹配器詳解34
2.2.1 org.hamcrest.core34
2.2.2 org.hamcrest.beans37
2.2.3 org.hamcrest.collection38
2.2.4 org.hamcrest.number41
2.2.5 org.hamcrest.text42
2.2.6 org.hamcrest.xml43
2.3 自定義對(duì)象匹配器44
2.4 REST-Assured的使用47
2.5 本章總結(jié)51
第3章 Git及Git工作流程52
3.1 快速上手Git53
3.2 文件狀態(tài)生命周期及Git中的對(duì)象56
3.2.1 文件狀態(tài)生命周期56
3.2.2 Git中的對(duì)象59
3.3 Git與本地倉(cāng)庫(kù)64
3.3.1 add與commit命令64
3.3.2 log命令65
3.3.3 diff與blame命令65
3.3.4 Git的分支及操作66
3.3.5 stash命令69
3.3.6 reset命令70
3.3.7 標(biāo)簽的操作73
3.3.8 .gitignore文件的規(guī)則74
3.4 Git與遠(yuǎn)程倉(cāng)庫(kù)75
3.4.1 遠(yuǎn)程倉(cāng)庫(kù)的管理76
3.4.2 遠(yuǎn)程倉(cāng)庫(kù)的操作77
3.4.3 本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)的其他協(xié)同操作78
3.5 Git的配置和別名操作81
3.5.1 Git的基本配置81
3.5.2 Git的別名82
3.6 Git工作流程82
3.7 本章總結(jié)85
第4章 持續(xù)集成與持續(xù)交付86
4.1 什么是持續(xù)集成87
4.2 什么是持續(xù)交付89
4.3 什么是持續(xù)部署91
4.4 本章總結(jié)94
【第二部分 mock:構(gòu)造測(cè)試對(duì)象的替身】
第5章 Mockito:熱門(mén)的mock工具97
5.1 mock技術(shù)97
5.2 快速上手Mockito98
5.2.1 引入Mockito98
5.2.2 測(cè)試用戶(hù)登錄99
5.3 創(chuàng)建mock替身對(duì)象實(shí)例104
5.3.1 四種mock方式104
5.3.2 深度mock108
5.4 Stubbing語(yǔ)法詳解111
5.4.1 when...thenReturn和doReturn...when語(yǔ)法111
5.4.2 doNothing...when語(yǔ)法112
5.4.3 when...thenThrow和doThrow...when語(yǔ)法115
5.4.4 when...thenAnswer和doAnswer...when語(yǔ)法117
5.4.5 多值返回的Stubbing語(yǔ)法117
5.4.6 級(jí)聯(lián)風(fēng)格的Stubbing語(yǔ)法118
5.4.7 when...thenCallRealMethod和doCallRealMethod...when語(yǔ)法119
5.5 Spying詳解120
5.6 Argument對(duì)象匹配器詳解123
5.6.1 Argument對(duì)象匹配器在Stubbing語(yǔ)法中的使用123
5.6.2 自定義Argument對(duì)象匹配器125
5.6.3 集成Hamcrest中的對(duì)象匹配器126
5.7 Mockito Verify與ArgumentsCaptor127
5.7.1 Mockito Verify操作127
5.7.2 VerificationMode詳解130
5.7.3 ArgumentCaptor與@Captor132
5.8 InjectMocks134
5.9 Mockito對(duì)BDD風(fēng)格的支持135
5.10 Mockito Inline136
5.11 本章總結(jié)138
第6章 Powermock詳解140
6.1 快速入門(mén)Powermock141
6.1.1 為什么需要Powermock141
6.1.2 搭建Powermock環(huán)境141
6.1.3 Powermock入門(mén)143
6.2 Powermock如何通過(guò)mock操作局部變量145
6.3 Powermock如何通過(guò)mock操作靜態(tài)方法148
6.4 Powermock如何通過(guò)mock操作final修飾的類(lèi)151
6.5 Powermock如何通過(guò)mock操作私有方法152
6.6 Powermock中的Spying154
6.7 Powermock與JaCoCo155
6.8 本章總結(jié)160
【第三部分 行為驅(qū)動(dòng)開(kāi)發(fā)】
第7章 Concordion:測(cè)試即文檔163
7.1 Concordion的開(kāi)發(fā)流程164
7.2 搭建Concordion環(huán)境174
7.2.1 搭建Concordion基礎(chǔ)環(huán)境174
7.2.2 Concordion與Maven進(jìn)行集成176
7.3 Concordion的指令詳解178
7.4 在Specification文檔中處理Java返回的結(jié)果183
7.4.1 簡(jiǎn)單的數(shù)據(jù)類(lèi)型183
7.4.2 復(fù)雜的數(shù)據(jù)類(lèi)型188
7.5 table和list中的指令191
7.5.1 使用table標(biāo)簽批量執(zhí)行測(cè)試用例191
7.5.2 使用list標(biāo)簽批量執(zhí)行測(cè)試用例193
7.6 拾遺補(bǔ)漏194
7.7 本章總結(jié)196
第8章 Cucumber:熱門(mén)的行為驅(qū)動(dòng)開(kāi)發(fā)工具197
8.1 Cucumber簡(jiǎn)介198
8.1.1 快速上手Cucumber199
8.1.2 Cucumber與IntelliJ IDEA集成204
8.1.3 Cucumber的執(zhí)行流程207
8.2 Feature文檔的語(yǔ)法基礎(chǔ):Gherkin208
8.2.1 什么是Gherkin209
8.2.2 Gherkin語(yǔ)法基礎(chǔ)209
8.2.3 Gherkin中的注釋212
8.2.4 Gherkin對(duì)其他語(yǔ)系的支持213
8.3 Step Definitions詳解214
8.3.1 步驟的匹配215
8.3.2 通過(guò)正則表達(dá)式捕獲參數(shù)217
8.3.3 通過(guò)Cucumber表達(dá)式捕獲參數(shù)220
8.3.4 使用Java 8 Lambda表達(dá)式定義步驟方法223
8.3.5 Step Definitions的常見(jiàn)問(wèn)題225
8.3.6 Cucumber中Step的執(zhí)行過(guò)程227
8.4 Cucumber進(jìn)階228
8.4.1 Background關(guān)鍵字228
8.4.2 Data Table229
8.4.3 Scenario Outline關(guān)鍵字233
8.4.4 Doc String 235
8.4.5 Tagging & Hooks236
8.5 CucumberOptions239
8.6 Cucumber整合Selenium進(jìn)行Web自動(dòng)化測(cè)試241
8.7 Cucumber功能測(cè)試報(bào)告246
8.8 本章總結(jié)248
【第四部分 遇見(jiàn)Jenkins】
第9章 Jenkins的基礎(chǔ)知識(shí)253
9.1 Jenkins的安裝及快速構(gòu)建Job253
9.1.1 Jenkins的安裝253
9.1.2 Jenkins Job的快速構(gòu)建258
9.2 配置Jenkins261
9.2.1 Jenkins的基本配置261
9.2.2 為Jenkins配置集群節(jié)點(diǎn)264
9.2.3 Jenkins插件管理268
9.2.4 基于Role Strategy配置權(quán)限270
9.2.5 構(gòu)建Maven項(xiàng)目類(lèi)型的Job272
9.3 Jenkins參數(shù)化及可視化構(gòu)建274
9.3.1 參數(shù)化構(gòu)建275
9.3.2 可視化構(gòu)建280
9.4 Jenkins構(gòu)建Pipeline Job282
9.4.1 Groovy Pipeline Script282
9.4.2 Jenkinsfile285
9.4.3 Blue Ocean286
9.5 本章總結(jié)288
第10章 基于Jenkins構(gòu)建持續(xù)集成與持續(xù)交付290
10.1 Spring Boot開(kāi)發(fā)RESTful應(yīng)用291
10.1.1 搭建Spring Boot環(huán)境291
10.1.2 代碼檢查與分析295
10.1.3 基于測(cè)試驅(qū)動(dòng)開(kāi)發(fā)完成應(yīng)用程序開(kāi)發(fā)303
10.1.4 使用Cucumber開(kāi)發(fā)自動(dòng)化功能測(cè)試程序311
10.2 Nexus私服317
10.2.1 搭建Nexus私服318
10.2.2 私服倉(cāng)庫(kù)配置319
10.3 RedHat Ansible326
10.3.1 Ansible的安裝326
10.3.2 Ad-hoc及Playbook簡(jiǎn)介330
10.3.3 Ansible模板引擎jinjia2333
10.3.4 通過(guò)Playbook逐步完成軟件自動(dòng)化部署335
10.4 創(chuàng)建Jenkins Pipeline343
10.4.1 創(chuàng)建CI/CD Jenkins Pipeline Job343
10.4.2 GitHub WebHook自動(dòng)觸發(fā)Jenkins Job348
10.5 本章總結(jié)351