第 一部分 JUnit
第 1章 JUnit起步 3
1.1 证明程序的可运行性 4
1.2 从零开始 5
1.2.1 单元测试框架的规则 8
1.2.2 添加单元测试 8
1.3 安装JUnit 9
1.4 使用JUnit测试 11
1.5 小结 13
第 2章 探索JUnit的核心 14
2.1 核心注解 15
2.1.1 @DisplayName注解 17
2.1.2 @Disabled注解 18
2.2 嵌套测试 20
2.3 标记测试 21
2.4 断言 22
2.5 假设 26
2.6 JUnit 5的依赖注入 28
2.6.1 TestInfoParameterResolver 28
2.6.2 TestReporterParameterResolver 29
2.6.3 RepetitionInfoParameterResolver 30
2.7 重复测试 30
2.8 参数化测试 32
2.9 动态测试 35
2.10 使用Hamcrest 匹配器 37
2.11 小结 41
第3章 JUnit的体系结构 42
3.1 软件体系结构的概念和重要性 42
3.1.1 故事一:电话簿 43
3.1.2 故事二:运动鞋制造商 43
3.2 JUnit 4的体系结构 44
3.2.1 JUnit 4模块化 44
3.2.2 JUnit 4运行器 45
3.2.3 JUnit 4规则 47
3.2.4 JUnit 4体系结构的缺点 52
3.3 JUnit 5的体系结构 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体系结构的全景 54
3.4 小结 56
第4章 从JUnit 4向JUnit 5迁移 57
4.1 从JUnit 4向JUnit 5跨越 57
4.2 所需的依赖项 58
4.3 注解、类和方法 60
4.3.1 等价的注解、类和方法 60
4.3.2 分类和标记 64
4.3.3 迁移Hamcrest匹配器功能 69
4.3.4 规则与扩展模型 71
4.3.5 自定义规则 74
4.4 小结 78
第5章 软件测试原则 79
5.1 单元测试的必要性 79
5.1.1 带来更高的测试覆盖率 80
5.1.2 提高团队的工作效率 80
5.1.3 检测出衰退迹象和减少调试次数 80
5.1.4 自信地重构 80
5.1.5 改进实现 82
5.1.6 文档化预期行为 82
5.1.7 启用代码覆盖率和其他指标 83
5.2 测试类型 83
5.2.1 单元测试 84
5.2.2 集成测试 84
5.2.3 系统测试 85
5.2.4 验收测试 85
5.3 黑盒测试和白盒测试的对比 86
5.3.1 黑盒测试 86
5.3.2 白盒测试 86
5.3.3 黑盒测试和白盒测试的优点和缺点 87
5.4 小结 88
第二部分 不同的测试策略
第6章 测试质量 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 创建简单的构造方法 98
6.2.4 遵循迪米特法则 99
6.2.5 避开隐藏的依赖项和全局状态 100
6.2.6 优先使用泛型方法 101
6.2.7 组合优于继承 102
6.2.8 多态优于条件 102
6.3 测试驱动开发 104
6.3.1 调整开发周期 104
6.3.2 TDD的两个核心步骤 105
6.4 行为驱动开发 106
6.5 突变测试 106
6.6 开发周期中的测试 107
6.7 小结 110
第7章 用stub进行粗粒度测试 111
7.1 stub简介 112
7.2 用stub测试一个HTTP连接 113
7.2.1 选择stub的使用方案 115
7.2.2 用Jetty充当嵌入式服务器 115
7.3 用stub替换服务器资源 117
7.3.1 构建第 一个stub测试 117
7.3.2 回顾第 一个stub测试 120
7.4 替换连接 120
7.4.1 创建自定义的URL协议处理器 121
7.4.2 创建一个JDK的HttpURLConnection stub 122
7.4.3 运行测试 123
7.5 小结 124
第8章 用mock object进行测试 125
8.1 mock object简介 125
8.2 用mock object进行单元测试 126
8.3 用mock object进行重构 129
8.3.1 重构示例 130
8.3.2 重构方面的考虑 131
8.4 模拟HTTP连接 133
8.4.1 mock object的定义 133
8.4.2 示例方法的测试 134
8.4.3 第 一个尝试:简单的方法重构技巧 135
8.4.4 第二个尝试:使用类工厂进行重构 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 小结 153
第9章 容器内测试 154
9.1 标准单元测试的局限性 154
9.2 mock object解决方法 155
9.3 容器内测试的步骤 157
9.3.1 实现策略 157
9.3.2 容器内测试框架 158
9.4 stub、mock object和容器内测试的对比 158
9.4.1 对stub的评价 159
9.4.2 对mock object的评价 159
9.4.3 对容器内测试的评价 160
9.5 用Arquillian进行测试 161
9.6 小结 168
第三部分 运用JUnit 5及其他工具
第 10章 在Maven 3中运行JUnit测试 171
10.1 建立Maven项目 171
10.2 使用Maven插件 174
10.2.1 Maven的Compiler插件 175
10.2.2 Maven的Surefire插件 176
10.2.3 用Maven生成HTML格式的JUnit报告 178
10.3 集成所有 178
10.4 Maven的挑战性 183
10.5 小结 183
第 11章 在Gradle 6中运行JUnit测试 184
11.1 Gradle简介 184
11.2 创建Gradle项目 186
11.3 使用Gradle插件 190
11.4 从头开始创建Gradle项目,再用JUnit 5测试 190
11.5 比较Gradle和Maven 194
11.6 小结 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 小结 211
第 13章 JUnit 5的持续集成 212
13.1 持续集成测试 212
13.2 Jenkins简介 214
13.3 团队实践持续集成 217
13.4 配置Jenkins 222
13.5 在CI环境中处理任务 225
13.6 小结 230
第四部分 使用现代框架和JUnit 5
第 14章 JUnit 5扩展模型 233
14.1 JUnit 5扩展模型简介 233
14.2 创建JUnit 5扩展 234
14.3 使用可用的扩展点编写JUnit 5测试 237
14.3.1 将乘客信息持久化到数据库中 237
14.3.2 检查乘客的唯一性 246
14.4 小结 248
第 15章 表示层测试 249
15.1 选择测试框架 250
15.2 HtmlUnit简介 250
15.3 编写HtmlUnit测试 252
15.3.1 HTML断言 252
15.3.2 对特定的Web浏览器进行测试 252
15.3.3 对多个Web浏览器进行测试 253
15.3.4 创建独立的测试 254
15.3.5 测试表单 256
15.3.6 测试JavaScript 257
15.4 Selenium简介 261
15.5 编写Selenium测试 262
15.5.1 对特定的Web浏览器进行测试 264
15.5.2 使用Web浏览器测试导航 265
15.5.3 测试多个Web浏览器 266
15.5.4 用不同的Web浏览器测试Google搜索和导航 268
15.5.5 测试网站的身份验证 270
15.6 HtmlUnit与Selenium的对比 275
15.7 小结 275
第 16章 Spring应用程序测试 277
16.1 Spring框架简介 277
16.2 依赖注入简介 278
16.3 构建和测试Spring应用程序 283
16.3.1 以编程方式创建Spring上下文 283
16.3.2 使用Spring TestContext框架 286
16.4 为JUnit Jupiter使用SpringExtension 288
16.5 添加新特性并使用JUnit 5测试 290
16.6 小结 296
第 17章 Spring Boot应用程序测试 297
17.1 Spring Boot简介 297
17.2 用Spring Initializr创建项目 298
17.3 将Spring应用迁移到Spring Boot中 300
17.4 为Spring Boot实现特定测试的配置 303
17.5 在Spring Boot应用中添加和测试新特性 305
17.6 小结 309
第 18章 REST API测试 311
18.1 REST应用程序简介 311
18.2 创建RESTful API来管理实体 312
18.3 创建RESTful API来管理两个相关实体 319
18.4 测试RESTful API 326
18.5 小结 330
第 19章 数据库应用程序测试 331
19.1 数据库单元测试阻抗不匹配 331
19.1.1 单元测试必须运行独立的代码 332
19.1.2 单元测试必须易于编写和运行 332
19.1.3 单元测试必须快速运行 333
19.2 测试JDBC应用程序 333
19.3 测试Spring JDBC应用程序 342
19.4 测试Hibernate应用程序 349
19.5 测试Spring Hibernate应用程序 354
19.6 测试数据库应用程序的方法比较 360
19.7 小结 361
第五部分 用JUnit 5开发应用程序
第 20章 用JUnit 5进行测试驱动开发 365
20.1 TDD的主要概念 365
20.2 航班管理应用程序 366
20.3 将航班管理应用程序迁移到TDD 371
20.4 重构航班管理应用程序 375
20.5 使用TDD引入新特性 379
20.5.1 增加一种高级航班 379
20.5.2 同一名乘客只能添加一次 387
20.6 小结 390
第 21章 使用JUnit 5进行行为驱动开发 391
21.1 行为驱动开发简介 391
21.1.1 一种新特性的引入 392
21.1.2 从需求分析到验收标准 392
21.1.3 BDD的优点和挑战性 393
21.2 使用Cucumber和JUnit 5操作BDD风格 394
21.2.1 Cucumber简介 395
21.2.2 将TDD特性迁移到Cucumber中 396
21.2.3 使用Cucumber增加一个新功能 403
21.3 使用JBehave和JUnit 5操作BDD风格 410
21.3.1 JBehave简介 410
21.3.2 将TDD特性迁移到JBehave中 410
21.3.3 使用JBehave增加一个新功能 416
21.4 Cucumber与Jbehave的比较 423
21.5 小结 423
第 22章 用JUnit 5实现测试金字塔策略 424
22.1 软件测试的层次 424
22.2 单元测试:隔离运行的基本组件 425
22.3 集成测试:单元组合 435
22.4 系统测试:考查完整的 软件 442
22.4.1 使用模拟的外部依赖项进行测试 443
22.4.2 使用部分实现的外部依赖项进行测试 447
22.4.3 使用完全实现的外部依赖项进行测试 449
22.5 验收测试:软件满足业务需求 452
22.6 小结 461
附录A Maven 462
A.1 约定优于配置 462
A.2 强依赖管理 462
A.3 Maven的构建生命周期 463
A.4 基于插件的体系结构 465
A.5 Maven的项目对象模型 466
A.6 安装Maven 467
附录B Gradle 468
B.1 安装Gradle 468
B.2 创建Gradle任务 470
附录C IDE 473
C.1 安装IntelliJ IDEA 473
C.2 安装Eclipse 474
C.3 安装NetBeans 475
附录D Jenkins 476
展开