icon Rails 的相关感想

测试驱动开发和调试代码

最近举行了一个关于使用 Rails 的企业系统开发的研讨会。第二天便收到了出席者们用邮件发来的提问。

研讨会的一个主要议题是测试驱动开发的优点,我讲到“不必嵌入调试代码”,有人希望我详细介绍一下原因。

我这人行事不定,有时遵从测试驱动开发的原则有时又不遵从,但在认真地写一个测试然后进行代码编写的时候,将调试代码嵌入应用程序源代码(例如,尝试在记录输出变量的值)的时候是越来越少了。

这是为什么呢?

这是因为测试脚本和调试代码的目的是相似的。

请联想一下某控制台的测试脚本。这个脚本大体进行下面这样的处理。

  • 把程序设置为特定状态。
  • 发送特定的 HTTP 请求。
  • 其结果,确认控制台的实例变量具有特定的值以及 HTTP 响应满足特定的条件。。

调试代码的目的,是观察处理进程中变量是如何进行变化的。测验脚本的目的之一,是在处理结果中观察变量发生了怎样的变化。虽然不是一模一样,但也很相似。

测试脚本比调试编码更出色的地方在于,设定了程序处于特定状态的前提条件,并确认处理的结果。 暗示即使全部的测试脚本都成功了,程序运行不畅的话,即存在未经测试的条件。这是由于测试脚本限定了错误发生的条件。

至于测试驱动开发,按理是写好测试脚本后,再编写程序的源码,但是实际上有时候代码的编写并不能顺利进行。这种时候,不知不觉就想将调试代码嵌入程序里。但是,更加正确的的方法是,将现在正在进行代码编写的动作、方法等的一部分(不确定的部分)切出作为另外的方法,先就这个小方法编写测试脚本。在这个方法里发现错误就行了,如果没有发现的话就返回原来的动作和方法做进一步调查。

像这样的话,在测试驱动开发时不太会出现调试代码。进一步来说,几乎没有调试的必要。
--
黒田努

(2008/04/07)