测试驱动开发

所需积分/C币:16 2013-01-24 16:22:46 11.75MB PDF
收藏 收藏
举报

测试驱动开发,一种领先的软件开发方法!
Test-Driven Development: By Example (IsBn 0-321-14653-0) Kent beck Copyright @2003 Pearson Education, Inc Original English Language Edition Published by Pearson Education, Inc All rights reserved Translation edition published by PEARSoN EDUCATION ASIA LTD and CHINA ELECTRIC POWER PRESS Copyright C 2004 测试驱动开 首先编写用于定 本书翻译版由 Pearson Education授权中国电力岀版社在中国境内(香港、澳门特别行政区和台湾地区除外) 独家出版、发行 动开发要求测试 末经出版者书面许可,不得以任何方式复制或抄袭本书的任何部分 性的开发方法,自 测试驱动开 本书封面贴有 Pearson Education防伪标签,无标签者不得销售。 和建模,TDD都 北京市版权局著作权合同登记号图字:01-2003-1015号 对代码进行重构的 For sale and distribution in the Peoples Republic of China exclusively(excluding Taiwan, Hong Kong SAR and 行为,那么怎么能 Macao SAR) 仅限于中华人民共和国境内(不包括中国香港、澳门特别行政区和中因台湾地区)销售发行。 套可以立刻把这利 测试驱动开发 图书在版编日(CIP)数据 熟练掌握测试驱动 测试驱动开发/(美)贝克著:孙平平等译.一北京:中国电力出版社,2004 发也能让你从中获 (大师签名系列) 是清晰和bug-fre ISBN75083-2173-1 详尽的自动化测试 I测.Ⅱ①贝.⑨②孙.软件开发Ⅳ.TP3.52 中国版本图书馆CP数据核字(2004)第012798号 要对产品代码进行 的。 本书的作者 从书名:大师签名系列 件开发人员、项目 书名:测试驱动开发 中的同伴,耐心 编著:(美) Kent beck 者在翻译过程中廿 翻译:孙平平等 敢有丝毫懈怠,大 技术审校:崔凯 忽造成译文不妥白 责任编辑:夏平 本书前11章 出版发行:中国电力出版社 地址:北京市三里河路6号邮政编码:100044 26章由赵辉、唐 电话:(O10)88515918 传真:(010)88518169 果本书能够对你 印刷:北京丰源印刷厂 开本:787×1092116 印张:115 字数:252千字 书号:ISBN75083-2173-1 版次:2004年3月北京第1版2004年5月第2次印刷 定价:2800元 版权所有翻印必究 译者序 TRIC POWER PRESS, 测试驱动开发(TDD)以测试作为开发过程的中心,它要求在编写任何产品代码之前, 首先编写用于定义产品代码行为的测试,而编写的产品代码又要以使测试通过为目标。测试驱 政区和台湾地区除外) 动开发要求测试可以完全自动化地运行,在对代码进行重构前后必须运行测试。这是一种革命 性的开发方法,能够造就简单、清晰、高质量的代码 测试驱动开发是一种我们编程时使用的技术。无论我们在开始编程之前进行了怎样的设计 和建模,TDD都有助于我们提高代码质量。测试驱动开发可以赋予你对代码质量的自信以及 对代码进行重构的勇气。试想如果没有办法保证我们对可运行代码的修改不会破坏任何先前的 an, Hong Kong SAR and 行为,那么怎么能够对代码进行修改?如果对代码的重构或修改无意中引入了bug但却没有 售发行。 套可以立刻把这种情况告诉你的测试集,那么怎么能够进行集成 测试驱动开发是一种在极限编程(XP)中处于核心地位的技术。要想采用极限编程过程, 熟练掌握测试驱动开发将会有莫大的帮助。即便你选用的软件开发过程不是XP,测试驱动开 发也能让你从中获益。采用测试驱动开发,我们将会得到简单、清晰的设计,我们的代码也将 是清晰和 bug-freef的。同时采用测试驱动开发的结果就是可以让我们拥有一套伴随产品代码的 详尽的自动化测试集。将来无论出于什么原因(新的需求,变化了的需求,性能调整等等)需 要对产品代码进行维护时,在这套测试集的辅助(驱动)下工作,我们的代码将会一直是健壮 本书的作者是极限编程过程的缔造者,一线软件开发人员,其有关XP的书籍深受广大软 件开发人员、项目经理的喜爱。木书语言朴实、诙诺,就像是结对编程( Pair Programming) 中的同伴,耐心地传授自己的心得,实在是一本不可多得的讲述测试驱动开发的经典图书。译 者在翻译过程中也是获益匪浅。由于作者在叙述过程中大量使用了俚语和俗语,所以译者也不 敢有丝毫懈怠,力求在翻译过程中忠实反映作者的原意。但由于时间紧张,其中肯定还有因疏 忽造成译文不妥的地方,恳请读者批评指正。 本书前11章由孙平平、张国强翻译,第12章~第19章由张小龙、张佳宁翻译,第20章~第 26章由赵辉、唐晋涛翻译,最后6章由李恒、杨先炬翻译,全书由张伟统稿,由崔觊审校。如 果木书能够对你有所帮助,那将是我们最大的心愿。 252千字 译者 前言 代码整洁可用( clean code that works), Ron jeffries这句言筒意赅的话,正是测试驱动开 发( Test-Driven Development,TDD)所追求的目标。代码整洁可用之所以是一个值得追求的 目标,是基于以下的一系列原因 它是一个可预测的开发方法。你知道什么时候可以完工,而不用去担心是否会长期被 bug困扰。 它给你一个全面正确地认识和利用代码的机会。如果你总是草率地利用你最先想到的 方法,那么你可能再也没有时间去思考另一种更好的方法。 它改善了你的软件用户的生活。 ·它让软件开发小组成员之间相互信赖。 这样的代码写起来感觉很好。 但是我们要怎样做才能使代码整洁可用呢?很多因素妨碍我们得到整洁的代码,甚至是可 用的代码。无需为此征求很多的意见,我们只需用自动运行的测试来推动开发,这是一种被称 为测试驱动开发(TDD)的开发方式。在测试驱动开发中,我们要这样做: 只有自动测试失败时,我们才重写代码 消除重复设计,优化设计结构 这是两条很简单的规则,但是由此产生了复杂的个人和小组行为规范,技术上的含意是: 我们必须通过运行代码所提供的反馈来做决定,并以此达到有机设计的目的。 ·我们必须自己写测试程序,这是因为测试很多,很频繁,我们不能每天把大量的时间 浪费在等待他人写测试程序上。 我们的开发环境必须能迅速响应哪怕是很小的变化 ·为使测试简单,我们的整个规划必须是由许多高内聚、低耦合的部分组成 这两条规则实际上蕴含了开发过程中所经历的阶段: (1)不可运行—写一个不能工作的测试程序,一开始这个测试程序甚至不能编译 (2)可运行—尽快让这个测试程序工作,为此可以在程序中使用一些不合情理的方法 (3)重构—消除在让测试程序工作的过程中产生的重复设计,优化设计结构 不可运行/可运行/重构一这就是测试驱动开发的口号。 现在假设这样的开发方式是可能的,那么,再进一步,显著地减少代码的错误密度( defect density),让所有参与某一工作的开发人员对工作主题足够明了的假定也将成为可能。如果是 这样的话,那么只有测试失败时才需要重写代码,其社会意义是 ·如果代码的错误密度能够充分地减少,那么软件的质量保证(QA)工作可以由被动 保证软件质量转变为主动保证软件质量 如果开发过程中令人不快的意外能够充分地减少,那么项目经理能对软件开发进度有 下一个,就这样 一个精确的把握,以便让实际用户参与日常开发。 该越小。 如果每次技术讨论的主题都足够明确,那么软件工程师之间的合作是以分钟计算的, 看过我写的 而不是按每天或每周计算。 (XP)与讲测试 再者,如果代码错误密度能够充分地减少,那么我们每天都可以得到有新功能的软件 极限编程时我会 成品,并以此招揽新的用户群。 些。测试驱动开 如此说来,观念是很简单的,但我的动机是什么呢?为什么一个软件工程师要做额外的写 个差距大小的技 自动测试程序的工作?为什么一个设计观念可以瞬息万变的软件工程师却只能一小步一小步 试驱动开发? 地进行工作?我们需要的是勇气。 意识地控制了这 绝大多数学 Infected)是Ri 勇气 易了,并且相对老 发的软件工程师 测试驱动开发是一种可以在开发过程中控制忧虑感的开发方法。我并非指那些毫无意义的 方法不能奏效的 没有必要的担忧—( pow widdle prwogwammew needs a pacifiew)—而是指合理的担忧, 当然也存在 担忧是否合理是个很困难的问题,不能从一开始就看出来。如果说疼痛自然就会叫“停!” 个例子来说,软件 那么担忧自然就会说“小心!”。小心谨慎是好的,但它也会产生以下一系列负面影响: 软件是否达到了 让你一直处于试验性的阶段。 同时也依赖于人 让你不愿意与他人交流。 再现的 让你羞于面对反馈。 旦读完本 让你变得脾气暴躁。 从简单 这些负面影响对编程都是有害无益的,尤其是当需要编程解决的问题比较困难的时候。所 写自动 以问题变为当我们面临一个比较困难的局面的时候,如何才能做到: 重构,4 尽快开始具体的学习,而不是一直处于试验性的阶段。 这本书是由 更多地参与交流和沟通,而不是一直拒不开口 第一部 寻找那些有益的、建设性的反馈,而不是尽量避免反馈。 模型的 〔依靠自己改掉坏脾气。 多币种 设想把编程看成是转动曲柄从井里提一桶水上来的过程。如果水桶比较小,那么仅需一个 最终发 能自由转动的曲柄就可以了。如果水桶比较大而且装满了水,那么还没等水桶被提上来你就会 第二部 很累了。你需要一个防倒转的装置,以保证每转一次可以休息一会儿。水桶越重,防倒转的棘 包含反 齿相距就应该越近。 子同时 测试驱动开发中的测试程序就是防倒转装置上的棘齿。一旦我们的某个测试程序能工作 个例子 了,我们就知道,它从现在开始并且以后永远都可以工作了。相对于测试程序没有通过,我们 算机专 距离让所有的测试程序都工作又近了一步。现在我们的工作是让下一个测试程序工作,然后再 第三壽 ①这句话模仿了卡通人物 Elmer fudd的发音,意思是“ poor little programmer needs a pacifier(可怜的小程序员需要安 慰 译者注 ②本书影印版《解 能对软件开发进度有 下一个,就这样一直进行下去。分析表明,编程解决的问题越难,每次测试所覆盖的范围就应 该越小。 会作是以分钟计算的, 看过我写的《 Extreme Programming Explained》"一书的读者可能会注意到我讲极限编程 (XP)与讲测试驱动开发的语气是有区别的:讲测试驱动开发不像讲极限编程那么绝对。讲 、得到有新功能的软件 极限编程时我会说“这些是想进一步学习所必须具备的基础”,而讲测试驱动开发时要模糊 些。测试驱动开发教你认识编程过程中的反馈与欲实现的构思之间的差距,并且提供了控制这 工程师要做额外的写 个差距大小的技术。“如果我在纸上作了一周的规划,然后通过测试驱动编码,这是否就是测 却只能一小步一小步 试驱动开发?”当然,这就是测试驱动开发。你知道欲实现的构思与反馈之间的差距,并且有 意识地控制了这个差距。 绝大多数学习测试驱动开发的人发现他们的编程习惯被永久地改变了。“测试感染”(Test Infected)是 Erich Gamma所杜撰的用以描述这种转变的词语。你可能发现写测试程序变得容 易了,并且相对较小的工作节奏比以前所梦想的节奏更明智。另一方面,一些学习测试驱动开 发的软件工程师重新回到了以前的程序开发方法,并且保留测试驱动开发方法作为当其他开发 非指那些毫无意义的 方法不能奏效的特殊情况下的秘密武器 —而是指合理的担忧, 当然也存在一些编程任务不能仅仅(或者根本就不能)由测试程序来驱动开发的情况。举 自然就会叫“停!”, 个例子来说,软件的安全性和并行性,测试驱动开发方法就不能充分地从机械证明的角度说明 系列负面影响 软件是否达到了这两个目标。软件安全性从本质上来说依赖于无缺陷的代码。确实如此,但它 同时也依赖于人们对软件安全机制的判断。精妙的并行问题不是仅靠再次运行代码就能可靠地 再现的。 日读完本书,你要准备 从简单的例子开始。 题比较困难的时候。所 写自动测试程序。 ·重构,每次增加一个新的设计构思 这木书是由三个部分组成的 第一部分,资金实例( The Money Example) 个典型的完全由测试驱动的代码 模型的例子。这个例子是几年前我从 Ward Cunningham那儿得到的,并且自从引入 多币种算法以来已经多次用到过。你将从中学会如何在写代码之前写好测试程序,并 比较小,那么仅需一个 最终发展成为一个有机的规划方案 等水桶被提上来你就会 第二部分, XUnit实例( The x Unit Example) 个逻辑上更复杂的程序的例子, 水桶越重,防倒转的棘 包含反射( reflection)和异常( exception),通过建立自动测试框架来测试。这个例 子同时也将向你介绍作为许多面向程序员的测试工具灵魂的 XUnit结构体系。在第 的某个测试程序能工作 个例子中你将学会以甚至比第一个例子更小的开发步骤工作,同时也包括深受许多计 试程序没有通过,我们 算机专家喜爱的呼喊式的自我提醒(self- referential hoo-ha) 测试程序工作,然后再 第三部分,测试驱动开发模式( Patterns for Test-Driven Development)—包括决定 fier(可怜的小程序员需要安 ②本书影印版《解析极限编程》已由中国电力出版社引进出版。详情请访问:htp/www.infopower.com.cn。—译者注 写哪些测试的模式,如何用 XUnit写测试的模式和大量的设计模式精选以及例子中所 用到的重构。 我写了关于结对编程( pair programming)的例子。如果你习惯于在四处转一转之前先看 地图的话,你可以直接到第三部分去看那些模式,并将那些例子作为说明。如果你习惯于先到 四处转一转,然后再看地图以确定自己处于什么位置的话,试着通读例子,当你需要了解更多 感谢那些始终 关于某一技术问题的细节时,可以查阅后面所讲的模式,并将这些模式作为参考。本书的一些 没有他们的帮助, 技术评审人指出,当他们启动编程环境,输入代码,运行所读到的测试程序时,最大的收获却 是: Steve freeman, 在这些例子之外。 Newkirk, Johannes li 关于这些例子要注意一点。这两个例子,多币种计算和测试框架,看上去很简单。而解决 Simon Crase, Kay Per 同一个问题却也存在(我曾经见到过)一些复杂、风格很差、近乎弱智的解决方案。我本可以 John Carter, Phlip, 从这些复杂、风格很差、近乎弱智的解决方案中釆用一个以使本书有一种“真实”感。然而, Mark van Hamersveld 我的目标是写出整洁可用的代码,希望你的目标也是这样。在以那些被认为很简单的例子开始 Sampson, Mike Clark 之前,花15秒的时间设想一下,如果所有的代码都能如此清晰和直接,没有复杂的解决方案, Darach Ennis, Kyle c 只有显然需要认真思考的很复杂的问题,那么这个世界会是什么样子。测试驱动开发可以引导 Erk Meade, dan rs 你这样去认真思考。 Levi Purvis, Rick me Kaoru Hosokawa, Pa 所有曾与我并 听起来近乎疯狂的 此,我不想冒犯所有 以及最后一位(重要 我从他们那里学到 我要感谢Mart 世界上报酬最高的 这样的待遇)。 我的程序员生 地同他进行合作有 带去安慰感和亲切 序时有过。如果两 认为这本书中所有 如果在此评说 性的话,那么多少 没有的纸张一样平 在近两个月的时间 感谢 Mike he 最后,感谢在 输入计算相应的输 式精选以及例子中所 四处转一转之前先看 致谢 如果你习惯于先到 ,当你需要了解更多 感谢那些始终对我提出严厉批评的审阅者。尽管本书所有的内容都是我一人所写,但如果 为参考。本书的一些 没有他们的帮助,本书的可读性以及可用性均要大打折扣。按照我键入名字的顺序,他们分别 序时,最大的收获却 BE: Steve Freeman, Frank Westphal, Ron Jeffries, Dierk Konig, Edward Hieatt, Tammo Freese, Jim Newkirk, Johannes Link, Manfred Lange, Steve hayes, Alan Francis, Jonathan Rasmusson, Shane Clauson 上去很简单。而解决 Simon Crase, Kay Pentecost, Murray Bishop, Ryan King, Bill Wake, Edmund Schweppe, Kevin Lawrence 解决方案。我本可以 John Carter, Phlip, Peter Hansen, Ben Schroeder, Alex Chaffee, Peter van Rooijen, Rick Kawala “真实”感。然而, Mark van Hamersveld, Doug Swartz, Laurent Bossavit, Ilja PreuB, Daniel Le Berre, Frank Carver, Justin 为很简单的例子开始 Sampson, Mike Clark, Christian Pekeler, Karl Scotland, Carl Manaster,J. B Rainsberger, Peter Lindberg 有复杂的解决方案, Darach Ennis, Kyle Cordes, Patrick Logan, Darren Hobbs, Aaron Sansone, Syver Enstad, Shinobu Kawai 试驱动开发可以引导 Erik Meade, Dan Rawsthome, Bill Rutiser, Eric Herman, Paul Chisholm, Asim Jalis, Ivan Moore Levi Purvis, Rick Mugridge, Anthony Adachi, Nigel Thome, John Bley, Kari Hoijarvi, Manuel Amago Kaoru Hosokawa, Pat Eyler, Ross Shaw, Sam Gentle, Jean Rajotte, Phillipe Antras Nl Jaime Nino 所有曾与我并肩一起进行测试驱动开发的人,我非常感激你们能够执著地研究这种早些年 听起来近乎疯狂的软件开发方法。我从你们那里所学到的要比我自己独自领悟到的多得多。在 此,我不想冒犯所有其他的人,不过 Massimo amoldi, Ralph beattie, Ron Jeffries, Martin Fowler 以及最后一位〈重要人物) Erich Gamma留在了我的记忆中,他们在驾御测试方面是最突出的, 我从他们那里学到了很多东西。 我要感谢 Martin Fowler,感谢他给予我在使用 FrameMaker上及时的帮助。他一定是这个 世界上报酬最高的排版顾问,但幸运的是,他没有向我收取费用(到目前为止只有我人受过 这样的待遇) 我的程序员生涯始于同我极富耐心的良师 Ward Cunningham的合作,并且我将一如既往 地同他进行合作有时候我把测试驱动开发看成是一种可以给在任何环境下工作的软件工程师 带去安慰感和亲切感的尝试。这种安慰感和亲切感我曾经在 Smalltalk环境下开发 Smalltalk程 序时有过。如果两个人心有灵犀,那么就没有办法指出某个想法到底首先出自哪个人。如果你 认为这本书中所有好的想法全是出自ward,那么也不见得就大错特错 如果在此评说当一个家庭成员呕心沥血将自己怪异的思想编撰成书时这个家庭付出的牺 牲的话,那么多少有点儿老调常弹了。这是因为写书过程中家庭所付出的牺牲就如同写书不能 没有的纸张一样平常。感谢只有等我写完一章才能吃到早饭的孩子们,特别是要感谢我的妻子, 在近两个月的时间里,凡事都再三提醒我,谨向他们致以最衷心的感谢。 感谢 Mike henderson温和的鼓励,感谢 Marcy barnes骑马救急 最后,感谢在我令人琢磨不透的12岁时读过的一本书的无名作者。书中建议根据实际的 输入计算相应的输出,然后开始编码直至实际结果与预期结果相一致。谢谢你们,谢谢,谢谢。 导言 个星期五的早晨,老板来找 Ward Cunningham,并把Ward介绍给 Peter认识。 Peter有 望成为公司开发的有价证券管理系统( WyCash)的用户。 Peter说:“贵公司这套系统的功能 给我留下了很深的印象,但是,我注意到这套系统仅能处理美元证券,我开设了一家新的证券 基金,我的发展战略要求能够处理不同币种的基金”。老板转问 Ward,“那么,你看我们能做 到这一点吗?” 这是任何软件设计者都可能遇到的噩梦般的一幕。你先前一直在一组假设条件下顺利而 愉快地进行开发。而突然间,一切都变了。这个噩梦并非只针对Ward一个人,公司的老板, 一个在指导软件开发方面经验丰富的老板,同样也不知道答案会是什么。 Wy Cash系统是公司一个规模不大的开发小组两年来辛勤工作的成果。这个系统可以处理 绝大部分美国市场上常见的各种各样的固定收益有价证券,还可以处理其他国家的一些新的投 资证券,例如保利投资证券,而这是其他同类产品所不能处理的 Wy Cash系统一直是采用对象和对象数据库来进行开发的。作为构成基础计算要素抽象的 Dollar(美元),一开始是外包给一组聪明的程序员来完成的,他们开发的对象合并了信息格 式化与计算两种功能。 在过去的六个月中,Ward和小组的其他人员开始将 Dollar对象的操作逐渐剥离出来。事 实证明, Smalltalk的数值类在计算方面工作得还是挺好的。用于四舍五入至三位十进制数字 的复杂代码实际上有碍于产生精确的结果。随着结果精确度的提高,测试框架中用于在一定误 差范围内进行比较的复杂机制由与预期或实际结果进行精确匹配的方法所取代。 用于完成信息格式化的操作实际上应由用户界面类来负责。由于测试代码,尤其是报告生 成架构部分的代码是在用户界面类一级编写的,所以这些测试程序无需修改就能适应这些改 动。在经过六个月的认真剥离之后, Dollar类所负责的操作已经所剩无几了。 系统中最复杂的算法之一,加权平均( weighted average),同样也经历了一个逐渐转变的 过程。曾经有段时间,加权平均算法代码的各种变种遍布整个系统。就像报告生成架构是由最 初众名的对象整合而来的一样,加权平均算法同样也会有一个容纳它的地方,这就是 AveragedColumn AveragedColumn现在就是Ward要着手工作的地方。如果加权平均能够支持多种货币,那么 系统剩下的部分就好办了。该算法的核心是将货币的数额保存在相应栏内。实际上,这个运算规 则已经被抽象得足以计算任何对象的加权平均。举个例子来说,它可以计算日期的加权平均 这个周末像往常样地过去了。星期一早晨老板又过来了,他问道:“怎么样,能做吗?” ①有关报告生成架构的更多信息,请参见c2com/ doc/oopsla?91html

...展开详情
试读 127P 测试驱动开发
立即下载 低至0.43元/次 身份认证VIP会员低至7折
抢沙发
一个资源只可评论一次,评论内容不能少于5个字
上传资源赚积分or赚钱
最新推荐
测试驱动开发 16积分/C币 立即下载
1/127
测试驱动开发第1页
测试驱动开发第2页
测试驱动开发第3页
测试驱动开发第4页
测试驱动开发第5页
测试驱动开发第6页
测试驱动开发第7页
测试驱动开发第8页
测试驱动开发第9页
测试驱动开发第10页
测试驱动开发第11页
测试驱动开发第12页
测试驱动开发第13页
测试驱动开发第14页
测试驱动开发第15页
测试驱动开发第16页
测试驱动开发第17页
测试驱动开发第18页
测试驱动开发第19页
测试驱动开发第20页

试读结束, 可继续阅读

16积分/C币 立即下载 >