TDD并不是看上去的那么美

原文:http://coolshell.cn/articles/3649.html

春节前的一篇那些炒作过度的技术和概念中对敏捷和中国ThoughtWorks的微辞引发了很多争议,也惊动了中国ThoughtWorks公司给我发来了邮件想来找我当面聊聊。对于Agile 的Fans们,意料之中地也对我进行了很多质疑和批评。我也回复了许多评论。不过,我的那些回复都是关于中国ThoughtWorks咨询师以及其咨询的方法的。我对Agile方法论中的具体内容评价的不是很多,所以,我想不妨讨论一下Agile方法论中的具体的实践(以前本站也讨论过结对编程的利与弊)。

那么,这次就说说TDD吧,这是ThoughtWorks中国和Agile的Fans们最喜欢的东西了。我在原来的那篇文章中,我把TDD从过度炒作的技术剔除了出去,因为我还是觉得TDD有些道理的,不过,回顾我的经验,我也并不是很喜欢TDD。我这篇文章是想告诉大家,TDD并没有看上去的那么美,而且非常难以掌控,并且,这个方法是有悖论之处的

TDD简介

TDD全称Test Driven Development,是一种软件开发的流程,其由敏捷的“极限编程” 引入。其开发过程是从功能需求的test case开始,先添加一个test case,然后运行所有的test case看看有没有问题,再实现test case所要测试的功能,然后再运行test case,查看是否有case失败,然后重构代码,再重复以上步骤。其理念主要是确保两件事:

  • 确保所有的需求都能被照顾到。
  • 在代码不断增加和重构的过程中,可以检查所有的功能是否正确。
  • 我不否认TDD的一些有用的地方,如果我们以Test Case 开始,那么,我们就可以立刻知道我们的代码运行的情况是什么样的,这样可以让我们更早地得到我们实现思路的反馈,于是我们更会有信心去重构,去重新设计,从而可以让我们的代码更为正确。

    不过,我想提醒的是,TDD和Unit Test是两码子事儿。有很多人可能混淆了自动化的Unit Test(如:XUnit系例)和TDD的软件开发过程。另外,可能还会有人向鼓吹“TDD让你进行自顶向下的设计方式”,对此,请参阅本站的《Richard Feynman, 挑战者号, 软件工程》——NASA的挑战者号告诉你自顶向下设计的危险性。

    TDD的困难之处

    下面是几个我认为TDD不容易掌控的地方,甚至就有些不可能(如果有某某TDD的Fans或是ThoughtWorks的咨询师和你鼓吹TDD,你可以问问他们下面这些问题)

  • 测试范围的确定。TDD开发流程,一般是先写Test Case。Test Case有很多种,有Functional的,有Unit的,有Integration的……,最难的是Test Case要写成什么样的程度呢。
  • 如果写的太过High Level,那么,当你的Test Case 失败的时候,你不知道哪里出问题了,你得要花很多精力去debug代码。而我们希望的是其能够告诉我是哪个模块出的问题。只有High Level的Test Case,岂不就是Waterfall中的Test环节?
  • 如果写的太过Low Level,那么,带来的问题是,你需要花两倍的时间来维护你的代码,一份给test case,一份给实现的功能代码。
  • 另外,如果写得太Low Level,根据Agile的迭代开发来说,你的需求是易变的,很多时候,我们的需求都是开发人员自己做的Assumption。所以,你把Test Case 写得越细,将来,一旦需求或Assumption发生变化,你的维护成本也是成级数增加的。
  • 当然,如果我把一个功能或模块实现好了,我当然知道Test 的Scope在哪里,我也知道我的Test Case需要写成什么样的程度。但是,TDD的悖论就在于,你在实现之前先把Test Case就写出来,所以,你怎么能保证你一开始的Test Case是适合于你后面的代码的?不要忘了,程序员也是在开发的过程中逐渐了解需求和系统的。如果边实现边调整Test Case,为什么不在实现完后再写Test Case呢?如果是这样的话,那就不是TDD了。
  • 关注测试而不是设计。这可能是TDD的一个弊端,就像《十条不错的编程观点》中所说的一样——“Unit Test won’t help you write the good code”,在实际的操作过程中,我看到很多程序员为了赶工或是应付工作,导致其写的代码是为了满足测试的,而忽略了代码质量和实际需求。有时候,当我们重构代码或是fix bug的时候,甚至导致程序员认为只要所有的Test Case都通过了,代码就是正确的。当然,TDD的粉丝们一定会有下面的辩解:
  • 可以通过结对编程来保证代码质量。
  • 代码一开始就是需要满足功能正确,后面才是重构和调优,而TDD正好让你的重构和优化不会以牺牲功能为代价。
  • 说的没错,但仅在理论上。操作起来可能会并不会得到期望的结果。1)“结对编程”其并不能保证结对的两个人都不会以满足测试为目的,因为重构或是优化的过程中,一旦程序员看到N多的test cases 都failed了,人是会紧张的,你会不自然地去fix你的代码以让所有的test case都通过。2)另外,我不知道大家怎么编程,我一般的做法是从大局思考一下各种可行的实现方案,对于一些难点需要实际地去编程试试,最后权衡比较,挑选一个最好的方案去实现。而往往着急着去实现某一功能,通常在会导致的是返工,而后面的重构基本上因为前期考虑不足和成为了重写。所以,在实际操作过程中,你会发现,很多时候的重构通常意味着重写,因为那些”非功能性”的需求,你不得不re-design。而re-design往往意味着,你要重写很多 Low-Level的Test Cases,搞得你只敢写High Level的Test Case。

  • TDD导致大量的Mock和Stub。相信我,Test Case并不一定是那么容易的。比如,和其它团队或是系统的接口的对接,或是对实现还不是很清楚的模块,等等。于是你需要在你的代码中做很多的Mock和 Stub,甚至fake一些函数来做模拟,很明显,你需要作大量的 assumption。于是,你发现管理和维护这些Mock和Stub也成了一种负担,最要命的是,那不是真正的集成测试,你的Test Case中的Mock很可能是错的,你需要重写他们。
  • 也许,你会说,就算是不用TDD,在正常的开发过程中,我们的确需要使用Mock和Stub。没错!的确是这样的,不过,记住,我们是在实现代码后来决定什么地方放一个Mock或Stub,而不是在代码实现前干这个事的。

  • Test Case并没有想像中的那么简单。和Waterfall一样,Waterfall的每一个环节都依赖于前面那个环节的正确性,如果我们没有正确的理解需求,那么对于TDD,Test Case和我们的Code都会的错的。所以,TDD中,Test Case是开发中最重要的环节,Test Case的质量的问题会直接导致软件开发的正确和效率。而TW的咨询师和Agile的Fans们似乎天生就认为,TDD比Waterfall更能准确地了解需求。如果真是这样,用TDD进行需求分析,后面直接Waterfall就OK了
  • 另外,某些Test Case并不一定那么好写,你可能80%的编程时间需要花在某个Test Case的设计和实现上(比如:测试并发),然后,需求一变,你又得重写Test Case。有时候,你会发现写Test Case其实和做实际设计没有差别,你同样要考虑你Test Case的正确性,扩展性,易读性,易维护性,甚至重用性。如果说我们开发的Test Case是用来保证我们代码实现的正确性,那么,谁又来保证我们的Test Case的正确性呢?编写Test Case也需要结对或是Code review吗?软件开发有点像长跑,如果把能量花在了前半程,后半程在发力就能难了。

    也许,TDD真是过度炒作的,不过,我还真是见过使用TDD开发的不错的项目,只不过那个项目比较简单了。更多的情况下,我看到的是教条式的生硬的 TDD,所以,不奇怪地听到了程序员们的抱怨——“自从用了TDD,工作量更大了”。当然,这也不能怪他们,TDD本来就是很难把控的方法。这里送给软件开发管理者们一句话——“当你的软件开发出现问题的时候,就像bug-fix一样,首要的事是找到root cause,然后再case by case的解决,千万不要因为有问题就要马上换一种新的开发方法”。相信我,大多数的问题是人和管理者的问题,不是方法的问题。

    虚拟座谈会:TDD有多美?
    http://www.infoq.com/cn/articles/virtual-panel-tdd

    时间: 2024-11-08 18:34:21

    TDD并不是看上去的那么美的相关文章

    电脑小白学习第九课---看图软件之美图看看

    windows下看图软件有很多,windows系统自带的也有看图软件,不过很难用.今天推荐大家使用美图看看软件,查看电脑图片.我们先下载这个软件,在百度搜索"美图看看",如下图所示,直接下载即可.然后双击刚下载的安装程序,开始安装.把下图勾选框的勾去掉,安装目录默认即可,点击"安装".取消下图那个勾选,然后点击"完成",完成软件的安装.找到一个图片,右击,选择打开方式,选择其他应用.在弹出窗口选择"美图看看",并勾选"

    TDD随想录

    2014年我一直从事在敏捷实践咨询项目,这也是我颇有收获的一年,特别是咨询项目的每一点改变,不管是代码质量的提高,还是自组织团队的建设,都能让我们感到欣慰.涉及人的问题都是复杂问题,改变人,改变一个组织是个更复杂问题,这里可能涉及很多的非技术,非能力问题. 在2014年12月我在某企业内部推行TDD(测试驱动开发)培训,一共分4个课时完成一个特定需求的例子,看着大家一步一步的加深对TDD的理解,直到2014-12-31,也是2014的最后一天下午培训完TDD课程,经过一系列的总结过后,某参与人员

    看美剧学英语

    仔细想了一下,大概用了几个月,看了N部美剧下面一一列出.评价星级按照适合用于学英语的程度评分,并非对作品进行评价.1.尼基塔混血美女的诱惑抵挡不了,评价:3星2.摩登家庭艾美奖.家庭剧,非常适合学英语,已经开始看第二遍.评价:5星3.生活大爆炸这个其实跟到第四季由于更新太慢就放弃了,再后来..就被强制下线了呦.虽然适合宅男,但是语速太快.评价:4星4.绝望主妇看了至少5季,后来有点撑不住,剧情开始相似,大部分内容没啥变化,不过一定会补全.语速适合英语.评价:5星5.破产姐妹情景喜剧,依旧在更新的

    看美剧英文字幕学英语的利器——“深蓝英文字幕助手”简介

    我从初中开始基本上就是一个英语很烂的人,数理化再好有什么用,工作了,结果发现数理化都没啥用,最有用的还是当年学的最烂的英语.于是在2011年年底开始了学习英语的课程,在学习的过程中,外教经常会放英剧美剧给我们看,看了以后回答问题,讲解,挺有意思的.印象最深刻的就是Neil给我的Doctor Who还有另外一个外教放的Friends.后来在课程快结束的时候,萌发了一个想法,能不能只看英文字幕来看美剧(当然还有英剧),这样没有中文字幕的话才能在看美剧的过程中联系阅读与听力.但是美剧中很多词汇不懂,一

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

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

    《数学之美》阅读笔记之Google搜索技术浅析

    博主虽然学计算机出身,惭愧的是对计算机的许多方向都不了解.决定从现在开始,多读书,对各个方向都看一看.刚看完数学之美这本书,介绍了许多数学原理在计算机行业的应用.博主想简单总结一下,本篇主要围绕搜索引擎技术来介绍. 当我们在Google搜索框里面打一个词时,Google可以立即返回全网的搜索结果.这看似简单的背后,其实有着很复杂的处理过程.能够这么快的返回查询结果,依赖于搜索引擎对全网知识所做的预处理.这个预处理就是网络爬虫和索引表.索引表类似于书本的目录,根据目录,可以迅速找到某些内容所在的页

    三亚之旅 海景--美得让你尖叫

    一次很偶然的机会,能够在三亚游玩两天,但很遗憾,没有能够和亲爱的在一起.一个人虽然很自由,可以尽情的走,但一个人旅行是非常寂寞的,特别是在 特别适合情侣旅游的三亚.你会看到很美很美的景色,但只是仅限于感叹的他的美,心里却空空的高兴不起来,没有另一半和你一起分享,一起尖叫,一起静静的享 受. 写这篇文章希望能记录下这次的经历和感悟,方便计划下一次来,也希望能为计划来三亚的朋友们提供些参考,这次三亚之旅共两天(20150106-20150107),第一天行程为三亚湾.天涯海角.南山寺:第二天行程为亚

    再融33亿美元,新美大与Groupon呈现天壤之别

    2016年1月18,多家媒体爆料称美团-大众点评获得新一轮33亿美元的融资,融资后新公司估值将超180亿美元.这次融资也创下国内互联网行业私募融资单笔金额的最高纪录,同时也是全球最大的O2O融资项目. 此前一直有消息称新美大已完成28亿美元的融资,此番看来传闻并非真实数据,官方公布的最新融资是33亿美元,足见资本市场对于新美大的看好.与之相对比的美国团购鼻祖Groupon却在前不久宣布全球裁员约1100人,并先后退出美洲.南亚.北欧等国际市场,市值也是一落千丈,如今只有18亿美元,与中国的新美大

    尔雅霓裳教你把自己的婚纱照美出一种新高度

    婚纱就像是辛德瑞拉的水晶鞋,穿上婚纱,再平凡的女孩儿也能光彩夺目. 婚纱照无疑能为我们留住这美丽的瞬间,让这一人生的重要时刻成为永恒. 对女人而言,婚姻是大事,那么拍婚纱照也同样是一件大事,所以许多女生在拍婚纱照的事上慎之又慎,希望自己能成为最美丽的新娘,而自己的婚纱照也是独一无二的. 也许,你经常看到朋友圈里朋友晒的婚纱照,那些长相平平的女生在照片里简直美到没朋友,让你不禁也渴望能拥有这样一套完美的婚纱照. 那么,怎么才能让自己的婚纱照美出一种新高度呢?今天尔雅霓裳婚纱摄影小编就教你如何让自己