首页>参考读物>计算机科学与技术>综合

测试驱动的面向对象软件开发
作者 : (美)Steve Freeman; Nat Pryce著
译者 : 王海鹏 等译
出版日期 : 2010-07-06
ISBN : 978-7-111-30425-8
定价 : 45.00元
扩展资源下载
扩展信息
语种 : 简体中文
页数 : 268
开本 : 16
原书名 : Growing Object-Oriented Software,Guided by Tests
原出版社: Pearson Education Asia
属性分类: 店面
包含CD :
绝版 : 未绝版
图书简介

本书采用通俗易懂的比喻,众所周知的编程语言,短小精悍的工作实例,深入浅出的分析处理——仿佛在和几位世界级的编程高手一边喝茶,一边聊天,他们循序渐进地让读者在不知不觉中进入一个编程的最高境界。
  即使是刚刚入门的初学者,也会从中找到读书的乐趣,因为可以从一开始就找到开启面向对象开发的钥匙;随着经验的积累,编程水平的提高,再来看这本书,又会体会到更深层的编程哲学,然后用不同的视角重新审视您的程序。
  本书是编程爱好者的启蒙指南,更是作为系统分析人员、测试人员、程序设计人员、软件开发人员以及面向对象程序研究人员等专业人士革新编程思想的必备手册。

图书特色

测试驱动的面向对象软件开发
Growing Object-Oriented Software, Guided by Tests
(美)Steve Freeman
Nat Pryce 著  王海鹏 等译

● 旧代码带来的新思维
● Robert C. Martin高度评价
● Kent Berk作序推荐

“终于有一本书用丰富的代码揭示TDD和OOD之间的共生关系。本书值得保存。”
——Robert C. Martin
“如果您想成为当前TDD领域的一名专家,就需要理解本书中的思想。”
——Michael Feathers

对于更快交付更好的软件,测试驱动开发(TDD)现在是一种已经确立的技术。TDD基于一个简单的思想:在写产品代码之前先写它的测试代码。但是,这个“简单”的思想需要一些技能和判断才能做得好。现在有了一本TDD实践指南,让您深入理解那些基本概念,并向您展示了如何让测试来引导开发,“培育”出一致的、可靠的、可维护的软件。
作者描述了他们使用的过程,努力实现的设计原则,以及完成工作的一些工具。通过一个详细实现的例子,您可以看到TDD如何在各个层次上工作,如何利用测试来驱动特征开发和代码的面向对象结构,如何利用模拟对象来发现并描述对象之间的关系。在这个过程中,本书系统地讨论了开发团队在使用TDD时遇到的挑战——从过程中集成TDD到测试最难的特征。

本书包括以下内容:
如何有效实现TDD:启动,然后在整个项目中保持你们的冲劲。
如何创建更干净的、更有表现力的、更可维护的代码。
如何利用测试,对可持续的品质保持最严格的关注。
理解在真实软件开发的环境中,TDD、模拟对象、面向对象设计如何交织在一起。
如何利用模拟对象来指导面向对象设计。
如何在TDD困难的地方取得成功:管理复杂的测试数据,测试持久层和并发。


作者简介
Steve Freeman和Nat Pryce 是英国的敏捷软件开发先驱。他们都曾在一些行业和组织机构中工作过,例如电信业系统开发、金融业、体育新闻报道、市场传播、IBM的零售版软件开发、工业和学术研究机构等。他们是伦敦XpDay的创始人和组织者,并且是几个有影响的支持TDD的开源项目的贡献者。在2006年,他们共同获得了敏捷联盟的Gordon Pask奖。

图书前言

这本书是讲什么的
  这是一本实践指南,介绍了我们发现的编写面向对象软件的最好方式:测试驱动开发(testdriven development,TDD)。它描述了我们遵循的过程、追求的设计原则,以及使用的工具。它以我们数十年的经验为基础。在这些年里,我们与世界上一些最好的程序员共事,向他们学习。
  本书讨论了一些问题与困惑,它们是我们在一个个项目中所见到的。如何将测试驱动开发应用到软件项目中?我从哪里开始?为什么我应该既编写单元测试,又编写用户场景测试?测试“驱动”开发是什么意思?如何测试某个难弄的特征?
  本书同时也着重讨论了设计,以及设计方式对TDD方式所产生的影响。如果说我们从中学到了什么,那就是测试驱动开发作为一个整体时,效果最好。我们曾看到过一些团队虽然采用了一些基本实践(编写并运行测试),但他们仍不得要领,因为他们并没有采用背后更深层次的过程。
为什么“培育”面向对象软件
  本书使用“培育”(Growing)这个词是因为它让人们感觉到开发是增量式的。我们在任何时候都有可以工作的软件,确保代码总是尽可能地具备良好的结构,并经过全面的测试。任何事情都不比交付可以工作的系统更有效。正如John Gall在[Gall03]中所写的,“能工作的复杂系统总是从能工作的简单系统演进而来的。”
   “培育”也暗示了一个在好的软件中发现的生物学特点,即在每一层结构中一致的感觉。它将我们的方式与面向对象结合起来,正好与Alan Kay的观点一致,即对象像生物细胞一样彼此发送消息。
 Alan Kay是Smalltalk的创始人之一,发明了“面向对象”这一术语。
为什么要以测试为“指导”
  我们先写测试,因为我们发现这有助于写出更好的代码。先写一个测试迫使我们澄清自己的意图,只有无二义地描述了应该做什么以后,我们才会开始下一步的工作。先写测试的过程帮助我们发现设计是否太僵硬或没有关注要点。然后,当我们希望继续下一步工作并修复设计缺陷时,测试可以提供回归覆盖测试构成的安全网。
  本书使用“指导”(Guided)这个词,是因为此项技巧仍然需要使用者的技能和经验。我们发现测试驱动开发是一种有效的设计支持工具——只要我们学会如何增量式地开发并“聆听测试”。像其他正规的设计活动一样,TDD需要理解和持续的努力才有效。
  我们曾发现一些团队同时编写测试和代码(甚至有一些团队先写测试),他们的代码仍然一团糟,测试只是增加了维护的成本。他们已经起步,但还没有明白这种技巧是要让测试来指导开发。利用测试的内容,将关注点放在取得进展上,并利用测试的反馈来提升系统的品质。
什么是模拟对象
  编写本书最初的动机是完整解释使用模拟对象(Mock Object)的技术,我们看到这种技术常被人误解。随着写作的深入才意识到,我们社区对模拟对象的发现和使用实际上体现了我们写软件的方式。这是大局观的一部分。
  模拟对象是一些替代的实现,目的是测试对象如何与相关的对象进行交互。

  本书将利用jMock库来展示模拟对象是如何工作的。更具体地说,我们将展示模拟对象应该用于TDD过程的什么位置,以及它在面向对象开发的环境中具有怎样的意义。
这本书为谁而写
  这本书是为“有一定知识的读者”而写的。它的目标读者是具有专业经验的开发者,他们至少曾看过测试驱动开发。在编写时,我们假设是向一些以前未接触过这些技术的同事进行解释。
  为了留出篇幅以介绍更深入的内容,我们假定读者具备有关基本概念和工具的一些知识。别的一些书对TDD进行了很好的介绍。
这是一本Java书吗
  本书从头到尾使用Java语言,因为它非常普及,我们希望读者至少能理解这些例子。也就是说,本书实际上是在介绍任何面向对象环境都适用的一组技巧。
  如果您目前不用Java,在许多其他语言中也有与我们使用的测试和模拟库(JUnit和jMock)等价的类库。这些语言包括C#、Ruby、Python、Smalltalk、ObjectiveC,以及(令人印象深刻的) C++。甚至还有更少见的语言的版本,如Scala。在Java中,也有其他的测试框架和模拟框架。
为什么您要听信我们
  本书汇集了我们几十年的经验,包括近十年的测试驱动开发。在这段时间里,我们在各种项目中使用TDD。这些项目包括:面向消息的大型企业集成系统(具有交互式Web前端和多处理器计算网格后端)、微型嵌入式系统(必须运行在几十KB的内存中)、用作关键业务系统广告的免费游戏、后端中间件和网络服务(支持高度交互的图形桌面应用)。而且,我们为世界各地的会议和公司讲授这些内容。
  我们也从同事的经验中获益,他们来自伦敦的TDD社区。我们花了不少工作时间和业余时间让思想接受挑战和磨炼。我们很感谢能有机会与这样活跃的(善于争论的)同事一起工作。
本书有些什么内容
  这本书有五个部分:
  第一部分“简介”,是在软件开发项目背景下,对测试驱动开发、模拟对象和面向对象设计的高层次的介绍。同时也介绍了本书其他部分中用到的一些测试框架。即使您已经熟悉TDD,仍然建议您通读第1章和第2章,因为它们描述我们进行软件开发的方法。如果您熟悉JUnit和jMock,您也许愿意跳过简介的其他部分。
  第二部分“测试驱动开发过程”,描述了TDD过程,展示了如何开始开发,并让开发进行下去。我们深入探讨了测试驱动开发和面向对象编程之间的关系,说明了这两种技术的原理是如何相互支持的。最后,我们讨论了如何处理外部代码。这一部分介绍了概念,下一部分将这些概念投入实战。
  第三部分“工作的例子”,是一个扩展的例子,让您初步体验一下以测试驱动的方式来开发面向对象应用。在整个过程中,我们讨论了一些折中和做决定的动机。这个例子相当长,因为我们希望说明TDD的某些特征是怎样随着代码规模的扩大变得更为重要的。
  第四部分“可持续的测试驱动开发”,描述了一些保持系统可维护的实践。我们现在非常注意保持代码整洁和富有表现力,因为这些年来,我们已经了解了代码变差的代价。这部分描述我们采用的一些实践,并解释了为什么这么做。
  第五部分“高级主题”,探讨了TDD更难的一些方面:复杂的测试数据、持久性和并发性。我们展示了处理这些问题的方法,并讨论了这对代码的设计和测试所产生的影响。
  最后,附录包含了关于jMock和Hamcrest的一些支持材料。
本书不包含什么内容
  这是一本技术书籍。我们不讨论使项目成功的其他主题,如团队组织、需求管理和产品设计。采用增量式的、测试驱动的方法来开发显然与项目运作的方式有着密切的关系。TDD支持一些新的活动,例如频繁交付;它也会被一些组织环境破坏,例如早期设计冻结或利益相关人之间缺乏沟通。同样,有许多其他书籍讨论这些主题。

上架指导

计算机\软件工程

封底文字

“本书的作者领导了编程手艺的一场革命,他们控制了软件培育的环境。”
—Ward Cunningham

“终于有一本书用丰富的代码揭示了TDD和OOD之间的共生关系。这本书值得保存。”
—Robert C. Martin

“如果您想成为当前TDD领域的一名专家,就需要理解这本书中的思想。”
—Michael Feathers

对于更快交付更好的软件,测试驱动开发(TDD)现在是一种已经确立的技术。TDD基于一个简单的思想:在写产品代码之前先写它的测试代码。但是,这个“简单的”思想需要一些技能和判断才能做得好。现在有了一本TDD实践指南,让您深入那些基本概念。两位TDD的先锋拥有10年的真实世界系统开发经验,向您展示了如何让测试来引导开发,“培育”出一致的、可靠的、可维护的软件。

Steve Freeman和Nat Pryce 描述了他们使用的过程,他们努力实现的设计原则,以及帮助他们完成工作的一些工具。通过一个详细实现的例子,您可以看到TDD如何在各个层次上工作,如何利用测试来驱动特征开发和代码的面向对象结构,如何利用模拟对象来发现并描述对象之间的关系。在这个过程中,本书系统地讨论了开发团队在使用TDD时遇到的挑战—从在您的过程中集成TDD到测试最难的特征。内容包括:
l 有效实现TDD:启动,然后在整个项目中保持你们的冲劲。
l 创建干净的、更有表现力的、更可维护的代码。
l 利用测试,对可持续的品质保持最严格的关注。
l 理解TDD、模拟对象、面向对象设计如何在真实软件开发的环境中交织在一起。
l 利用模拟对象来指导面向对象设计。
l 在TDD困难的地方取得成功:管理复杂的测试数据,测试持久层和并发。

作者简介

(美)Steve Freeman; Nat Pryce著:Steve Freeman和Nat Pryce是独立的软件顾问,他们是英国的敏捷软件开发先锋。他们都曾在一些行业和组织机构中工作过:电信业系统开发、金融业、体育新闻报道和市场传播、IBM的薄膜包装应用、工业和学术研究机构等。他们是伦敦XpDay的创始人和组织者,经常出席和组织国际会议。Steve和Nat是几个有影响的开源项目的贡献者,这些项目支持TDD。在2006年,他们共同获得了敏捷联盟的Gordon Pask奖。他们住在英国伦敦。

译者简介

王海鹏 等译:暂无简介

译者序

这是一本关于利用模拟对象进行测试的书。类因职责而存在,对象根据契约与它的协作者进行交互。用模拟对象进行测试的要点就是检查对象之间的契约。这些契约要明确无误,没有二义性,所以用模拟对象进行测试对类的设计有着很高的要求。
  这是一本关于测试与面向对象设计如何相互影响的书。易测试的设计就是好设计,难测试的设计是不好的设计,测试成本高的设计是昂贵的设计,无法测试的设计是不可行的设计。当我们用心聆听测试代码的反馈,它就会告诉你产品代码的功能正确性、运行效率、可靠性、API的易用性、可维护性、可移植性和可伸缩性。
  这是一本关于增量式软件开发的书。我们在写程序的过程中学习,而不是学习如何写程序。软件开发者与领域专家的合作是一个学习的过程。软件一开始可能只有一个特征、一些模糊的概念,然后逐渐发展出许许多多更清晰的特征和概念,并且在使用过程中会不断发展。在我看来,增量式的开发是唯一的软件开发方式。
  这本书的目的在于,它告诉我们如何进行增量式的软件开发。爱因斯坦说,例子不是一种教学方式,而是唯一的教学方式。书中提供的拍卖狙击者的例子,提供了在真实世界软件开发者所需要的细节,一个特征接一个特征地教读者利用面向对象的思想,增量式地开发灵活的、面向对象的程序。
  过程为我们带来乐趣,成就只是副产品。开发的过程是否有趣?是否像打怪升级的游戏一样?每一个已实现的特征就是被你杀死的怪,你不希望被杀死的怪经常复活,向你寻仇。不好的程序是地狱,因为那里面经常复活的怪太多。这本书教我们写下清晰的特征列表,然后用验收测试来确保这些特征的实现。
  本书给我最大的感悟是:如果软件是孩子,程序员就是家长,需要用心血去培育。如果软件是诗歌,程序员就是炼字师,可以用编程语言来准确反映自己的思想。值得去写的程序,就值得写好。我们应该做得更好,也可以做得更好。
  “知之不如好之,好之不如乐之。”对于软件开发,作者有一种乐此不疲的态度。编程是一门艺术,在追求艺术的道路上,没有止境。
  本书改变了我对代码(尤其是对测试代码)的看法。像所有好书一样,它可以改变人们对事物的看法。开卷有益,因此,我郑重地向大家推荐它。
  除封面署名外,参加本书翻译工作的人员还有:王海燕、李国安、周建鸣、范俊、张海洲、谢伟奇、林冀、钱立强、甘莉萍。

王海鹏
庚寅年初春于上海

图书目录

对本书的赞誉
译者序

前言
作者简介
致谢
第一部分简介
第1章测试驱动开发的要点
11软件开发是一个学习过程
12反馈是基本工具
13支持变化的实践
14测试驱动开发简介
15大局
16用户场景测试
17测试的级别
18外部品质与内部品质
第2章测试驱动开发与对象
21对象之网
22值与对象
23对象通信
24吩咐,不要问
25但有时要问
26对协作的对象执行单元测试
27用模拟对象支持TDD
第3章工具介绍
31如果您已了解这些框架,可以跳过本章
32JUnit 4简介
321测试用例
322断言
323预期异常
324测试装置
325测试执行者
33Hamcrest匹配器和assertThat()
34jMock2: 模拟对象
第二部分测试驱动开发过程
第4章启动测试驱动循环
41简介
42先测试一个可行走的骨架
43决定行走的骨架的形状
44创建反馈源
45尽早暴露不确定性
第5章保持测试驱动循环
51简介
52每个特征都从一个验收测试开始
53分离测量进度的测试和捕捉回归
错误的测试
54从最简单的成功场景开始测试
55编写您愿意读的测试
56看着测试失败
57从输入开发到输出开发
58针对行为进行单元测试,而非针对
方法
59聆听测试
510调整循环
第6章面向对象风格
61简介
62为可维护性而设计
63内部与同级的比较
64没有“与”、“或”、“但是”
65对象同级构造型
66组合比它的部分之和更简单
67上下文无关性
68正确地隐藏信息
69固执己见的观点
第7章实现面向对象设计
71先写测试怎样有助于设计
72通信比分类更重要
73值类型
74对象来自何处
741分解
742萌芽
743打包
75利用接口确定关系
76接口也要重构
77组合对象以描述系统行为
78迈向更高层的编程
79关于类
第8章基于第三方代码构建
81简介
82只模拟您拥有的类型
821不要模拟您不能修改的类型
822编写一个适配层
83在集成测试中模拟应用对象
第三部分工作的例子
第9章委托开发一个拍卖狙击者
91从头开始
92与一次拍卖通信
921拍卖协议
922XMPP消息
93安全实现目标
94这不是真的
第10章可行走的骨架
101从壁橱中取出骨架
102我们的第一个测试
103一些初始选择
1031用户场景测试
1032准备开始
第11章通过第一个测试
111构建测试的装配
1111应用执行者
1112伪造的拍卖
1113消息代理
112测试失败和通过
1121第一个用户界面
1122显示狙击者状态
1123连接到拍卖
1124从拍卖接收回应
113必需的最小实现
第12章准备竞拍
121对市场的介绍
122针对竞拍的测试
1221从测试开始
1222扩展伪造的拍卖
1223令人吃惊的失败
1224由外至内开发
1225对细节的无限关注
123AuctionMessageTranslator类
1231提取出一个新类
1232第一个单元测试
1233完成用户界面循环
1234我们实现了什么
124解析价格消息
1241引入消息事件类型
1242第二个测试
1243发现进一步的工作
125完成工作
第13章狙击者发出竞拍出价
131引入AuctionSniper
1311一个新类及其依赖关系
1312关注、关注、关注
132发送竞拍出价
1321Auction接口
1322AuctionSniper发出竞拍出价
1323利用AuctionSniper成功竞拍
1324用户场景测试通过了
133整理实现
1331提取出XMPPAuction
1332提取用户界面
1333整理翻译者类
134延迟决定
135自然发生的设计
第14章狙击者赢得拍卖
141先写一个失败的测试
142谁知道竞拍者
143狙击者还有话要说
144狙击者需要某种状态
145狙击者获胜
146取得稳定的进展
第15章迈向真正的用户界面
151更现实的实现
1511接下来我们该做什么
1512替换JLabel
1513还是很丑
152显示价格细节
1521先写一个失败的测试
1522狙击者送出状态
1523展现竞拍狙击者
153简化狙击者事件
1531跟着感觉走
1532重新确定sniperBidding()的目标
1533填入数字
154更进一步
1541转换胜利和失败
1542修整表模型
1543面向对象的列
1544缩短事件路径
155最后润色
1551针对列标题的测试
1552实现TableModel
1553目前已足够
156短评
1561单一职责
1562软件微创手术
1563程序员过敏症
1564庆贺思维转变
1565这不是唯一的解决方案
第16章狙击多项物品
161针对多项物品的测试
1611两件物品的故事
1612ApplicationRunner类
1613偏离主题,改进失败信息
1614重新设计Main的结构
1615扩展表模型
162通过用户界面添加物品
1621更简单的设计
1622更新测试
1623添加一个动作条
1624设计时刻
1625另一层次的测试
1626实现UserRequestListener
163短评
1631取得稳定的进展
1632TDD的秘密
1633发布它
第17章分解Main
171发现角色
172提取Chat
1721分离Chat
1722封装Chat
1723编写一个新测试
173提取Connection
174提取出SnipersTableModel
1741狙击启动者类SniperLauncher
1742狙击组合
175短评
1751增量式架构
1752三点不动
1753动态设计的同时也进行静态设计
1754对notToBeGCd的另一种修复方法
第18章填充细节
181更有用的应用
182适可而止
1821引入落后状态
1822第一个失败的测试
1823输入停止价格
1824传送停止价格
1825约束AuctionSniper
183短评
1831增量式设计用户界面
1832其他建模技术也有用
1833领域类型比字符串好
第19章处理失败
191如果它不能工作
192检测失败
193显示失败
194断开狙击者
195记录失败
1951填充测试
1952翻译者中的失败报告
1953生成日志消息
1954完成这次开发循环
196短评
1961 “切香肠的逆过程”式开发
1962用一些小方法来表达意图
1963日志也是一项功能
第四部分可持续的测试驱动开发
第20章聆听测试
201简介
202我需要模拟一个不能替换的对象
2021单例是依赖关系
2022从过程到对象
2023隐式依赖也是依赖
203记日志是一项功能
2031通知而不是记日志
2032但这种想法很疯狂
204模拟具体的类
205不要模拟值类型
206膨胀的构造方法
207令人困惑的对象
208太多依赖关系
209太多预期
2010测试会告诉我们什么
第21章测试可读性
211简介
212测试名称描述功能
213规范的测试结构
214精简测试代码
2141用结构来解释
2142利用结构来共享
2143强调正面
2144代理给从属对象
215断言和预期
216具体值和变量
第22章构造复杂的测试数据
221简介
222测试数据建造者
223创建一些类似的对象
224组合建造者
225利用工厂方法强调领域模型
226从使用的角度消除重复
2261首先,消除重复
2262然后,让游戏升级
227沟通第一
第23章测试诊断
231要的就是失败
232小、专注、良好命名的测试
233解释性断言消息
234利用匹配器对象来突出细节
235自描述的值
236明显的预装值
237跟踪者对象
238明确断言预期得到满足
239诊断是一级功能
第24章测试的灵活性
241简介
242针对信息测试,而非针对表示方法
243准确断言
244准确预期
2441准确的参数匹配
2442允许和预期
2443忽略不相关的对象
2444调用次序
2445jMock States的威力
2446更为自由的预期
245“豚鼠”对象
第五部分高 级 主 题
第25章测试持久性
251简介
252隔离影响持久状态的那些测试
253明确测试的事务边界
254测试一个执行持久操作的对象
255测试对象能够持久
2551来回转换持久对象
2552来回转换相关的实体
256但数据库测试很慢
第26章单元测试与线程
261简介
262分离功能和并发策略
2621并发地搜索拍卖
2622引入Executor
2623实现AuctionSearch
263对同步进行单元测试
2631针对AuctionSearch的压力测试
2632两次修复竞争条件
264对被动对象进行压力测试
265同步测试线程和后台的多线程
266单元压力测试的局限性
第27章测试异步代码
271简介
272取样或监听
273两种实现
2731捕获通知
2732轮询变更
2733超时
2734改进探测类
274轻易成功的测试
275错过更新
276测试没有效果的活动
277区分同步和断言
278事件源外部化
后记模拟对象简史
附录AjMock2速查手册
附录B编写Hamcrest Matcher
参考文献

教学资源推荐
作者: 王立柱 编著
作者: (英) W. Bolton 著
参考读物推荐
作者: (美)Michael A.Davis;Sean M. Bodmer;Aaron LeMasters 著
作者: 华诚科技 编著 华诚文化 编著
作者: 王红卫 聂阳 杨猛 编著