【新书速递】构建高质量软件:持续集成与持续交付系统实践
技术在变,市场在变,需求在变,用户的诉求在变,一切都在快速变化着。因此,在某个固定时间进行软件发布的传统作业方式已经远远无法适应当下急速变化的世界。
越来越多的公司和团队在追求以最快的速度交付软件,像谷歌这样的互联网顶级公司甚至在几分钟之内就可以提交一个“具备交付能力的”软件版本,而国内的阿里则能够在一小时以内发布一整套全量功能的淘宝、天猫商城为用户服务。
“快”的前提是高质量的交付,而高质量的交付则离不开一套稳健的持续(continuous)环境。所谓的持续,并不是一直运行(always running),而是具备持续运行(always ready to run)的能力。
因此,基于“持续”概念衍生出了持续集成(CI)、持续交付和持续部署(CD)等工程实践,在每一个细分领域中又诞生了琳琅满目的工具和工具组合,如下图所示。
工具和工具组合
如何在如此之多的工具中挑选出合适的工具集来构建自己的“持续”环境呢?只有真正理解了什么是持续集成、持续交付和持续部署,才能理解单元测试、功能测试,以及集成环境中每一个环节的作用和重要性。
欢迎阅读《构建高质量软件:持续集成与持续交付系统实践》一书,
本书从理论、最佳实践的角度出发,为读者介绍CI/CD环节中不同工具的使用和整合,使读者能够快速搭建起适合自己团队的持续构建环境。
NO.1 循序渐进
本书内容由浅入深,结合实际应用开发精准阐述如何基于测试驱动开发的方法论进行软件开发,能帮助读者系统化地对知识点进行梳理和归纳
NO.2 内容丰富
不仅囊括了Hamcrest对象匹配库中各种匹配器的用法及其与JUnit的整合,还展示了众多工具和插件的使用方法,从而帮助开发者开发出高质量的代码。
NO.3 真实案例
书中所包含的案例都源于实践,通过案例重点解读了当下主流的单元测试mock工具(Mockito、Powermock)和功能测试框架(Cucumber、Concordion),读者在练习过程中会发现这些案例与日常工作十分切合。
NO.4 延展阅读
每章的最后都会给出拓展资料,方便读者在掌握本书知识的基础上进一步提升
全书知识线
层层递进,不仅详细讲述了十几种软件工具的用法,还融会贯通整合使用,以便读者能够快速搭建适合自己团队的持续构建环境。
深入剖析TDD敏捷方法论
基于最新的Mockito和Powermock版本详细讲解mock的用法
基于最新的Cucumber和Concordion版本详细讲解功能测试代码的开发
详细讲述Jenkins集成构建工具的用法
高质量的软件是多个环节共同协作的结果,除了开发严谨正确的代码之外,还要确保软件在经历若干次迭代升级后的稳定性,以满足当下快速交付的要求,本书中对整个生命周期中相关内容均有所交代。
本书共10 章,分为四大部分
第一部分(第1~4 章)
主要围绕如何提高软件的开发质量和效率展开,详细讲述了单元测试的常用工具和最佳实践,并展开阐述了持续集成、持续交付、持续部署等概念;
第二部分(第5~6 章)
详细讲解两个常用的mock 工具——Mockito 和Powermock,通过实例详尽地讲解了它们的语法规则和使用场景,目的是让开发者在不修改软件源代码和程序结构的前提下尽可能确保软件具备可测试性;
第三部分(第7~8 章)
详细讲述两个行为驱动开发工具(功能测试)Concordion 和Cucumber,这两个工具可以帮助我们很好地完成功能测试、验收测试、回归测试等工作;
第四部分(第9~10 章)
综合前面三部分的知识点,并引入代码风格检查、静态代码分析、第三方依赖安全性检查、企业内部私服的原理和搭建、Ansible 自动化软件部署工具、Jenkins Pipeline 等知识,帮助读者构建完整的CI/CD 流程。
本书适合以下几类读者阅读:
从事软件测试的人员
Java程序开发者
从事Java系统架构的架构师
开设Java课程的专业院校和培训机构
心蓝
某外资零售银行电子渠道高级开发总监、技术专家,有超过十年的系统设计、开发经验,对团队管理、项目管理有自己独到的见解。拥有多年移动网关通信研发,以及移动互联网开发与产品运营、云计算、B2C电子商务平台开发经验,热衷于技术分享,录制的20余套技术视频在互联网上广泛传播。所著图书包括《Java高并发编程详解:多线程与架构设计》《Java高并发编程详解:深入理解并发核心库》等。
第一部分 提高软件的开发质量及开发效率
第1章 单元测试与TDD3
1.1 单元测试的定义3
1.2 单元测试的好处5
1.3 单元测试的FIRST原则6
1.4 JUnit最佳实践10
1.5 测试驱动开发14
1.5.1 红–绿–重构15
1.5.2 TDD工作流程16
1.5.3 TDD实践17
1.6 本章总结26
第2章 Hamcrest:优雅强大的对象匹配器27
2.1 Hamcrest概述27
2.2 Hamcrest对象匹配器详解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 自定义对象匹配器44
2.4 REST-Assured的使用47
2.5 本章总结51
第3章 Git及Git工作流程52
3.1 快速上手Git53
3.2 文件状态生命周期及Git中的对象56
3.2.1 文件状态生命周期56
3.2.2 Git中的对象59
3.3 Git与本地仓库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 标签的操作73
3.3.8 “.gitignore”文件的规则74
3.4 Git与远程仓库75
3.4.1 远程仓库的管理76
3.4.2 远程仓库的操作77
3.4.3 本地仓库与远程仓库的其他协同操作78
3.5 Git的配置和别名操作81
3.5.1 Git的基本配置81
3.5.2 Git的别名82
3.6 Git工作流程82
3.7 本章总结85
第4章 持续集成与持续交付86
4.1 什么是持续集成87
4.2 什么是持续交付89
4.3 什么是持续部署91
4.4 本章总结94
第二部分 mock:构造测试对象的替身
第5章 Mockito:热门的mock工具97
5.1 mock技术97
5.2 快速上手Mockito98
5.2.1 引入Mockito98
5.2.2 测试用户登录99
5.3 创建mock“替身”对象实例104
5.3.1 四种mock方式104
5.3.2 深度mock108
5.4 Stubbing语法详解111
5.4.1 when...thenReturn和doReturn...when语法111
5.4.2 doNothing...when语法112
5.4.3 when...thenThrow和doThrow...when语法115
5.4.4 when...thenAnswer和doAnswer...when语法117
5.4.5 多值返回的Stubbing语法117
5.4.6 级联风格的Stubbing语法118
5.4.7 when...thenCallRealMethod和doCallRealMethod...when语法119
5.5 Spying详解120
5.6 Argument对象匹配器详解123
5.6.1 Argument对象匹配器在Stubbing语法中的使用123
5.6.2 自定义Argument对象匹配器125
5.6.3 集成Hamcrest中的对象匹配器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对BDD风格的支持135
5.10 Mockito Inline136
5.11 本章总结138
第6章 Powermock详解140
6.1 快速入门Powermock141
6.1.1 为什么需要Powermock141
6.1.2 搭建Powermock环境141
6.1.3 Powermock入门143
6.2 Powermock如何通过mock操作局部变量145
6.3 Powermock如何通过mock操作静态方法148
6.4 Powermock如何通过mock操作final修饰的类151
6.5 Powermock如何通过mock操作私有方法152
6.6 Powermock中的Spying154
6.7 Powermock与JaCoCo155
6.8 本章总结160
第三部分 行为驱动开发
第7章 Concordion:测试即文档163
7.1 Concordion的开发流程164
7.2 搭建Concordion环境174
7.2.1 搭建Concordion基础环境174
7.2.2 Concordion与Maven进行集成176
7.3 Concordion的指令详解178
7.4 在Specification文档中处理Java返回的结果183
7.4.1 简单的数据类型183
7.4.2 复杂的数据类型188
7.5 table和list中的指令191
7.5.1 使用table标签批量执行测试用例191
7.5.2 使用list标签批量执行测试用例193
7.6 拾遗补漏194
7.7 本章总结196
第8章 Cucumber:热门的行为驱动开发工具197
8.1 Cucumber简介198
8.1.1 快速上手Cucumber199
8.1.2 Cucumber与IntelliJ IDEA集成204
8.1.3 Cucumber的执行流程207
8.2 Feature文档的语法基础:Gherkin208
8.2.1 什么是Gherkin209
8.2.2 Gherkin语法基础209
8.2.3 Gherkin中的注释212
8.2.4 Gherkin对其他语系的支持213
8.3 Step Definitions详解214
8.3.1 步骤的匹配215
8.3.2 通过正则表达式捕获参数217
8.3.3 通过Cucumber表达式捕获参数220
8.3.4 使用Java 8 Lambda表达式定义步骤方法223
8.3.5 Step Definitions的常见问题225
8.3.6 Cucumber中Step的执行过程227
8.4 Cucumber进阶228
8.4.1 Background关键字228
8.4.2 Data Table229
8.4.3 Scenario Outline关键字233
8.4.4 Doc String 235
8.4.5 Tagging & Hooks236
8.5 CucumberOptions239
8.6 Cucumber整合Selenium进行Web自动化测试241
8.7 Cucumber功能测试报告246
8.8 本章总结248
第四部分 遇见Jenkins
第9章 Jenkins的基础知识253
9.1 Jenkins的安装及快速构建Job253
9.1.1 Jenkins的安装253
9.1.2 Jenkins Job的快速构建258
9.2 配置Jenkins261
9.2.1 Jenkins的基本配置261
9.2.2 为Jenkins配置集群节点264
9.2.3 Jenkins插件管理268
9.2.4 基于Role Strategy配置权限270
9.2.5 构建Maven项目类型的Job272
9.3 Jenkins参数化及可视化构建274
9.3.1 参数化构建275
9.3.2 可视化构建280
9.4 Jenkins构建Pipeline Job282
9.4.1 Groovy Pipeline Script282
9.4.2 Jenkinsfile285
9.4.3 Blue Ocean286
9.5 本章总结288
第10章 基于Jenkins构建持续集成与持续交付290
10.1 Spring Boot开发RESTful应用291
10.1.1 搭建Spring Boot环境291
10.1.2 代码检查与分析295
10.1.3 基于测试驱动开发完成应用程序开发303
10.1.4 使用Cucumber开发自动化功能测试程序311
10.2 Nexus私服317
10.2.1 搭建Nexus私服318
10.2.2 私服仓库配置319
10.3 RedHat Ansible326
10.3.1 Ansible的安装326
10.3.2 Ad-hoc及Playbook简介330
10.3.3 Ansible模板引擎jinjia2333
10.3.4 通过Playbook逐步完成软件自动化部署335
10.4 创建Jenkins Pipeline343
10.4.1 创建CI/CD Jenkins Pipeline Job343
10.4.2 GitHub WebHook自动触发Jenkins Job348
10.5 本章总结351
上下滑动查看
购买正版纸书可免费获得“心蓝说Java”配套视频课程,
扫码进群了解获取方式
更多精彩回顾
书讯 | 10月书讯(下) | 小长假我读这些新书书讯 | 10月书讯(上) | 小长假我读这些新书资讯 | 什么是图数据库?图数据库实践与创新浅析书单 | 你们要的Java学习路线图来了干货 | 数字化转型的1个目标,3大领域,6大因素和9个环节收藏 | 两本书助你构建智能计算系统知识树上新 | 【新书速递】分布式事务开山之作,带你深入理解分布式事务赠书 | 【第78期】学习全球最火编程语言Python,要读哪些书?