![]() 作者:梅扎罗斯 原作名: xUnit Test Patterns: Refactoring Test Code 译者:付勇 出版年: 2009-1 页数: 631 定价: 86.00元 ISBN: 9787302191384 内容简介 · · · · · ·《xUnit测试模式:测试码重构》是使用当今最受欢迎的单元测试架构xUnit写自动化测试的权威指南。敏捷教练和测试自动化专家Gerard Meszaros描述了68种经过证明的模式,这些模式让编写、理解和维护测试变得更容易。它还介绍了让测试更健壮、更可重复及更经济划算的方法。 目录 · · · · · ·目 录第Ⅰ部分 总述 第1章 概览 3 1.1 关于本章 3 1.2 可能有效的最简单的测试自动化策略 3 1.2.1 开发过程 3 · · · · · ·() 目 录 第Ⅰ部分 总述 第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 · · · · · · () |
一种宝贵的积累!
开阔了自己的思维
值得一看