程序猿对TDD这个词一定不陌生。近几年比較火。英文全称Test-Driven Development,測试驱动开发。

它要求在编写某个功能的代码之前先编写測试代码,然后仅仅编写使測试通过的功能代码,通过測试来推动整个开发的进行。


以下这段是粘的(来自百度百科)。列举了TDD相比传统开发模式的一些优势:

1) TDD依据客户需求编写測试用例,对功能的过程和接口都进行了设计,并且这样的从使用者角度对代码进行的设计通常更符合后期开发的需求。

由于关注用户反馈,能够及时响应需求变更。同一时候由于从使用者角度出发的简单设计,也能够更快地适应变化。


2) 出于易測试和測试独立性的要求,将促使我们实现松耦合的设计,并很多其它地依赖于接口而非详细的类,提高系统的可扩展性和抗变性。并且TDD明显地缩短了设计决策的反馈循环,使我们几秒或几分钟之内就能获得反馈。

3) 将測试工作提到编码之前。并频繁地执行全部測试,能够尽量地避免和尽早地发现错误。极大地减少了兴许測试及修复的成本。提高了代码的质量。在測试的保护下,不断重构代码。以消除反复设计。优化设计结构,提高了代码的重用性。从而提高了软件产品的质量。

4) TDD提供了持续的回归測试,使我们拥有重构的勇气,由于代码的修改导致系统其它部分产生不论什么异常。測试都会立马通知我们。完整的測试会帮助我们持续地跟踪整个系统的状态。因此我们就不须要操心会产生什么不可预知的副作用了。

5) TDD所产生的单元測试代码就是最完美的开发人员文档,它们展示了全部的API该怎样使用以及是怎样运作的。并且它们与工作代码保持同步,永远是最新的。

6) TDD能够减轻压力、减少忧虑、提高我们对代码的信心、使我们拥有重构的勇气,这些都是快乐工作的重要前提。

7)高速的提高了开发效率

当我看到这些优势后,我为之中的一个震,这个东西好,但细致思考后,认为非常多地方并非那么easy的。也不像TDD宣称得那么乐观。



以下针对上述每一条优势,谈谈我的看法。 

针对第一条:
“TDD依据客户需求编写測试用例”,“从使用者角度对代码进行设计”。但经过无数实践证明。软件开发的最大困难在于用户需求的不确定性。依据用户需求编写測试用例,除非针对一些非常easy或者非常明白的需求。否则你的測试用例根本不能真正反映用户的需求。TDD从一定程度上提前做了一个如果。那就是“需求能够在实现之前明白下来”,这是不现实的。

在实际的软件开发中,用户需求和外部环境的不稳定性会导致软件需求难以把握。仅仅有让用户看到了执行的软件,用户才干驱使软件朝着他想要的方向前进,通常需求和设计都会不断调整。


针对第二条:
我不否认測试能够驱使我们写出更高质量的代码,但这是測试的作用。并非TDD的作用,“在没有測试用例失败之前,不要写不论什么一行代码”这样的极端的方式,会导致我们的设计不是迎合用户需求,而是迎合測试用例,而如前面所说,測试用例非常难在一開始就符合用户需求。

我们全然能够在完毕系统功能的同一时候。完毕单元測试,然后通过重构的方式来改善既有代码的质量。


针对第三条:
不可否认,“频繁地执行所有測试,能够尽量地避免和尽早地发现错误,极大地减少了兴许測试及修复的成本,提高了代码的质量。

”但假设把这些放在代码之前。那么我们怎样保证自己的測试用例写得恰当,一旦需求变更,或者对需求理解有误,那么改动測试用例。意味着我们的编码所有废弃了,不要小看这个成本。非常可能会出现这样的情况:我们花成倍的时间去维护我们的測试用例,却不能如期交付我们的软件。

第二句,“在測试的保护下。不断重构代码。以消除反复设计,优化设计结构,提高了代码的重用性,从而提高了软件产品的质量。”这是单元測试的功能。并非TDD的功劳。


第四条,第五条。第六条提到的也是一样。并非TDD的功劳,是自己主动化測试的功劳。自己主动化測试并非什么新东西。从Junit出现的那天,自己主动化測试就已经非常成熟了。TDD包括自己主动化測试,假设TDD的全部优势都来源于自己主动化測试。那么TDD全然是一个大忽悠。

针对第五条。多说一句,“TDD所产生的单元測试代码就是最完美的开发人员文档”,这样的鬼话,我是不信的。自己主动化測试用例的开发维护成本远高于文档。它对程序猿的个人素养也要求很高。意味着什么?成本很高。

第七条更无从谈起了。“高速的提高了开发效率”? 前面说了那么多。这句就不用再评论了。

总结:


看到TDD。我就想到了瀑布模型。

TDD强调“先理解清楚需求,把它转化为測试用例,然后再来实现和重构“,细一琢磨。这不就是瀑布模型嘛?强调需求先于实现,瀑布模型用文档表达需求,而TDD仅仅只是是把需求文档换成了測试用例而已。

所以我觉得,TDD不是什么新东西,仅仅只是在瀑布模型的基础上换了身衣服。带了个自己主动測试的帽子而已。它将不可避免地面临和瀑布模型同样的问题:“忽略了软件需求的产生是一个在实际执行中不断调整探索完好的过程。


个人愚见,勿喷。





浅谈对TDD的看法的更多相关文章

  1. 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生

    [转].NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  2. 浅谈HTML5单页面架构(一)——requirejs + angular + angular-route

    心血来潮,打算结合实际开发的经验,浅谈一下HTML5单页面App或网页的架构. 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又要数单页面架构体验 ...

  3. 浅谈php生成静态页面

    一.引 言 在速度上,静态页面要比动态页面的比方php快很多,这是毫无疑问的,但是由于静态页面的灵活性较差,如果不借助数据库或其他的设备保存相关信息的话,整体的管理上比较繁琐,比方修改编辑.比方阅读权 ...

  4. 浅谈JS之AJAX

    0x00:什么是Ajax? Ajax是Asynchronous Javascript And Xml 的缩写(异步javascript及xml),Ajax是使用javascript在浏览器后台操作HT ...

  5. 【转】浅谈Java中的hashcode方法(这个demo可以多看看)

    浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native i ...

  6. AngularJS进阶(二十五)requirejs + angular + angular-route 浅谈HTML5单页面架构

    requirejs + angular + angular-route 浅谈HTML5单页面架构 众所周知,现在移动Webapp越来越多,例如天猫.京东.国美这些都是很好的例子.而在Webapp中,又 ...

  7. 【转】浅谈Java中的hashcode方法

    哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: public native int hashCode(); 根据这个 ...

  8. [原创]浅谈IT人如何做理财规划

    [原创]浅谈IT人如何做理财规划 鱼哥博客上多数写的是技术和管理相关,但很少有理财等话题,今天抽空来谈谈IT人如何做理财规划,如果要想学习理财,我想很有名的“标准普尔家庭资产象限图”上值得每个学习和理 ...

  9. 浅谈Java中的hashcode方法(转)

    原文链接:http://www.cnblogs.com/dolphin0520/p/3681042.html 浅谈Java中的hashcode方法 哈希表这个数据结构想必大多数人都不陌生,而且在很多地 ...

随机推荐

  1. 【小技巧】树剖套线段树优化建图如何做到 O(nlogn)

    前提:用树剖套线段树优化树链连边.例题:bzoj4699 我们说树剖的时间复杂度是 $O(n\times log(n))$,是因为访问一条链时需要经过 $log(n)$ 级别条重链,对于每条重链还需要 ...

  2. git 以及 工作区 版本库 暂存区

    https://www.jianshu.com/p/a308acded2ce            这个博客介绍的比较简单 https://blog.csdn.net/qq_31828515/arti ...

  3. vim 编辑器的使用

    相信一个linux运维人员不可能不知道vim ,下面我们一起来学习vim的日常操作吧.(不要追求多,工作中用到了再去学也不迟.) 1.vim 的几种模式 *正常模式:快捷键or命令行操作 *插入模式: ...

  4. 【01】react 之 hello world

    React 起源于 Facebook 的内部项目,因为该公司对市场上所有 JavaScript MVC 框架,都不满意,就决定自己写一套,用来架设 Instagram 的网站.做出来以后,发现这套东西 ...

  5. CODEVS【3372】选学霸

    题目描述 Description 老师想从N名学生中选M人当学霸,但有K对人实力相当,如果实力相当的人中,一部分被选上,另一部分没有,同学们就会抗议.所以老师想请你帮他求出他该选多少学霸,才能既不让同 ...

  6. js7:表单的学习,Forms对象

    原文发布时间为:2008-11-09 -- 来源于本人的百度文章 [由搬家工具导入] dreamveawer中,选择插入——表单——然后后面的几个选项进行学习: 大体上这么些类型: <html& ...

  7. 乌班图中的ssh服务

    SSH服务(TCP端口号22):安全的命令解释器                                     为客户机提供安全的Shell 环境,用于远程管理                ...

  8. Codeforces 918D MADMAX 图上dp 组合游戏

    题目链接 题意 给定一个 \(DAG\),每个边的权值为一个字母.两人初始各占据一个顶点(可以重合),轮流移动(沿着一条边从一个顶点移动到另一个顶点),要求每次边上的权值 \(\geq\) 上一次的权 ...

  9. PE笔记之PE基本结构图(PE笔记索引)

    PE(Portable Execute) 文件是Windows下可执行文件的总称,常见的有DLL,EXE,OCX,SYS等,事实上,一个文件是否是PE文件与其扩展名无关,PE文件可以是任 何扩展名.那 ...

  10. Python Challenge 第十关

    第十关是一张牛的图片和一行字:len(a[30])=?.图片中的牛是一个链接,点开后进入一个新页面,只有一行字: a = [1, 11, 21, 1211, 111221, 看来要知道第31个数多长, ...