唐睿

A full stack engineer, an architecture, a project coordinator and an entrepreneur, who is always learning.

测试驱动开发和软件开发流程模型

28 Dec 2006 » 技术
编程 极限编程 测试先行 测试驱动开发 TDD

我终于决定不再继续看极限编程大师 Kent Beck 所写的那本 Test Driven Development: By Example 了。因为我实在无法忍受我与作者在软件开发流程模型上的分歧。但这并不妨碍我认同并实践作者所谓“测试先行”的理念。我是一个趋近完美主义者,因此更喜欢像设计模式那样偏重设计的方法论,我不能认可一个靠不断修改而成长起来的软件。

按照 Kent Beck 极端的测试驱动开发模型,一个软件应该是这样写出来的:

  • 写测试代码
  • 编译测试代码,编译无法通过(因为没有实现代码)
  • 写一份最简单的实现代码,让编译通过

迭代地修改代码以减少实现代码的重复度,降低实现代码和测试代码之间的耦合度。

就是这样,一个软件被一点一点修改而成。他强调了在这个过程中有两个主意事项:第一,在添加任何功能之前都要先写测试,除非代码是用于调试的,这也就是所谓测试先行的概念;第二,当编译无法通过时尽量不要再写新的测试。

我之所以不认同这个模型,就是因为其中间产生了大量的迭代过程,而这些过程很可能只在头脑中出现,或者根本就不曾出现。这些过程一方面增加了开发的消耗,也在某种程度上引入了更多的不确定性。但是其中测试先行的做法,能最大程度保证单元测试的完整性与正确性。

因此,我理想中的开发流程模型应该是这样的:

  • 用户需求调研,导出成软件需求
  • 根据软件需求进行设计
  • 根据设计编写测试用例
  • 根据测试用例编写测试代码
  • 构建软件框架使测试代码能够编译通过
  • 写 Mock 来保证测试用例代码准确无误
  • 按部就班地写程序,用测试用例来保证所写的代码准确无误

这其中可以按照极限编程的思想以一个可独立发布可运行的模块作为单位,这样可以有效地控制模块的大小,还可以避免出现过度设计的问题。