目 录
第Ⅰ部分 总述
第1章 概览 3
1.1 关于本章 3
1.2 可能有效的最简单的测试自动化策略 3
1.2.1 开发过程 3
1.2.2 客户测试 4
1.2.3 单元测试 5
1.2.4 易测性设计 5
1.2.5 测试组织 6
1.3 接下来要讨论的问题 6
第2章 测试味道 7
2.1 关于本章 7
2.2 测试味道简介 7
2.2.1 什么是测试味道 7
2.2.2 测试味道的种类 8
2.2.3 如何处理味道 8
2.3 味道的种类 9
2.3.1 项目味道 9
2.3.2 行为味道 10
2.3.3 代码味道 11
2.4 接下来要讨论的问题 12
第3章 测试自动化的目标 13
3.1 关于本章 13
3.2 为什么要测试 13
3.3 测试自动化的目标 14
3.3.1 测试应该有助于提高质量 15
3.3.2 测试应该有助于理解SUT 16
3.3.3 测试应该降低(而不是引入)风险 16
3.3.4 测试应该易于运行 17
3.3.5 测试应该易于写和维护 19
3.3.6 随着系统的发展,测试应该只需要最低限度的维护 20
3.4 接下来要讨论的问题 20
第4章 测试自动化的基本观点 21
4.1 关于本章 21
4.2 这些基本观点的重要性 21
4.3 一些不同的基本观点 22
4.3.1 首先测试还是最后测试 22
4.3.2 测试还是示例 22
4.3.3 逐个测试还是全部一起测试 22
4.3.4 从外到内还是从内到外 23
4.3.5 状态验证还是行为验证 24
4.3.6 事先进行夹具设计还是逐个测试 25
4.4 理解不同观点的存在 25
4.5 我的基本观点 25
4.6 接下来要讨论的问题 26
第5章 测试自动化的原则 27
5.1 关于本章 27
5.2 原则 27
5.2.1 原则:首先写测试(也称为测试驱动开发、测试优先开发) 27
5.2.2 原则:易测性设计 28
5.2.3 原则:使用前门优先(也称为前门优先) 28
5.2.4 原则:交流意图(也称为高级语言,简单易读) 28
5.2.5 原则:不要修改SUT 28
5.2.6 原则:保持测试独立 (也称为独立测试) 29
5.2.7 原则:隔离SUT 29
5.2.8 原则:最小化测试重叠 30
5.2.9 原则:最小化不可测试的代码 30
5.2.10 原则:保持测试逻辑与产品代码分离(也称为产品代码中无测试逻辑) 31
5.2.11 原则:每个测试验证一种条件 (也称为单一条件测试) 31
5.2.12 原则:单独测试关注点 32
5.2.13 原则:确保相同标准的努力和责任 32
5.3 接下来要讨论的问题 32
第6章 测试自动化策略 33
6.1 关于本章 33
6.2 什么是策略 33
6.3 应该自动化哪些类型的测试 34
6.3.1 总功能性测试 34
6.3.2 交叉功能测试 35
6.4 使用哪些工具来自动化各种测试 36
6.4.1 测试自动化的方法 37
6.4.2 xUnit简介 38
6.4.3 使用xUnit的最佳时机 39
6.5 使用哪种测试夹具策略 39
6.5.1 什么是夹具 40
6.5.2 主要的夹具策略 40
6.5.3 暂时新鲜夹具 42
6.5.4 永久新鲜夹具 42
6.5.5 共享的夹具策略 43
6.6 如何确保易测性 44
6.6.1 最后测试——非常危险 44
6.6.2 易测性设计——在最前面 44
6.6.3 测试驱动易测性 45
6.6.4 控制点和观察点 45
6.6.5 交互风格与易测性模式 46
6.6.6 划分与测试 49
6.7 接下来要讨论的问题 50
第7章 xUnit基础 51
7.1 关于本章 51
7.2 xUnit简介 51
7.3 共同特征 51
7.4 最低要求 52
7.4.1 定义测试 53
7.4.2 什么是夹具 53
7.4.3 定义测试套件 53
7.4.4 运行测试 54
7.4.5 测试结果 54
7.5 xUnit的本质 55
7.5.1 测试命令 56
7.5.2 测试套件对象 56
7.6 过程化世界里的xUnit 57
7.7 接下来要讨论的问题 57
第8章 暂时夹具管理 59
8.1 关于本章 59
8.2 测试夹具术语 59
8.2.1 什么是夹具 60
8.2.2 什么是新鲜夹具 60
8.2.3 什么是暂时新鲜夹具 61
8.3 建立新鲜夹具 61
8.3.1 内联夹具建立 61
8.3.2 委托夹具建立 62
8.3.3 隐式夹具建立 63
8.3.4 SetUp方法的滥用 64
8.3.5 混合夹具建立 65
8.4 拆卸暂时新鲜夹具 65
8.5 接下来要讨论的问题 65
第9章 永久夹具管理 67
9.1 关于本章 67
9.2 管理永久新鲜夹具 67
9.2.1 什么让夹具变得永久 67
9.2.2 永久新鲜夹具产生的问题 68
9.2.3 拆卸永久新鲜夹具 68
9.2.4 避免拆卸的需要 71
9.2.5 处理缓慢测试 72
9.3 管理共享的夹具 72
9.3.1 访问共享夹具 73
9.3.2 引发共享夹具结构 73
9.4 接下来要讨论的问题 75
第10章 结果验证 77
10.1 关于本章 77
10.2 让测试自检 77
10.3 状态验证 78
10.3.1 使用内置断言 79
10.3.2 Delta断言 80
10.3.3 外部结果验证 80
10.4 验证行为 80
10.4.1 过程行为验证 81
10.4.2 预期行为规范 82
10.5 减少测试码复制 82
10.5.1 预期对象 83
10.5.2 自定义断言 84
10.5.3 结果描述验证方法 84
10.5.4 参数化测试和数据驱动测试 85
10.6 避免条件测试逻辑 86
10.6.1 排除if语句 87
10.6.2 排除循环 87
10.7 其他方法 88
10.7.1 逆向操作,由外到内 88
10.7.2 使用测试驱动开发来写测试实用程序方法 88
10.8 将可重复使用的验证逻辑放在哪里 89
10.9 接下来要讨论的问题 89
第11章 使用测试替身 91
11.1 关于本章 91
11.2 什么是间接输入和间接输出 91
11.2.1 为什么要关注间接输入 91
11.2.2 为什么要关注间接输出 92
11.2.3 如何控制间接输入 93
11.2.4 如何验证间接输出 94
11.3 使用替身测试 96
11.3.1 测试替身的类型 97
11.3.2 提供测试替身 102
11.3.3 配置测试替身 103
11.3.4 安装测试替身 104
11.4 测试替身的其他用法 108
11.4.1 内窥镜测试 108
11.4.2 需求驱动开发 108
11.4.3 加速夹具建立 108
11.4.4 加速测试执行 109
11.5 其他需要考虑的问题 109
11.6 接下来要讨论的问题 109
第12章 组织测试 111
12.1 关于本章 111
12.2 基本的xUnit机制 111
12.3 合理精简测试方法 111
12.4 测试方法和测试用例类 113
12.4.1 每个类一个测试用例类 113
12.4.2 每种特征一个测试用例类 113
12.4.3 每个夹具一个测试用例类 114
12.4.4 选择测试方法组织策略 115
12.5 测试命名约定 115
12.6 组织测试套件 116
12.6.1 运行测试组 117
12.6.2 运行单个测试 117
12.7 测试码重用 118
12.7.1 测试实用程序方法位置 118
12.7.2 测试用例继承与重用 119
12.8 测试文件组织 119
12.8.1 内置自测 119
12.8.2 测试程序包 120
12.8.3 测试依赖 120
12.9 接下来要讨论的问题 120
第13章 使用数据库的测试 121
13.1 关于本章 121
13.2 使用数据库的测试 121
13.2.1 数据库测试的原因 121
13.2.2 数据库带来的问题 122
13.3 不使用数据库的测试 123
13.4 测试数据库 124
13.4.1 测试存储过程 124
13.4.2 测试数据访问层 125
13.4.3 确保开发人员独立 125
13.5 使用数据库测试(再次!) 126
13.6 接下来要讨论的问题 126
第14章 有效测试自动化的路线图 127
14.1 关于本章 127
14.2 测试自动化的困难 127
14.3 高度可维护的自动化测试的路线图 128
14.3.1 执行快乐路径代码 129
14.3.2 验证快乐路径的直接输出 129
14.3.3 验证备选路径 129
14.3.4 验证间接输出行为 130
14.3.5 最优化测试执行和维护 130
14.4 接下来要讨论的问题 131
第Ⅱ部分 测试味道
第15章 代码味道 135
15.1 模糊测试 (也称为长测试、复杂测试、冗长测试) 135
15.1.1 症状 135
15.1.2 影响 135
15.1.3 原因 135
15.1.4 解决方案模式 145
15.2 条件测试逻辑 (也称为缩排的测试码) 146
15.2.1 症状 146
15.2.2 影响 147
15.2.3 原因 147
15.3 难以测试的代码 152
15.3.1 症状 153
15.3.2 影响 153
15.3.3 解决方案模式 153
15.3.4 原因 153
15.4 测试码复制 155
15.4.1 症状 155
15.4.2 影响 156
15.4.3 原因 156
15.4.4 高级阅读 157
15.5 产品中的测试逻辑 158
15.5.1 症状 158
15.5.2 影响 158
15.5.3 原因 158
15.5.4 高级阅读 161
第16章 行为味道 163
16.1 断言滚轮 163
16.1.1 症状 163
16.1.2 影响 163
16.1.3 原因 163
16.1.4 高级阅读 165
16.2 不稳定测试 165
16.2.1 症状 165
16.2.2 影响 166
16.2.3 检修建议 166
16.2.4 原因 166
16.3 脆弱测试 173
16.3.1 症状 174
16.3.2 影响 174
16.3.3 检修建议 174
16.3.4 原因 175
16.3.5 高级阅读 179
16.4 频繁调试(也称为手动调试) 179
16.4.1 症状 179
16.4.2 原因 179
16.4.3 影响 180
16.4.4 解决方案模式 180
16.5 手动干预 180
16.5.1 症状 180
16.5.2 影响 180
16.5.3 原因 181
16.5.4 高级阅读 182
16.6 缓慢测试 182
16.6.1 症状 182
16.6.2 影响 182
16.6.3 检修建议 183
16.6.4 原因 183
第17章 项目味道 187
17.1 缺陷测试 187
17.1.1 症状 187
17.1.2 影响 187
17.1.3 原因 187
17.1.4 检修建议 188
17.1.5 解决方案模式 188
17.2 开发人员没有写测试 189
17.2.1 症状 189
17.2.2 影响 189
17.2.3 原因 189
17.2.4 检修建议 190
17.3 高测试维护成本 190
17.3.1 症状 190
17.3.2 影响 191
17.3.3 原因 191
17.3.4 检修建议 192
17.4 产品缺陷 192
17.4.1 症状 192
17.4.2 影响 192
17.4.3 原因 192
第Ⅲ部分 模 式
第18章 测试策略模式 201
18.1 记录测试(也称为记录与回放测试、机器人用户测试、捕获/回放测试) 201
18.1.1 运行原理 202
18.1.2 使用时机 202
18.1.3 实现方式说明 203
18.1.4 示例:内置测试记录 203
18.1.5 示例:商业记录与回放测试工具 204
18.1.6 重构说明 206
18.1.7 示例:重构的商业记录测试 206
18.1.8 高级阅读 207
18.2 脚本测试(也称为手写测试、手动编码测试、程序测试、自动化单元测试) 207
18.2.1 运行原理 208
18.2.2 使用时机 208
18.2.3 实现方式说明 208
18.2.4 示例:脚本测试 208
18.2.5 关于名称 209
18.2.6 高级阅读 209
18.3 数据驱动测试 209
18.3.1 运行原理 210
18.3.2 使用时机 210
18.3.3 实现方式说明 211
18.3.4 启发示例 213
18.3.5 重构说明 214
18.3.6 示例:使用XML数据文件的xUnit数据驱动测试 214
18.3.7 示例:使用CSV输入文件的xUnit数据驱动测试 215
18.3.8 示例:使用Fit架构的数据驱动测试 216
18.4 测试自动化架构 217
18.4.1 运行原理 218
18.4.2 这样做的原因 218
18.4.3 实现方式说明 218
18.4.4 示例:测试自动化架构 219
18.4.5 高级阅读 219
18.5 最小夹具 (也称为最小上下文) 220
18.5.1 这样做的原因 220
18.5.2 实现方式说明 220
18.6 标准夹具 (也称为标准上下文) 221
18.6.1 运行原理 222
18.6.2 使用它的时机 222
18.6.3 实现方式说明 223
18.6.4 启发示例 224
18.6.5 重构说明 224
18.6.6 示例:标准夹具 225
18.7 新鲜夹具 (也称为新鲜上下文、私有夹具) 226
18.7.1 运行原理 226
18.7.2 使用时机 226
18.7.3 实现方式说明 227
18.7.4 保留夹具的原因 227
18.7.5 新鲜夹具建立 228
18.7.6 启发示例 229
18.7.7 重构说明 229
18.7.8 示例:新鲜夹具 229
18.8 共享夹具 (也称为共享上下文、遗留夹具、重用的夹具、陈旧夹具) 230
18.8.1 运行原理 231
18.8.2 使用时机 231
18.8.3 实现方式说明 234
18.8.4 重构说明 235
18.8.5 示例:共享夹具 235
18.8.6 示例:不可变的共享夹具 237
18.9 后门操作(也称为层交叉测试) 238
18.9.1 运行原理 238
18.9.2 使用时机 238
18.9.3 实现方式说明 240
18.9.4 启发示例 241
18.9.5 重构说明 242
18.9.6 示例:使用测试间谍的后门结果验证 242
18.9.7 示例:后门夹具建立 242
18.9.8 高级阅读 244
18.10 层测试(也称为单层测试、逐层测试或分层测试) 245
18.10.1 运行原理 246
18.10.2 使用时机 246
18.10.3 实现方式说明 247
18.10.4 启发示例 248
18.10.5 重构说明 249
18.10.6 示例:表示层测试 249
18.10.7 示例:皮下测试 250
18.10.8 示例:业务层测试 251
第19章 xUnit基本模式 253
19.1 测试方法 253
19.1.1 运行原理 253
19.1.2 这样做的原因 254
19.1.3 实现方式说明 254
19.1.4 示例:简单成功测试 256
19.1.5 示例:使用try/catch的预期异常测试 257
19.1.6 示例:使用方法属性的预期异常测试 258
19.1.7 示例:使用代码块/闭包的预期异常测试 258
19.1.8 示例:构造函数测试 259
19.2 四阶段测试 260
19.2.1 运行原理 261
19.2.2 这样做的原因 261
19.2.3 实现方式说明 262
19.2.4 示例:四阶段测试 (内联) 262
19.2.5 示例:四阶段测试 (隐式建立/拆卸) 262
19.3 断言方法 263
19.3.1 运行原理 264
19.3.2 这样做的原因 264
19.3.3 实现方式说明 264
19.3.4 启发示例 266
19.3.5 重构说明 267
19.3.6 示例:相等性断言 268
19.3.7 示例:模糊相等性断言 268
19.3.8 示例:确定结果断言 268
19.3.9 示例:预期异常断言 268
19.3.10 示例:单一结果断言 269
19.4 断言消息 269
19.4.1 运行原理 269
19.4.2 使用时机 269
19.4.3 实现方式说明 270
19.4.4 启发示例 270
19.4.5 重构说明 271
19.4.6 示例:异常描述消息 271
19.5 测试用例类 271
19.5.1 运行原理 272
19.5.2 这样做的原因 272
19.5.3 实现方式说明 273
19.5.4 示例:测试用例类 273
19.5.5 高级阅读 274
19.6 测试运行器 274
19.6.1 运行原理 275
19.6.2 这样做的原因 275
19.6.3 实现方式说明 275
19.7 测试用例对象 278
19.7.1 运行原理 278
19.7.2 这样做的原因 278
19.7.3 实现方式说明 279
19.7.4 示例:测试用例对象 280
19.8 测试套件对象 281
19.8.1 运行原理 281
19.8.2 这样做的原因 281
19.8.3 实现方式说明 282
19.8.4 示例:测试套件对象 282
19.8.5 示例:使用测试枚举构建的套件的套件 283
19.8.6 示例:测试套件过程 284
19.9 测试发现 286
19.9.1 运行原理 286
19.9.2 使用时机 286
19.9.3 实现方式说明 287
19.9.4 启发示例 287
19.9.5 重构说明 288
19.9.6 示例:测试方法发现 (使用方法命名和编译器宏) 288
19.9.7 示例:测试方法发现 (使用方法命名) 288
19.9.8 示例:测试方法发现 (使用方法属性) 289
19.9.9 示例:测试用例类发现 (使用类属性) 290
19.9.10 示例:测试用例类发现 (使用公共位置和测试用例超类) 290
19.10 测试枚举(也称为:测试套件工厂) 290
19.10.1 运行原理 291
19.10.2 使用它的时机 291
19.10.3 实现方式说明 291
19.10.4 示例:CppUnit中的测试方法枚举 292
19.10.5 示例:测试方法调用(硬编码的) 293
19.10.6 示例:测试套件枚举 293
19.11 测试选择 294
19.11.1 运行原理 294
19.11.2 使用时机 294
19.11.3 实现方式说明 295
19.11.4 示例:使用类属性的测试用例类选择 295
19.11.5 示例:使用方法属性的测试方法选择 295
第20章 夹具建立模式 297
20.1 内联建立 297
20.1.1 运行原理 298
20.1.2 使用时机 298
20.1.3 实现方式说明 298
20.1.4 示例:内联建立 298
20.1.5 重构说明 299
20.2 委托建立 299
20.2.1 运行原理 300
20.2.2 使用时机 300
20.2.3 实现方式说明 300
20.2.4 启发示例 300
20.2.5 重构说明 301
20.2.6 示例:委托建立 301
20.3 创建方法 302
20.3.1 运行原理 303
20.3.2 使用时机 303
20.3.3 实现方式说明 305
20.3.4 启发示例 305
20.3.5 重构说明 306
20.3.6 示例:匿名创建方法 306
20.3.7 示例:参数化创建方法 307
20.3.8 示例:附件方法 307
20.3.9 示例:重复用于夹具建立的测试 308
20.4 隐式建立(也称为:挂钩建立、调用架构建立、共享建立方法) 309
20.4.1 运行原理 310
20.4.2 使用时机 310
20.4.3 实现方式说明 310
20.4.4 启发示例 311
20.4.5 重构说明 312
20.4.6 示例:隐式建立 312
20.5 预制夹具(也称为:预制上下文、测试台) 313
20.5.1 运行原理 313
20.5.2 使用时机 313
20.5.3 实现方式说明 314
20.5.4 启发示例 315
20.5.5 重构说明 316
20.5.6 示例:预制夹具测试 316
20.5.7 示例:夹具建立测试用例 316
20.5.8 示例:使用数据填充脚本的预制夹具建立 317
20.6 延迟建立 317
20.6.1 运行原理 318
20.6.2 使用时机 318
20.6.3 实现方式说明 319
20.6.4 启发示例 319
20.6.5 重构说明 321
20.6.6 示例:延迟建立 321
20.7 套件夹具建立 322
20.7.1 运行原理 323
20.7.2 使用时机 323
20.7.3 实现方式说明 323
20.7.4 启发示例 324
20.7.5 重构说明 325
20.7.6 示例:套件夹具建立 325
20.7.7 关于名称 327
20.7.8 高级阅读 327
20.8 建立装饰器 327
20.8.1 运行原理 328
20.8.2 使用时机 328
20.8.3 实现方式说明 328
20.8.4 启发示例 330
20.8.5 重构说明 330
20.8.6 示例:硬编码的建立装饰器 330
20.8.7 示例:参数化建立装饰器 331
20.8.8 示例:抽象装饰器类 332
20.9 链接测试 332
20.9.1 运行原理 333
20.9.2 使用时机 333
20.9.3 实现方式说明 334
20.9.4 启发示例 335
20.9.5 重构说明 336
20.9.6 示例:链接测试 336
第21章 结果验证模式 339
21.1 状态验证(也称为:基于状态的测试) 339
21.1.1 运行原理 340
21.1.2 使用时机 340
21.1.3 实现方式说明 340
21.1.4 启发示例 341
21.1.5 重构说明 342
21.1.6 示例:过程状态验证 342
21.1.7 示例:预期对象 342
21.2 行为验证(也称为:交互测试) 343
21.2.1 运行原理 343
21.2.2 使用时机 344
21.2.3 实现方式说明 344
21.2.4 启发示例 345
21.2.5 重构说明 346
21.2.6 示例:过程行为验证 346
21.2.7 示例:预期行为规范 347
21.3 自定义断言(也称为:预约断言) 347
21.3.1 工作原理 348
21.3.2 使用时机 348
21.3.3 实现方式说明 350
21.3.4 启发示例 351
21.3.5 重构说明 352
21.3.6 示例:自定义断言 352
21.3.7 示例:域断言 353
21.3.8 示例:验证方法 354
21.3.9 示例:自定义断言测试 355
21.4 Delta断言 356
21.4.1 运行原理 356
21.4.2 使用时机 357
21.4.3 实现方式说明 357
21.4.4 启发示例 358
21.4.5 重构说明 358
21.4.6 示例:Delta断言 358
21.5 哨兵断言 359
21.5.1 运行原理 360
21.5.2 使用时机 360
21.5.3 实现方式说明 360
21.5.4 启发示例 361
21.5.5 重构说明 361
21.5.6 示例:简单哨兵断言 361
21.5.7 示例:共享夹具哨兵断言 362
21.6 未完成的测试断言 362
21.6.1 运行原理 363
21.6.2 使用时机 363
21.6.3 实现方式说明 363
21.6.4 启发示例 364
21.6.5 重构说明 364
21.6.6 示例:未完成的测试断言 364
21.6.7 示例:使用模板的未完成的测试方法生成 365
第22章 夹具拆卸模式 367
22.1 无用单元收集拆卸 367
22.1.1 运行原理 367
22.1.2 使用时机 368
22.1.3 实现方式说明 368
22.1.4 启发示例 368
22.1.5 重构说明 369
22.1.6 示例:无用单元收集拆卸 369
22.2 自动拆卸(也称为:测试对象注册库) 369
22.2.1 运行原理 370
22.2.2 使用时机 370
22.2.3 实现方式说明 370
22.2.4 启发示例 371
22.2.5 重构说明 372
22.2.6 示例:自动拆卸 372
22.2.7 示例:自动执行拆卸 374
22.3 内联拆卸 374
22.3.1 运行原理 375
22.3.2 使用时机 375
22.3.3 实现方式说明 376
22.3.4 启发示例 376
22.3.5 示例:天真内联拆卸 377
22.3.6 重构说明 377
22.3.7 示例:内联拆卸 377
22.3.8 示例:拆卸哨兵子句 378
22.3.9 示例:多种资源内联拆卸(Java) 378
22.3.10 示例:委托拆卸 379
22.4 隐式拆卸(也称为:关联拆卸、调用架构拆卸、拆卸方法) 380
22.4.1 运行原理 381
22.4.2 使用时机 381
22.4.3 实现方式说明 381
22.4.4 启发示例 381
22.4.5 重构说明 382
22.4.6 示例:隐式拆卸 382
第23章 测试替身模式 385
23.1 测试替身 (也称为冒名顶替者) 385
23.1.1 运行原理 386
23.1.2 使用时机 386
23.1.3 实现方式说明 388
23.1.4 示例:测试替身 389
23.2 测试桩(也称为:桩) 390
23.2.1 运行原理 390
23.2.2 使用时机 390
23.2.3 实现方式说明 391
23.2.4 启发示例 392
23.2.5 重构说明 393
23.2.6 示例:响应器 (作为手动编码的测试桩) 393
23.2.7 示例:响应器 (动态生成) 394
23.2.8 示例:破坏者 (作为匿名内部类) 395
23.2.9 示例:实体链裁剪 395
23.2.10 高级阅读 397
23.3 测试间谍(也称为:间谍、记录测试桩) 397
23.3.1 运行原理 398
23.3.2 使用时机 398
23.3.3 实现方式说明 399
23.3.4 启发示例 399
23.3.5 重构说明 400
23.3.6 示例:测试间谍 400
23.4 仿制对象 402
23.4.1 运行原理 402
23.4.2 使用时机 403
23.4.3 实现方式说明 403
23.4.4 启发示例 404
23.4.5 重构说明 405
23.4.6 示例:仿制对象 (手动编码的) 405
23.4.7 示例:仿制对象 (动态生成的) 406
23.4.8 高级阅读 407
23.5 伪造对象(也称为:哑元) 407
23.5.1 运行原理 408
23.5.2 使用时机 408
23.5.3 实现方式说明 409
23.5.4 启发示例 410
23.5.5 重构说明 411
23.5.6 示例:伪造数据库 411
23.5.7 高级阅读 412
23.6 可配置的测试替身(也称为:可配置的仿制对象、可配置的测试间谍、可配置的测试桩) 412
23.6.1 运行原理 413
23.6.2 使用时机 413
23.6.3 实现方式说明 413
23.6.4 启发示例 415
23.6.5 重构说明 417
23.6.6 示例:使用设置者的配置接口 417
23.6.7 示例:使用表达式生成器的配置接口 418
23.6.8 示例:配置模式 419
23.7 硬编码的测试替身(也称为:硬编码的仿制对象、硬编码的测试桩、硬编码的测试间谍) 420
23.7.1 运行原理 421
23.7.2 使用时机 421
23.7.3 实现方式说明 421
23.7.4 启发示例 423
23.7.5 重构说明 423
23.7.6 示例:测试替身类 424
23.7.7 示例:自分流/回送 424
23.7.8 示例:子类化内部测试替身 425
23.7.9 示例:从伪类子类化的内部测试替身 426
23.7.10 高级阅读 428
23.8 测试专用子类(也称为:测试专用扩充) 429
23.8.1 运行原理 429
23.8.2 使用时机 430
23.8.3 实现方式说明 431
23.8.4 启发示例 431
23.8.5 重构说明 433
23.8.6 示例:修改行为的子类(测试桩) 433
23.8.7 示例:修改行为的子类(代替的单态) 434
23.8.8 示例:提供行为的子类 435
23.8.9 示例:定义测试专用相等性(修改行为的子类) 436
23.8.10 示例:提供状态的子类 437
第24章 测试组织模式 439
24.1 命名测试套件 439
24.1.1 运行原理 440
24.1.2 使用时机 440
24.1.3 实现方式说明 440
24.1.4 重构说明 441
24.1.5 示例:全部测试套件 441
24.1.6 示例:专用目的套件 442
24.1.7 示例:单个测试套件 442
24.1.8 示例:冒烟测试套件 443
24.2 测试实用程序方法 444
24.2.1 运行原理 444
24.2.2 使用时机 445
24.2.3 实现方式说明 447
24.2.4 启发示例 447
24.2.5 重构说明 448
24.2.6 示例:测试实用程序方法 449
24.3 参数化测试 450
24.3.1 运行原理 451
24.3.2 使用时机 451
24.3.3 实现方式说明 452
24.3.4 启发示例 453
24.3.5 重构说明 454
24.3.6 示例:参数化测试 454
24.3.7 示例:独立表格测试 455
24.3.8 示例:递增的表格测试 456
24.3.9 示例:使用架构支持的表格测试(MbUnit) 456
24.3.10 示例:循环驱动测试(枚举值) 457
24.3.11 示例:循环驱动测试(计算值) 457
24.4 每个类一个测试用例类 458
24.4.1 运行原理 459
24.4.2 使用时机 459
24.4.3 实现方式说明 459
24.5 每种特征一个测试用例类 464
24.5.1 运行原理 465
24.5.2 使用时机 465
24.5.3 实现方式说明 466
24.5.4 启发示例 466
24.5.5 重构说明 467
24.5.6 示例:每种特征一个测试用例类 468
24.6 每个夹具一个测试用例类 469
24.6.1 运行原理 470
24.6.2 使用时机 470
24.6.3 实现方式说明 471
24.6.4 启发示例 471
24.6.5 重构说明 473
24.6.6 示例:每个夹具一个测试用例类 473
24.7 测试用例超类 (也称为抽象测试用例、抽象测试夹具、测试用例基类) 475
24.7.1 运行原理 476
24.7.2 使用时机 476
24.7.3 实现方式说明 477
24.7.4 启发示例 477
24.7.5 重构说明 477
24.7.6 示例:测试用例超类 478
24.7.7 示例:测试辅助混入 478
24.8 测试辅助 480
24.8.1 运行原理 480
24.8.2 使用时机 480
24.8.3 实现方式说明 481
24.8.4 启发示例 482
24.8.5 重构说明 482
24.8.6 示例:使用类方法的测试辅助 483
24.8.7 示例:使用实例方法的测试辅助 483
第25章 数据库模式 485
25.1 数据库沙盒 485
25.1.1 运行原理 486
25.1.2 使用时机 486
25.1.3 实现方式说明 486
25.1.4 启发示例 487
25.1.5 重构说明 487
25.1.6 示例:数据库分区方案 488
25.2 存储过程测试 488
25.2.1 运行原理 489
25.2.2 使用时机 489
25.2.3 实现方式说明 489
25.2.4 启发示例 491
25.2.5 重构说明 492
25.2.6 示例:数据库内存储过程测试 492
25.2.7 示例:远程存储过程测试 493
25.3 表格截断拆卸 493
25.3.1 运行原理 494
25.3.2 使用时机 494
25.3.3 实现方式说明 495
25.3.4 启发示例 496
25.3.5 重构说明 496
25.3.6 示例:表格截断(委托)拆卸测试 496
25.3.7 示例:延迟拆卸测试 497
25.3.8 示例:使用SQL的表格截断拆卸 498
25.3.9 示例:使用ORM的表格截断拆卸 498
25.4 事务回滚拆卸 499
25.4.1 运行原理 500
25.4.2 使用时机 500
25.4.3 实现方式说明 501
25.4.4 启发示例 502
25.4.5 重构说明 502
25.4.6 示例:对象事务回滚拆卸 503
25.4.7 示例:数据库事务回滚拆卸 504
第26章 易测性设计模式 507
26.1 依赖注入 507
26.1.1 运行原理 507
26.1.2 使用时机 508
26.1.3 实现方式说明 508
26.1.4 启发示例 510
26.1.5 重构说明 510
26.1.6 示例:参数注入 511
26.1.7 示例:构造函数注入 511
26.1.8 示例:设置者注入 512
26.2 依赖查找(也称为:服务定位器、对象工厂、组件代理、组件注册库) 513
26.2.1 运行原理 514
26.2.2 使用时机 514
26.2.3 实现方式说明 515
26.2.4 启发示例 516
26.2.5 重构说明 517
26.2.6 示例:可配置的注册库 517
26.2.7 示例:代替的单态 518
26.2.8 关于名称 520
26.3 低级对象 520
26.3.1 运行原理 521
26.3.2 使用时机 521
26.3.3 实现方式说明 522
26.3.4 启发示例(低级可执行) 524
26.3.5 重构说明 525
26.3.6 示例:穷人的低级对象 526
26.3.7 示例:真正低级可执行 526
26.3.8 示例:低级对话 528
26.3.9 示例:低级事务控制器 531
26.4 测试挂钩 531
26.4.1 运行原理 531
26.4.2 使用时机 532
26.4.3 实现方式说明 532
26.4.4 启发示例 532
26.4.5 重构说明 533
26.4.6 示例:被测系统的测试挂钩 533
26.4.7 示例:依赖组件中的测试挂钩 533
第27章 值模式 535
27.1 字面值(也称为:硬编码值、常量值) 535
27.1.1 运行原理 535
27.1.2 使用时机 535
27.1.3 实现方式说明 536
27.1.4 示例:字面值 536
27.1.5 重构说明 537
27.1.6 示例:符号常量 537
27.1.7 示例:自述值 537
27.1.8 示例:不同值 538
27.2 派生值(也称为:计算值) 538
27.2.1 运行原理 538
27.2.2 使用时机 539
27.2.3 启发示例 539
27.2.4 重构说明 540
27.2.5 示例:派生预期 540
27.2.6 示例:一种坏属性 540
27.3 生成值 542
27.3.1 运行原理 542
27.3.2 使用时机 542
27.3.3 实现方式说明 543
27.3.4 启发示例 543
27.3.5 重构说明 544
27.3.6 示例:不同生成值 544
27.3.7 示例:相关生成值 545
27.4 哑元对象(也称为:哑元、哑元参数、哑元值、占位符、桩) 545
27.4.1 运行原理 546
27.4.2 使用时机 546
27.4.3 实现方式说明 546
27.4.4 启发示例 547
27.4.5 重构说明 548
27.4.6 示例:哑元值和哑元对象 548
第Ⅳ部分 附 录
附录A 测试重构 553
附录B xUnit术语 559
附录C xUnit家族成员 565
附录D 工具 571
附录E 目标和原则 577
附录F 味道、别名和原因 579
附录G 模式、别名和变体 583
术语表 595
参考文献 619
· · · · · · (
收起)