《 测试驱动开发》虽然是一本薄薄的书,但解开了我心中不少的疑团,可惜也带来了一堆新的问号。
我们平时开发的流程大致分为两个步骤:确定需求,编码实现。如果分得再细一点,可以分为n个步骤:提出需求、确定需求、编写需求文档、数据库建模和对象建模、编码、集成测试和验收测试。编码的过程又可以分为n个步骤:编写功能代码,单元测试。虽然这种流程不算是RUP,但我觉得却是向着RUP进发。
但从《测》一书中,我没看到作者要求在开发中具备完整的文档,看第一遍的时候我是觉得作者是从编码中得出需求的,但看第二遍的时候我又否定了自己的想法。《测》的作者Kent Back拿了一个汇率计算的例子向我们演示如何TDD,在例子的第一次单元测试失败后,我们可爱的MR.Kent已经得出了汇率计算的所有需求,这时我释然了,TDD应该也要结合实际嘛,然后需求真的是从开发中驱动出来么?不可能,这样的话还要客户干嘛?这是我当时的想法。
如果到了这里已经算是解开了疑团,我也没必要写这篇东东了,下面我借花敬佛,通过TDD所包含的步骤开打开话匣子。
TDD可以分为三步:
1、 写一个不可以工作的测试,一开始这个测试程序甚至不能编译。
2、 尽快让这个测试程序工作起来,为此可以在程序中使用一些不合情理的方法。
3、 重构,消除重复设计,优化设计结构。
为什么一定要先写一个不可以工作的测试?而不是先写一个不可以工作的程序?为什么一定要由测试来驱动开发,而不是先开发,后测试?先写Test Case后写程序的方法,会不会导致开发效率降低?
这些疑问一直缠着我很久了,虽然不致令我寝食难安,但让问题存在了这么长的时间是一位coder的耻辱。结合在不久前景德镇的会员中心改造这一需求和几晚的思考,一些云雾已经渐渐被拨开。
为什么一定要先写一个不可以工作的测试?而不是先写一个不可以工作的程序?
这里的测试并非普通的测试,甚至跟我们想像中的测试是完全不同的,它是对需求的理解。TDD要求我们在测试前写一个测试清单,这更像把需求整理出来。不过TDD根本没要求我们把测试做得像验收测试那样详细,TDD要求能清楚表达需求就行了。
为什么一定要由测试来驱动开发,而不是先开发,后测试?
TDD有一个标准,就是在没有测试的情况下,决不编写任何程序代码。TDD提倡小步跑,在开发过程中要考虑很多东西,包括代码的正确性、可扩展性、性能等等,很多问题都是因为复杂性太大导致的,这导致了很多时候“设计过度”,因此TDD的每一步都是适可而止的,今天的事今天解决,明天的事明天再说。
先写Test Case后写程序的方法,会不会导致开发效率降低?
这里是我最大的疑问,不过没实践过因此没任何发言权。我们重温一下测试驱动的三步曲:
1、写一个不可以工作的测试,一开始这个测试程序甚至不能编译。
2、尽快让这个测试程序工作起来,为此可以在程序中使用一些不合情理的方法。
3、重构,消除重复设计,优化设计结构。
怎样能能使用这个测试程序尽快地工作起来?以下是《测试驱动开发》一书中的摘抄:
1、 伪实现,可以直接返回一个常量。
2、 显明实现,将真实的代码键入。
3、 三角法,在不确定的时候可以由几个方面抽象出共同的事物,类似已知三角形任意两边可以得出第三边。
4、 可以使用复制粘贴等方法让你的程序尽快的工作。
5、 千万别忘记了重构,这是很重要的一步,在重构前写出你希望拥有的测试。
可能大家和我有一样的同感,这什么伪实现很扭扭捏捏嘛,这步伐也太小了吧,不过Kent Back说了,用什么样的步伐来跑,决定于你的感觉和经验,跟着感觉走准没错。
写到这里好像似乎可以结束了,不过这两晚我重温了《敏捷软件开发:原则、模式和实践》一书后,脑子里又塞满了一堆的问号。
XP是这样给自己定义的:
1、个体和交互 > 过程 (这里主张团队沟通,理解)
2、可以工作的软件 > 面面俱到的文档 (这里与我们背道而驰,有疑问)
3、客户合作 > 合同谈判 (需求在不断变化,理解)
4、响应变化 > 遵循计划 (开发过程不可能一成不变的,理解)
5、初期交付的系统中所包含的功能越少,最终交付的系统质量越高。(赞成)
下面这些更难以理解:
1、 XP缺乏明确的设计阶段(怪不得TDD是XP最著名的一个开发方式,但如果团队的成员拿不准方向咋办?与目标越离越远咋办?)。
2、 在给新的团队成员传授知识方面同,最好的两份文档是代码和团队(不是每个人的代码都写得清淅明了的,不是每个人都善于沟通的,这里会不会太理想化了)。
3、 许多团队因为太注重文档而非软件,而导致失败。(会不会夸大其词?)
4、 先在测试中陈述你的意图(这就是TDD吧)。
5、 XP没有全局视图或者全局视图不明确,这里存在着与第一点相同的疑问。
分享到:
相关推荐
测试驱动开发,英文全称Test-DrivenDevelopment(简称TDD),是由KentBeck先生在极限编程(XP)中倡导的开发方法。以其倡导先写测试程序,然后编码实现其功能得名。本文不打算扯过多 测试驱动开发(TDD)入门 测试...
中文名: 凌波微步:软件开发警戒案例集 作者: 周虹 王咏刚图书分类: 软件 资源格式: PDF 版本: 扫描版 出版社: 清华大学出版社书号: 9787900643681发行时间: 2002年11月 地区: 大陆 语言: 简体中文 简介: 内容...
瀑布模型的主要缺陷: 程序的维护成本会越来越高(需要很多人) 团队氛围压抑(感受不到激情) 不方便做需求变更(引起客户不满) ...敏捷式开发是一种从90年代开始逐渐引起广泛关注的些新型软件开发方法。
读《软件工程》有感 软件工程学,是一门研究用工程化方法构建和维护有效的、实用的和高质量的软件的 学科,它涉及到程序设计语言、数据库、软件开发工具、系统平台、标准、设计模式等 方面。下面是软件工程的现状: ...
读《软件工程》有感 软件工程学,是一门研究用工程化方法构建和维护有效的、实用的 和高质量的软件的学科,它涉及到程序设计语言、数据库、软件开发工 具、系统平台、标准、设计模式等方面。下面是软件工程的现状: ...
当前,互联网+快速发展,对金融...到2000年初,敏捷思想逐渐进入中国,给中国的软件开发产业尤其是互联网相关的软件开发产业注入了新鲜血液,人们不断注意到agile在应对市场的灵活性以及应对客户的高满意度方面表现出来
使用感受:此书非常不错,特别后面章节的实例,配合C/S设计及实现实例理解学些很快。 书本介绍:《精通Windows Sockets网络开发:基于Visual C++实现》由 浅入深、循序渐进地讲解如何使用WindowsSockets开发网络应用...
读书月读后感:读《摆脱贫困》有感1000字.pdf
读《夹边沟记事》有感:人性的拷问 .docx
软件定义是软件项目的早期阶段,主要由软件系统分析人员和用户合作,针对有待开发的软件系统进行分析、规划和规格描述,确定软件是什么,为今后的软件开发做准备。这个时期往往需要分阶段地进行以下几项工作。 1....
VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...
读后感300字-朱熹观书有感.docx
读《终身学习》有感:学习也是实践 .docx
读《人类简史》有感:虚构的秩序精选.doc
各领域数据集,工具源码,适合毕业设计、课程设计作业,所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答! 软件开发设计:PHP、QT、应用软件开发、...
读《人类简史》有感:虚构的秩序参考.doc
读《定位》有感:让品牌有血有肉有性格.docx
读恩格斯共产主义原理有感.doc
该书详细介绍了各个从事软件开发的专业人员的真实经验及感受,看过的朋友相信一定会受益匪浅。