TDD精神障碍综合征

近期,我的一些关于TDD、设计模式、同步乃至数独问题的博客好像招惹了很多TDD反对者的怨言。不乏有人态度粗鲁、具攻击性、嘲枫、轻蔑而且不成熟。嗯,万圣节就快到了。

尽管他们自圆其说,但确实也提出了一点儿合理的疑问。为了公平起见,我想在这里回答会比较合适。

TDD有科学依据吗?

确有充足的依据。

  • 用Google简单检索了下,我就发现这篇Phil Haack的博客。在里面他回顾了一篇TDD的研究文献。其中引用到:

我们发现使用测试优先的同学一般会编写更多的测试,并且编写更多测试的同学趋于有更多的产出。我们还观察到,基本质量随着程序员的测试而线形增长,并与所选择的开发策略无关。

  • 在同一个搜索结果中我也发现了Matt Hawley的这篇博客。其中他回顾了不少研究文献。有部分这样总结:

有87.5%的开发人员报告说这让他们更好的理解需求。95.8%的开发人员报告说花在调试上的时间减少了。78%的开发人员报告总体来说应用TDD增加了产出。50%的开发人员发现总体说开发时间减少了。92%的开发人员觉得TDD伴随着更高质量的代码。79%的开发人员相信TDD造就了更简单的设计。

实际上,我发现Matt的一些内容来自于一个Laurie Williams和Boby Goerge在2003年做的更为著名的研究(也在上述Google搜索中可以找到)。研究中提到了一个设定的试验,其中包括了三家不同公司。尽管Matt的总结是基于这个研究的,还是值得一说。

在Goerge-William的试验团队中,应用到TDD的团队表示的比没有使用TDD的要花更多达16%的时间。显然,以下测试数据相比会更加准确。没有应用TDD的团队没能通过三分之一的研究者隐藏的测试用例,而应用TDD的团队通过了7项中的6项。引用Kent Beck的话说:“如果必须让它工作起来的话,我可以做的更快!”

这项试验中另一有趣观点是TDD团队产出的一套自动化测试用例有着更高的测试覆盖率(大多数情况下都接近100%),相比之下,没有TDD的团队尽管曾声称也要产出这样的一套测试,但未能达成。

  • 同样的Google检索中我找到了Jim Shore写过的关于另一份研究小结的回顾。其中收集了7份不同的研究(包括了上面Goerge-Williams的)。在质量和产出方面,研究结果表现出从改善可观到改善不明显不等。
  • 最后,这里有个2008年IBM和微软做过的关于TDD的研究,它展现出TDD人员的bug数量减少率在30%~90%(由bug跟踪工具统计的),而产出成本的节省在15~35%(项目经理的主观意见)。我推荐你回到Kent Beck的评论上。

我相信还有更多的研究内容,毕竟这只是来自一次的Google检索的结果。我觉得奇怪TDD反对者会从Google搜索中找不到什么。

  • 噢,对了,还有整个软件业界的刊物都导向了对TDD的研究和报告。

有哪些项目是基于 TDD 开发的呢?

实际上, 还不少。下面是这些项目的列表,他们都编写了一套自动化的单元测试,而且有很高的覆盖率。这些是我确实知道使用 TDD 的,我就知道这些。其他的,我只能猜测了。如果你知道其他的,请发表留言补充。

  • JUnit。这是很明显的。JUnit是Kent Beck和Erich Gamma全程使用TDD编写的。如果你是纯粹通过发布状况来评测软件的,这个程序可特别是公认成功的。
  • Fit。Ward Cunningham编写。这是目前多数验收测试框架的祖先。
  • FitNesse。这个测试框架有超过几万的用户。它有70,000行Java代码,有+90%的代码覆盖率。全程TDD。非常小的bug列表。还是,如果你是以发布来评价,这是另一个了不起的成功。
  • Cucumber,Rspec。这两个是Ruby的测试框架。当然,你会喜欢看到测试框架应用TDD编写,对吗?我知道这些是全程TDD。
  • Limelight。一个JRuby写的gui框架。全程TDD。
  • jfreechart.
  • Spring
  • JRuby
  • Smallsql
  • Ant
  • MarsProject
  • Log4J
  • Jmock

还有其他的吗?我确信有。这些只不过是个简短的网页搜索。如果你知道更多,请添加留言。

(原文链接网址: http://blog.objectmentor.com/articles/category/uncle-bobs-blatherings ; Robert C. Martin 的英文 blog 网址: http://www.butunclebob.com/ArticleS.UncleBob

本文作者Robert C. Martin

Robert C. Martin Object Mentor 公司总裁,面向对象设计、模式、UML 、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt 获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method 的作者。MartinPattern Languages of Program Design 3More C++ Gems 的主编,并与James Newkirk 合著了XP in Practice 。他是国际程序员大会上著名的发言人,并在C++ Report 杂志担任过4 年的编辑。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


什么是设计模式一套被反复使用、多数人知晓的、经过分类编目的、代码 设计经验 的总结;使用设计模式是为了 可重用 代码、让代码 更容易 被他人理解、保证代码 可靠性;设计模式使代码编制  真正工程化;设计模式使软件工程的 基石脉络, 如同大厦的结构一样;并不直接用来完成代码的编写,而是 描述 在各种不同情况下,要怎么解决问题的一种方案;能使不稳定依赖于相对稳定、具体依赖于相对抽象,避免引
单一职责原则定义(Single Responsibility Principle,SRP)一个对象应该只包含 单一的职责,并且该职责被完整地封装在一个类中。Every  Object should have  a single responsibility, and that responsibility should be entirely encapsulated by t
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强烈推荐。原文截图*************************************************************************************************************************原文文本************
适配器模式将一个类的接口转换成客户期望的另一个接口,使得原本接口不兼容的类可以相互合作。
策略模式定义了一系列算法族,并封装在类中,它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,它是针对软件开发中经常遇到的一些设计问题,总结出来的一套通用的解决方案。
模板方法模式在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中,使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。
迭代器模式提供了一种方法,用于遍历集合对象中的元素,而又不暴露其内部的细节。
外观模式又叫门面模式,它提供了一个统一的(高层)接口,用来访问子系统中的一群接口,使得子系统更容易使用。
单例模式(Singleton Design Pattern)保证一个类只能有一个实例,并提供一个全局访问点。
组合模式可以将对象组合成树形结构来表示“整体-部分”的层次结构,使得客户可以用一致的方式处理个别对象和对象组合。
装饰者模式能够更灵活的,动态的给对象添加其它功能,而不需要修改任何现有的底层代码。
观察者模式(Observer Design Pattern)定义了对象之间的一对多依赖,当对象状态改变的时候,所有依赖者都会自动收到通知。
代理模式为对象提供一个代理,来控制对该对象的访问。代理模式在不改变原始类代码的情况下,通过引入代理类来给原始类附加功能。
工厂模式(Factory Design Pattern)可细分为三种,分别是简单工厂,工厂方法和抽象工厂,它们都是为了更好的创建对象。
状态模式允许对象在内部状态改变时,改变它的行为,对象看起来好像改变了它的类。
命令模式将请求封装为对象,能够支持请求的排队执行、记录日志、撤销等功能。
备忘录模式(Memento Pattern)保存一个对象的某个状态,以便在适当的时候恢复对象。备忘录模式属于行为型模式。 基本介绍 **意图:**在不破坏封装性的前提下,捕获一个对象的内部状态,并在该
顾名思义,责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链。这种模式给予请求的类型,对请求的发送者和接收者进行解耦。这种类型的设计模式属于行为
享元模式(Flyweight Pattern)(轻量级)(共享元素)主要用于减少创建对象的数量,以减少内存占用和提高性能。这种类型的设计模式属于结构型模式,它提供了减少对象数量从而改善应用所需的对象结