《测试驱动开发》之介绍

  本书为《Test-Driven Development By Example》by Kent Beck[America].由人民出版社出版,孙方注释。

  以下为学艺不精的我综合英文原文和注释对这本书的翻译。小部分参考了孙平平等人的译本。

  介绍

  早在星期五,老板到Ward这儿向他介绍一个WyCash的潜在客户,Peter。WyCash是公司正在销售的债券组合管理系统。Peter说,”我对我看到的功能印象深很刻。不管怎么说,我注意到你只办理美元计价的债券。我正在创办一种新的债券,我的战略需要办理不同货币的债券。“老板转身向Ward,“好,我们能做到吗?”

  这对任何软件设计者都是噩梦般的场景。你正在快乐成功地游弋在一组假设里。突然,一切都变了。这不仅是Ward的噩梦。在指导软件开发有丰富经验的老板也不确定答案会是什么。

  一个小团队已经开发WyCash超过一两年的时间了。这个系统能处理大多数美国市场上常见的固定收益证券的品种,和一些外来的新工具,比如投资担保合同,其他竞争产品是不能处理的。

  WyCash一直使用对象和对象数据库进行开发。在开始的时候,计算的功能抽象,美元,是外包给一队聪明的软件工程师的。他们生成的对象合并了格式化和计算。

  在过去六个月里,Ward和该团队的其他成员已经慢慢剥离美元的职责。Smalltalk的数值类原来在计算方面很不错。所有的棘手代码四舍五入至三个十进制数字获得了生产精确答案的方式。随着答案变得更加精确,在测试框架中,预期结果和实际结果的精确匹配取代了一定容差范围内的复杂的比较机制。

  信息格式化的操作实际上属于用户接口类。因为测试是写在用户接口类层面的,尤其是报告框架,所以这些测试不需要修改来适应这些改动。经过六个月认真的削减,Dollar类所负责的操作已经不剩什么了。

  加权平均,一个在这个系统中最复杂的算法,同样经历了一个缓慢的转变。有段时间内,很多不同种类的加权平均代码分散在系统里。就像报告框架是从最初的对象里合并而来一样,加权平均算法也会有一个容纳它的地方,这个地方就是AveragedColumn。

  AveragedColumn现在就是Ward要着手的地方。如果加权平均能支持多种货币,那系统其他部分应该也可以。这个算法的核心是保持一定数量的钱在相应栏里。事实上,这个算法已经足够抽象来计算任何能用算术表示的对象的加权平均数。举个例子来说,一个可以计算日期的加权平均。

  周末像往常一样过去了。星期一早上老板回来了,“我们能做吗?”

  “再给我一天时间,我会告诉你确切的答案。”

  美元的作用就像加权平均里的一个计数器。因此,为了多币种计算,他们需要一个有每种货币计数器的对象,就像多项式。只不过条目可能是15 USD和200CHF,而不是3x^2和4y^3。

  一个快速实验表明,用一种通用货币对象代替美元计算,当两种不同的货币相加时返回一个PolyCurrent对象是有可能。现在的问题是给新的功能腾出空间而不改变现有功能。如果Ward运行这些测试会发生什么呢?

  在为Currency类添加一些未实现的操作后,大部分测试通过了。在这天结束的时候,所有的测试都通过了。Ward上传代码到系统创建,然后去老板那儿“我们能做到。”,他自信地说。

  让我们来思考下这个故事。在两天内,这个潜在的市场乘以数倍,乘以WyCash数倍的价值。这种如此快速地创造出如此大的商业价值的能力不是偶然的。很多方面发挥了作用。

  1、方法——Ward和WyCash团队需要有一定的经验,知道如何持续地进行系统设计。因此转变的机制能够很好地实践。

  2、动机——Ward和他的团队需要清楚地知道建设WyCash多币种的商业重要性,同时有勇气开始如此一个看起来不可能的任务。

  3、机遇——周全而金发信心的测试、构造良好的程序、可以隔离设计决策的程序设计语言使得只有少数错误来源且错误容易更正。

  你不能控制你曾经是否有这个动机,通过施展技术法宝来增值你的项目。方法和机遇,另一方面,是完全在你控制下的。Ward和他的团队通过组合超级天赋、经历、纪律创造了方法和机遇。这是不是意味着加入你不是这个世界上十个最好的软件工程师之一,在银行也没有一打钱,因此你告诉你的老板你要加薪,然后你花时间把这个做好,像这样永远的时刻就属于你呢?

  不是。你完全可以把项目放在发挥你才能的位置,尽管你是一个技术普通的软件工程师,你在有压力的时候会乱成一团,偷工减料。测试驱动开发是一套任何软件工程师能够领会且鼓励采用简单设计和增强信心的测试套件的技术。如果你是一个天才,你不需要这些规则。如果你是一个白痴,这些规则不会有帮助。对于介于中间的绝大多数的我们,遵循这两条原则能使我们工作得更加接近我们的潜力。

  1、在你写任何代码之前,先写一个失败的自动化测试。

  2、删除重复。

  究竟如何做到这一点,细微层次的应用这些规则,并且你可以推进这两个简单的规则到什么程度是这本书的主题。我们将从Ward在他灵感一现的那一刻所创建的对象——多种货币资金。

时间: 2024-08-29 09:40:19

《测试驱动开发》之介绍的相关文章

测试驱动开发与Python

最近在看一本书<Test-Driven Development with Python>,里面非常详细的介绍了如何一步一步通过测试驱动开发(TDD)的方式开发Web项目.刚好这本书中使用了我之前所了解的一些技术,Django.selenium.unittest等.所以,读下来受益匪浅. 我相信不少开发都写单元测试,不过,一般是先写功能代码,然后,再写单元测试用例,在编写单元测试用例的过程中,可能需要调整功能代码,从而使单元测试用例通过.但是TDD就特别要求先写测试用例,后写实现代码.这一开始确

测试驱动开发(Test-Driven Development)

1.背景 一个高效的软件开发过程对软件开发人员来说是至关重要的,决定着开发是痛苦的挣扎,还是不断进步的喜悦.国人对软件蓝领的不屑,对繁琐冗长的传统开发过程的不耐,使大多数开发人员无所适从.最近兴起的一些软件开发过程相关的技术,提供一些比较高效.实用的软件过程开发方法.其中比较基础.关键的一个技术就是测试驱动开发(Test-Driven Development).虽然TDD光大于极限编程,但测试驱动开发完全可以单独应用.下面就从开发人员使用的角度进行介绍,使开发人员用最少的代价尽快理解.掌握.应用

浅谈测试驱动开发(TDD)

1. 优势 TDD的基本思路就是通过测试来推动整个开发的进行.而测试驱动开发技术并不只是单纯的测试工作. 需求向来就是软件开发过程中感觉最不好明确描述.易变的东西.这里说的需求不只是指用户的需求,还包括对代码的使用需求.很多开发人员最害怕的就是后期还要修改某个类或者函数的接口进行修改或者扩展,为什么会发生这样的事情就是因为这部分代码的使用需求没有很好的描述.测试驱动开发就是通过编写测试用例,先考虑代码的使用需求(包括功能.过程.接口等),而且这个描述是无二义的,可执行验证的. 通过编写这部分代码

测试驱动开发(TDD)及测试框架Mocha.js入门学习

组里马上要转变开发模式,由传统的开发模式(Developer开发,QA测试),转变为尝试TDD(Test-driven development,测试驱动开发)的开发模型.由此将不存在QA的角色,或者仅存很少的QA用于系统模块间的集成测试. 因此代码的测试与开发都将由开发者(Developer)来保证. 这就需要借助优秀测试框架的帮助,尤其是支持TDD开发模式的自动化测试框架更为重要,因为我使用的编程是语言是Node.js,那么广泛使用的Mocha.js将成为我的首选. 在团队转型过程中,很多事情

测试驱动开发神器框架Mockito

作为菜鸟的我,以前没接触过Mock类型的框架,比如说要测试action层,我总是从action层调用service再调用dao访问数据库,这种方式从原则上来说是无疑是非常正确的,在没用mock框架之前我就隐隐约约的感觉到了这种方式有个不足的地方,那就是速度问题,测试action层的时候需要访问下面两层,如果我们下面两层已经经过单元测试证明是ok的,那么如果测试action层的时候再调用下面两层就等于是做了重复的动作,逻辑上没问题,只是有点重复,并且速度很慢,毕竟项目做到靠后期的时候文单元测试非常

原创翻译-测试驱动开发(TDD)

测试驱动开发原则 翻译自<<Expert Python Programming>> 测试驱动开发是指首先编写包含所有测试软件特点的测试集,然后再去开发软件.也就是说,在编写软件之前先把这个软件的测试文档写清楚.举个例子,如果有个程序员想编写一个可以计算一组数字平均值的函数,那我们先要写出这个函数是怎么用的.我们可以这样写:assert average(1, 2, 3) == 2assert average(1, -3) == -1 这些测试例子也可以由别的人来负责编写.现在,这个函

(转)浅谈测试驱动开发(TDD)

测试驱动开发(TDD)是极限编程的重要特点,它以不断的测试推动代码的开发,既简化了代码,又保证了软件质量.本文从开发人员使用的角度,介绍了 TDD 优势.原理.过程.原则.测试技术.Tips 等方面. 2 评论: 李群 ([email protected])www.ihere.org 背景 一个高效的软件开发过程对软件开发人员来说是至关重要的,决定着开发是痛苦的挣扎,还是不断进步的喜悦.国人对软件蓝领的不屑,对繁琐冗长的传统开发过程的不耐,使大多数开发人员无所适从.最近兴起的一些软件开发过程相关

掌握测试驱动开发的3个关键因素(译)

从戴维?恩斯坦教数千软件开发者们如何更有效地以测试驱动开发的10年来,他学会了掌握测试驱动开发的3个关键组成部分:理解它真正是什么,使代码稳定可测,并且获得实际动手经验.让我们看这些因素,找到它在你的项目中为有效地使用测试驱动开发带来什么. 在过去10年来,我有教数千个专业软件开发者如何有效地测试驱动开发的权利.从这些经验中,我学会了测试驱动开发的3个关键因素:理解它真正是什么,使代码确实可测试,并且获取一手的经验.让我们看一看这些因素中的每一个,去看看使用测试驱动开发能有效地在你的项目中带来什

测试驱动开发实践

总是以为自己了解了测试驱动开发,其实做起来和了解根本不是一回事.原来觉得代码清晰得很,后来试验了一下才知道那是自己的错觉.这次,让我们抛却Eclipse的自动补全功能,来一场真正的测试驱动开发吧. 项目描述:这是一个很简单的项目,目标是扫描磁盘上所有特定格式的文件,将其路径存储下来,通过程序可以快捷搜索到文件路径并自动定位到该文件. 用户故事(简单点写了): 1.              扫描磁盘,将目录下的所有文件列出来,将特定格式的文件信息存储到磁盘. 2.              所有