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 年的编辑。

相关文章

什么是设计模式一套被反复使用、多数人知晓的、经过分类编目...
单一职责原则定义(Single Responsibility Principle,SRP)...
动态代理和CGLib代理分不清吗,看看这篇文章,写的非常好,强...
适配器模式将一个类的接口转换成客户期望的另一个接口,使得...
策略模式定义了一系列算法族,并封装在类中,它们之间可以互...
设计模式讲的是如何编写可扩展、可维护、可读的高质量代码,...