关于测试驱动和遗留系统

   随手google到gigix的blog,看了一些他的观点和若干人等的相关评论,有些觉得颇有道理,摘录如下。
  
  看“测试驱动开发”这个名字,首先应该明确:与它对应的是“文档驱动开发”。它是一种开发过程,这里的测试是一个设计问题,而不是QA问题。在没有 TDD之前,“正统的”开发过程要求有设计文档:高层设计描述一个模块“做什么事”,详细设计描述一个模块“如何做这些事”。软件工程课讲得清楚,只有源代码的软件不能算软件,因为它不可理解、不可维护;源代码加上文档,才算是程序员完整地交付了自己的工作。要做任何一件事之前,你必须首先清楚地知道自己要做什么(以及不要做什么),否则那就是crack,不是在从事职业的软件开发。
  
  但这种文档有几个致命的缺陷。第一,自然语言的描述容易产生歧义;第二,不能自动化地验证;第三,不能保证文档与程序同步。测试驱动开发正是为了解决这些问题而产生的。在编写一段代码之前你所写的测试,不是为了确保这段代码不出错,而是为了描述你想要做的事情。当你拥有这个测试之后,持续集成会始终确保你的代码恰好是做了你想要做的事情。测试驱动开发是一种设计方法,它清晰无二义地描述你的设计,并保证设计与实现一致。
  
  所以几个典型的问题就可以很清楚地找到答案。单元测试要不要是白盒的?要。因为你是在描述如何实现这个模块,而不是验证它的输入输出正确性。单元测试要不要把每个模块放到真实的事务或者并发环境下测试?不要。因为你只是描述当前模块的实现,真实环境下的正确性由集成测试和QA来保证。为什么模块内部实现的变化要同时导致测试变化?因为你的思路、你的设计变化了,你应该有一个文档描述这件事情。
  
  
  (如何用unit test测试私有方法)...重点在于,你不应该有任何方法是从一开始设计出来就是private的,因为你的每段程序都应该在单元测试的驱动之下产生,而测试是不可能驱动出来一个private方法的。那么private方法从哪里来?只能从重构而来。所以答案是:private方法是不需要测试的,因为它是重构的产物,而重构是不改变程序可观察之行为的。既然行为不改变,测试自然也不需要有任何改变,所以不需要针对private方法建立任何新的测试。
  
  但是,如果private方法确实出现问题了怎么办?如果你确实希望用测试来弄清一个private方法里面到底发生了什么,该怎么办?
  
  答案是:如果一个private方法复杂到你不能一眼看清它,那它就太复杂了,你应该把它重构成为一个独立的class,然后针对这个class来建立单元测试

  
  关于这个对private方法的单元测试,记得两年前我在bbs上跟别人有过讨论,当时对单元测试的理解太粗浅了。现在我的理解跟gigix基本上是一致的。嗯,虽然这一年多基本上没写过unit test-_- 但有些东西还是在不知不觉中进步的啊。就好像下棋一样,对棋的理解确实会随着时间的增加而逐渐提高,当然这种提高是很有限的,并且距离实战还有很大的距离,必须多进行一些实际的对局才能把这种提高转化成真正对自己下的棋所有帮助的东西,或者说必须和实战所结合起来。不然的话,所谓的提高就只会让你的棋漏洞百出,被对手打得落花流水。
  
     遇到什么东西不由你选。要是程序员可以决定自己将要遇到什么东西,用汇编写写就可以了,还搞什么这个P那个P,结构化都用不着。
      另外说句废话——o6z也许又要骂我,不过这话我觉得不能算和职业无关——我最讨厌程序员自以为是的批评什么“鬼东西”、“垃圾设计”。就是这些“垃圾设计”的“遗留系统”,运转着银行的绝大多数业务逻辑,创造着证券业信息化系统的绝大部分价值。没错,用2004年的眼光(甚至是1998年的眼光)来看,它们是腐烂代码,它们是垃圾设计。但我们自以为是的那些优秀设计,它们做了什么?它们不过是在运转一些边沿业务,提供几个漂亮的网站展示而已。说白了,这些东西才是可有可无的垃圾。可以运转的程序就是好的程序,正常运转了超过十年的程序是精彩绝伦的程序,不懂得敬畏这些程序的人,做不好企业级应用。

  
  这段牢骚说的也有点道理。但我觉得,这并不是历史发展的趋势。将来恐怕还是那些“我们自以为是的那些优秀设计”的天下,即使它们现在看上去是“可有可无的垃圾”。那些“正常运转了超过十年”的“精彩绝伦的程序”,也许还将继续运转下去,但是这些程序所占的比重只会越来越少。就如同资本主义的工业化战胜了封建行会的手工作坊,就算有些天才的技术工人能够制造出高超的产品,质量比机器生产出来的东西要高得多,但这阻挡不了机器的社会化大生产成为潮流,而那些有着顶尖技法的天才,终究不会成为主流。软件的发展也会使进入的门槛越来越低,这时那些集中着天才智慧的程序的用武之地会越来越小,能够推动每个熟练工人生产力的提高才是更重要的东西。毕竟不可能每个人都是天才。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值