`
ijavagos
  • 浏览: 1187341 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

让软件走近“恐怖地带”的元凶--未经测试的代码 (原文最终修订于 2006-09-05 晚上10:33:27)

阅读更多

Cedric Beust(译注1)在最近一篇blog中引用了我的几篇发贴,其中包括关于“junit邮件列表”,“测试覆盖率需达到90%以上才算是有效代码”,还有“如果没有这么高覆盖率的话,那就一种非专业行为”(译注2)等。Cedric对此的回复是这样的:

那是有点极端了,不过也并非全盘错误。而这句话没能鉴别出来的是其实有太多种层次上的“非专业”。我都能想出一些比“发布未经测试的代码”来得更严重的情况。

  • 错过了最后期限
  • 发布的产品未能全部实现用户所要求的功能。
  • 未能发布

  • 我认为发布低质量的产品是非专业的。
  • 我认为发布你不知道质量是否低下的产品也是非专业的。
  • 我认为除非测试过,否则你无法获知所发布的产品是否质量低。
  • 最后,我认为如果你没有足够高的测试覆盖率,你的测试就不可能覆盖足够多的产品代码,因而你就无法了解所发布的产品是否质量低。

能够保证产品发布在最终期限前的唯一关键在于,你确信即将发布的产品不是低质量的,而这就需要足够高的测试覆盖率。

好,现在可以进入正题了。假如你没有完整测试过,但你敢打赌你的代码能够工作,而且大多数时候代码确实不会发生什么问题。要问我这样是不是够专业的话,我的回答还是“非专业”。

Cedric继续提到说:

有很多种可以去了解代码能否工作的方法:测试是一个;经过几千个客户几年的使用;一贯的成功发布;核心功能只出现少量bug也是一个。仅通过测试和代码覆盖来了解代码能否工作的说法是荒诞的。

我不知道为何Cedric会认为让成千客户来测试你的代码是种专业行为。事实上,如果代码只产生非常少量的bug到是不错的,不过请告诉我多么优秀的人才能写出这样的代码。而如果发布给客户的产品未经过高覆盖率测试,那程序员们就要冒很大的险,这就是非专业。

最后,Cedric提到在测试过、确信能工作的代码和没测试过、不确信能工作的代码之间有一片中间地带。如下:

有这么一种称作“未测试但能工作的代码”处于中间地带。

我承认未经测试的代码也许可以工作,然而,除非测试过了,否则你无法知道这段代码是否可以工作。而且实际上,你对代码能否运行的掌握程度是跟测试覆盖率的高低有关的。

现在我知道了,Cedric所作的测试量一定是到达了某种程度,可能很多,也可能几乎全部吧。希望如此。现在我就可以开始关心于测试完成之前发布产品的问题了。产品发布的最终期限比质量更重要,你最好在更多功能和质量之间选择前者。

最后,最令我堪忧的是认为达到高测试覆盖率和能够按时发布完备功能的产品之间是相互矛盾的见解。我认为按时发布功能完备的产品的最佳方法是尽可能的消除在调试和让系统能够连贯运行(译注3)中所耗费的时间。而消除它们的方法就是编写测试,并且在一开始就编写它们。对于避免调试所浪费的时间的最好方法就是避免使代码暴露于测试的覆盖之外。

译注:

1,Cedric Beust,是WebLogic Server团队的高级软件开发人员,他在其博客Otaku中提出了J2EE、Java、AOP和软件开发等方面的见解,此外,Cedric更是敏捷技术的活跃分子。

2,详情参见“敏捷人还没接受它么”一篇帮助理解。

3,详情参见“TDD的三条军规”一篇帮助理解。

(原文链接网址:http://www.butunclebob.com/ArticleS.UncleBob.UntestedCodeDarkMatter; Robert C. Martin的英文blog网址:http://www.butunclebob.com/ArticleS.UncleBob

作者简介:Robert C. Martin(昵称Uncle Bob)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年的编辑。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics