目录
研发自测基础篇
第 1章 研发自测基础 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 质量度量 8
1.2 软件的测试分类 10
1.2.1 单元测试 10
1.2.2 集成测试 11
1.2.3 系统测试 11
1.2.4 验收测试 11
1.2.5 静态代码分析 12
1.2.6 安全测试 12
1.2.7 性能测试 12
1.3 测试用例设计入门 13
1.3.1 划分等价类 13
1.3.2 边界值分析法 14
1.3.3 场景法 15
1.4 开发人员自测范围 16
1.4.1 新交付的需求 18
1.4.2 缺陷处理 18
1.4.3 重构 18
1.4.4 数据迁移 18
1.5 测试数据的构造和安全 18
1.5.1 高效构造测试数据 19
1.5.2 测试数据的安全 21
1.6 小结 22
第 2章 代码评审 23
2.1 常用的静态代码分析工具 24
2.1.1 Checkstyle 24
2.1.2 FindBugs 34
2.1.3 ArchUnit 40
2.1.4 OWASP DependencyCheck 46
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 Hooks 51
2.3.3 分支保护 53
2.4 小结 53
第3章 单元测试基础 55
3.1 单元测试 55
3.1.1 什么是单元测试 55
3.1.2 为什么需要单元测试 56
3.1.3 怎么学习单元测试 56
3.1.4 搭建JUnit环境 57
3.1.5 给“Hello, world!”写一个单元测试 58
3.2 断言 59
3.2.1 编写一个简单的断言库 60
3.2.2 JUnit内置的断言方法 60
3.2.3 使用assertThat和Matcher方法 61
3.2.4 编写自己的Matcher方法 63
3.2.5 断言并不只是单元测试中的概念 63
3.2.6 思考题 64
3.3 单元测试的设计 64
3.3.1 准备并清理测试数据 65
3.3.2 设计单元测试用例 66
3.3.3 参数化单元测试用例 69
3.4 单元测试的使用技巧 70
3.4.1 测试异常 70
3.4.2 测试覆盖率 72
3.4.3 使用JUnit Rule 73
3.4.4 其他技巧 74
3.4.5 新手容易犯的错误 75
3.5 基于JUnit 5实现测试 76
3.5.1 JUnit 5的架构说明 76
3.5.2 使用JUnit 5 77
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 小结 81
第4章 测试替身 82
4.1 测试替身简介 82
4.2 Mockito 84
4.2.1 使用mock方法 85
4.2.2 捕捉参数对象 87
4.2.3 设置模拟对象的行为 88
4.2.4 参数匹配器 89
4.2.5 使用spy方法 90
4.2.6 使用注解 91
4.2.7 其他技巧 93
4.3 增强测试:静态、私有方法的处理 94
4.3.1 模拟静态方法 94
4.3.2 模拟构造方法 97
4.3.3 模拟私有方法 98
4.3.4 反射工具箱 99
4.4 测试代码的结构模式 100
4.4.1 准备-执行-断言 100
4.4.2 四阶段测试 100
4.5 基于测试替身的反思 101
4.5.1 “大泥球” 101
4.5.2 分层过多 102
4.5.3 滥用测试替身 102
4.6 小结 103
第5章 Spring应用的测试 104
5.1 理解Spring测试体系 105
5.2 启动Spring上下文测试 106
5.3 启动Spring Boot上下文测试 109
5.3.1 @SpringBootTest注解 109
5.3.2 对Bean的模拟和监视 112
5.3.3 Spring Boot切片配置 113
5.4 分层测试和测试策略 117
5.4.1 分层测试策略 117
5.4.2 MockMvc的执行原理 118
5.4.3 内嵌基础设施 120
5.5 常用的测试工具集 122
5.5.1 Spring Test库提供的工具集 122
5.5.2 spring-boot-test库提供的工具集 123
5.6 小结 125
第6章 RESTful API测试 126
6.1 RESTful API测试工具集 126
6.1.1 REST Assured 127
6.1.2 MariaDB 128
6.1.3 DbUnit 129
6.2 API测试实例 131
6.3 使用JsonPath断言 136
6.4 鉴权 138
6.4.1 Basic鉴权 138
6.4.2 Token鉴权 138
6.4.3 Cookie鉴权 139
6.5 文件处理 140
6.6 模拟第三方API 140
6.6.1 使用适配器模式模拟 140
6.6.2 WireMock 143
6.7 API自动化测试策略 150
6.7.1 应用API 151
6.7.2 领域API 152
6.8 小结 154
研发自测高级篇
第7章 性能和并发检测 157
7.1 微基准性能测试 158
7.1.1 使用Maven构建微基准性能测试 158
7.1.2 一个直观的示例 160
7.1.3 使用JUnit运行微基准性能测试 161
7.2 API性能测试 163
7.2.1 JMeter介绍 163
7.2.2 安装JMeter 164
7.2.3 设计测试计划 165
7.2.4 执行测试计划 170
7.2.5 理解JMeter 173
7.3 并发检测 176
7.3.1 几种并发模型 176
7.3.2 并发问题类型 180
7.3.3 并发测试技术 181
7.3.4 并发问题的检测实例 182
7.4 小结 190
第8章 测试驱动开发 191
8.1 理解TDD 191
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 任务拆解和环境搭建 195
8.3.2 第 一轮任务 196
8.3.3 第二轮任务 198
8.3.4 第三轮任务 199
8.4 使用TDD的技巧 201
8.4.1 任务的拆解技巧 201
8.4.2 善于使用快捷键 202
8.4.3 只为必要的代码编写测试 203
8.5 总结 203
第9章 测试工程化 204
9.1 测试工程化简介 204
9.2 搭建构建平台 206
9.2.1 CI/CD工具选型 206
9.2.2 使用Jenkins搭建构建平台 207
9.2.3 Jenkins插件的介绍 208
9.3 创建Jenkins项目 212
9.3.1 Freestyle 212
9.3.2 普通流水线 218
9.3.3 多分支流水线 223
9.3.4 并行流水线 227
9.4 配置测试报告发布工具并统计测试覆盖率 228
9.4.1 配置测试报告发布工具 229
9.4.2 统计Java测试覆盖率 231
9.5 小结 235
第 10章 测试守护重构 236
10.1 理解接口 237
10.2 守护“类”级别的重构 239
10.2.1 提取测试数据 240
10.2.2 参考测试覆盖率 241
10.3 使用契约测试保护API重构 242
10.3.1 契约测试介绍 242
10.3.2 Pact 244
10.4 为数据迁移脚本编写测试 248
10.4.1 Spring Batch 248
10.4.2 为Spring Batch脚本编写测试 252
10.4.3 Reader、Writer和Processor的测试说明 254
10.5 渐进式重构 255
10.5.1 特性开关 255
10.5.2 灰度开关 265
10.5.3 切换 266
10.5.4 数据双写 267
10.5.5 关于特性开关的测试策略 269
10.6 小结 269
源码分析篇
第 11章 测试框架的源码分析 273
11.1 源码分析的技巧 273
11.2 JUnit源码分析 274
11.2.1 使用命令行方式运行测试 274
11.2.2 IntelliJ IDEA引导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的调试方法 310
11.4.3 JaCoCo agent的启动原理 312
11.4.4 JaCoCo探针的插桩过程 316
11.4.5 IntelliJ IDEA测试覆盖率的实现 327
11.5 小结 327
附录A 测试策略模板 329
附录B 测试反模式 332