内容简介:
在传统的软件开发中,开发人员对于代码是否正确心中无底,一切依赖于后期的测试环节。极限编程反其道而行之,主张采用测试驱动开发(TDD)的方法,即通过测试定义所要开发的功能的接口,然后实现功能的开发过程。TDD通过不断地测试推动代码的开发,既简化了代码,又保证了软件质量。
本书采用“手把手”的教学方式,通过大量实例来解释TDD,还专门用几章的篇幅来讲解如何为难于测试的技术编写单元测试。全书内容循序渐进,先侧重基础内容,讨论测试驱动开发和验收,然后进入动手实践部分,逐一讲解如何对各种技术应用TDD,最后介绍基于验收测试驱动的测试先行的方式构建完整的系统。
本书面向各个层次的Java程序员。面对变化的世界,请张开双臂,拥抱极限编程,拥抱TDD。
作者简介:
Lasse Koskela 程序员,软件开发培训师、咨询师,任职于芬兰知名软件公司Reaktor,致力于为客户提供软件性能提升解决方案;同时也是开源软件的忠实拥护者。其博客地址为:http://lassekoskela.com/thoughts/。
资源目录:
第一部分 TDD入门
第1章 综述 2
1.1 挑战:用正确的方法解决正确的问题 3
1.1.1 糟糕的代码质量 3
1.1.2 不能满足客户需求 4
1.2 解决方案:测试驱动 4
1.2.1 高质量的TDD 5
1.2.2 用ATDD满足客户需求 6
1.2.3 这对我有什么好处 7
1.3 正确地做事:TDD 9
1.3.1 测试—编码—重构 9
1.3.2 增量式开发 12
1.3.3 重构以保持代码的健康 16
1.3.4 保证软件正常运行 18
1.4 做正确的事:ATDD 20
1.4.1 名字的含义 20
1.4.2 紧密协作 21
1.4.3 把测试作为沟通的共同语言 22
1.5 TDD工具 23
1.5.1 使用xUnit做单元测试 23
1.5.2 支持ATDD的测试框架 23
1.5.3 持续集成及构建 24
1.5.4 代码覆盖率 25
1.6 小结 26
第2章 TDD入门 28
2.1 从需求到测试 29
2.1.1 分解需求 29
2.1.2 什么是好的测试 30
2.1.3 依照测试的列表工作 30
2.1.4 意图编程 30
2.2 选择第一个测试 31
2.2.1 创建测试列表 31
2.2.2 写第一个失败的测试 32
2.2.3 通过第一个测试 34
2.2.4 再加一个测试 36
2.3 广度优先,深度优先 38
2.3.1 继续使用伪实现 39
2.3.2 清除掉伪实现 39
2.4 别忘了重构 41
2.4.1 测试代码中的可重构之处 42
2.4.2 移除多余的测试 43
2.5 添加错误处理 44
2.5.1 验证异常 44
2.5.2 把方法重构得更短些 45
2.5.3 保持方法平衡 46
2.5.4 验证异常中的详细信息 47
2.6 无穷尽的测试 48
2.6.1 性能测试 48
2.6.2 有些失望的结局 49
2.7 小结 50
第3章 小步重构 51
3.1 探寻解决方案 51
3.1.1 用Spike开发原型 52
3.1.2 写测试学知识 52
3.1.3 学习API的Spike样例 52
3.2 以受控的方式修改设计 54
3.3 进一步延伸新设计 61
3.3.1 保持兼容 62
3.3.2 替换实现 66
3.4 小结 68
第4章 TDD的概念与模式 69
4.1 如何编写及通过测试 70
4.1.1 测试选择技巧 70
4.1.2 实现技巧 72
4.1.3 测试驱动的基本准则 73
4.2 重要的测试概念 74
4.2.1 夹具是测试的上下文 74
4.2.2 用测试替身替换依赖 76
4.2.3 基于状态及基于交互的的测试 76
4.3 近处观察测试替身 78
4.3.1 测试替身的例子 78
4.3.2 伪实现、测试桩和模拟对象 79
4.3.3 模拟对象实战 80
4.4 提高设计的可测试性的准则 81
4.4.1 尽量使用组合而非继承 82
4.4.2 避免使用static关键字以及Singleton模式 83
4.4.3 隔离依赖 84
4.4.4 注入依赖 86
4.5 单元测试模式 88
4.5.1 断言模式 89
4.5.2 夹具模式 92
4.5.3 测试模式 95
4.6 在遗留代码基础上工作 101
4.6.1 测试驱动遗留开发 101
4.6.2 分析变化 102
4.6.3 准备好变化 103
4.6.4 测试驱动变更 103
4.7 小结 104
第二部分 针对特定技术应用TDD
第5章 测试驱动Web组件 106
5.1 在60秒内介绍Web应用中的MVC 107
5.2 控制器 107
5.2.1 测试驱动Java Servlets 108
5.2.2 测试驱动Spring控制器 117
5.3 用测试先行的方法构建视图 120
5.3.1 用JspTest测试驱动JSP 121
5.3.2 测试驱动Velocity模板 125
5.4 在基于控件的Web框架基础上TDD 129
5.4.1 剖析典型框架 130
5.4.2 用测试先行的方法开发Wicket页面 130
5.5 小结 135
第6章 测试驱动数据访问 137
6.1 探索问题领域 137
6.1.1 跨越边界的数据访问 138
6.1.2 用DAO模式分层 138
6.2 用单元测试驱动数据访问 139
6.2.1 JDBC API的缺点 140
6.2.2 用Spring的JdbcTemplate简化开发 144
6.2.3 用Hibernate轻松地做TDD 149
6.3 编码前写集成测试 155
6.3.1 什么是集成测试 155
6.3.2 选择数据库 157
6.4 集成测试实战 159
6.4.1 第一个Hibernate集成测试 159
6.4.2 创建数据库模式 162
6.4.3 实现产品代码 164
6.4.4 用事务夹具保持数据清洁 165
6.5 为集成测试填充数据 166
6.5.1 用Hibernate填充对象 167
6.5.2 用DbUnit填充数据 168
6.6 使用单元测试还是集成测试 172
6.6.1 在TDD周期中使用集成测试 172
6.6.2 两全其美 173
6.7 文件系统访问 173
6.7.1 项目中实际遇到的一个问题 174
6.7.2 提高文件访问可测试性的实践 174
6.8 小结 175
第7章 测试驱动不可预测功能 177
7.1 测试驱动时间相关功能 177
7.1.1 例子:日志和时间戳 177
7.1.2 抽象出系统时间 179
7.1.3 用虚设的系统时间测试日志输出 181
7.2 测试驱动多线程代码 184
7.2.1 该测什么 184
7.2.2 线程安全 185
7.2.3 阻塞操作 189
7.2.4 启动及中止线程 191
7.2.5 异步执行 193
7.2.6 线程同步 195
7.3 标准同步对象 196
7.3.1 信号量 196
7.3.2 latche 196
7.3.3 barrier 196
7.3.4 futures 197
7.4 小结 197
第8章 测试驱动Swing代码 198
8.1 Swing UI中该测试什么 198
8.1.1 内部基础设施及实用程序 199
8.1.2 渲染及布局 199
8.1.3 交互 199
8.2 可测试UI代码的模式 200
8.2.1 经典MVP 201
8.2.2 Supervising Controller 201
8.2.3 Passive View 203
8.3 测试视图控件的工具 205
8.3.1 为什么要用工具 205
8.3.2 TDD友好的工具 206
8.4 测试驱动视图组件 210
8.4.1 着手设计 211
8.4.2 添加及操作标准控件 212
8.4.3 绘图 216
8.4.4 给点添加行为 224
8.5 小结 227
第三部分 基于ATDD构建产品
第9章 解析验收测试驱动开发 230
9.1 用户故事介绍 231
9.1.1 故事的格式 231
9.1.2 讲故事的力量 231
9.1.3 用户故事的例子 232
9.2 验收测试 232
9.2.1 故事的样例测试 232
9.2.2 验收测试的特征 233
9.2.3 实现验收测试 236
9.3 理解过程 237
9.3.1 ATDD周期 237
9.3.2 迭代内的ATDD 242
9.4 作为团队活动的ATDD 245
9.4.1 客户角色定义 245
9.4.2 客户与谁一起写测试 246
9.4.3 需要多少测试人员 247
9.5 ATDD的好处 247
9.5.1 “完成”的定义 247
9.5.2 协作 248
9.5.3 信任及承诺 249
9.5.4 通过例子验收 249
9.5.5 弥合差距 249
9.6 我们究竟要测试什么 250
9.6.1 应该针对UI测试吗 250
9.6.2 可以使用部分系统的伪实现吗 251
9.6.3 应该直接测试领域逻辑吗 251
9.7 工具概览 252
9.7.1 基于表格的框架 252
9.7.2 基于文本的框架 253
9.7.3 基于脚本语言的框架 254
9.7.4 自制工具 254
9.8 小结 254
第10章 用Fit创建验收测试 256
10.1 Fit是什么 256
10.1.1 用Fit进行ATDD 257
10.1.2 包含夹具表的测试文档 259
10.1.3 夹具:表格和类的结合 260
10.2 三个内建夹具 261
10.2.1 ColumnFixture 261
10.2.2 RowFixture 263
10.2.3 ActionFixture 266
10.2.4 扩展内建夹具 268
10.3 FitLibrary对内建夹具的扩展 269
10.3.1 DoFixture 269
10.3.2 SetUpFixture 272
10.3.3 还有更多功能 273
10.4 执行Fit测试 273
10.4.1 单个测试文档 274
10.4.2 把所有测试放在一个目录结构中 274
10.4.3 把测试整合进自动化测试中 275
10.5 小结 276
第11章 执行验收测试的策略 277
11.1 验收测试该检测什么 277
11.1.1 抓住问题本质 278
11.1.2 避免波动频繁界面 278
11.1.3 在技术障碍最小的地方越过 279
11.2 实现方式 279
11.2.1 端到端 280
11.2.2 绕过UI进行测试 281
11.2.3 直接测试内部逻辑 284
11.2.4 替换无关组件 285
11.2.5 测试后门 286
11.3 技术相关考虑 287
11.3.1 库 287
11.3.2 无界面的分布式系统 288
11.3.3 控制台应用 289
11.3.4 GUI应用 290
11.3.5 Web应用 293
11.4 常见问题的处理技巧 295
11.4.1 加快测试执行速度 296
11.4.2 减少测试的复杂度 299
11.4.3 管理测试数据 300
11.5 小结 301
第12章 TDD应用 302
12.1 成功采用TDD的必要条件 302
12.1.1 理解本质 302
12.1.2 紧迫感 303
12.1.3 成就感 303
12.1.4 表现诚实 304
12.1.5 变革的时机 304
12.2 让其他人参与进来 305
12.2.1 引导变革的角色和能力 305
12.2.2 改变需要时间 307
12.3 如何应对阻力 307
12.3.1 识别阻力 307
12.3.2 应对阻力的三种常见方法 309
12.3.3 应对阻力的技巧 310
12.3.4 挑选战场 312
12.4 如何推进变革 313
12.4.1 造势 313
12.4.2 降低门槛 314
12.4.3 培训 315
12.4.4 共享及感染 316
12.4.5 指导和督促 317
12.4.6 通过分配角色让人们参与进来 318
12.4.7 打破稳定状态 319
12.4.8 迟后的奖励 319
12.5 小结 319
附录A JUnit 4简明教程 321
附录B JUnit 3.8简明教程 323
附录C EasyMock简明教程 325
附录D 通过Ant运行测试 327
相关资源 331