通过TDD聊软件开发

TDD是由极限编程提出的一个编程实践,与通常的编程行为相反,TDD是先编写测试案例,然后再编写功能代码,重复这样的一个过程直到功能实现完成为止。

TDD

大家可能听过“六顶思考帽子”,说的是一种思维训练方式或者是一个全面思考问题的模型,我们借鉴思考帽子来说明TDD,可以看到最上面的那个图,三顶帽子分别表示TDD的三个步骤。

  • 红帽子: 编写一个测试案例,然后运行它,得到失败的测试结果
  • 绿帽子: 编写功能代码,让失败的测试案例跑通过
  • 蓝帽子: 对功能代码和测试代码进行重构

为什么红代表失败,绿代表通过呢?可以想象成交通灯,红灯停绿灯行,在最早的时候是Kent Beck开发的Junit,用它来跑单元测试的时候,失败会出现一个红色的进度条,成功会变成绿色的,所以红代表失败,绿代表成功。

需要注意的几点:

  • 在完成绿帽子的过程中,只需要添加让失败测试案例跑通过的功能代码,不要过渡设计。把整个功能代码都写完了,再来补单元测试,这种不是TDD。
  • 在蓝帽子阶段,不仅要对功能代码进行重构,对测试代码也要进行重构,因为测试代码也是以后维护工作的一部分,如果你不认真对待它,它以后也不会好好对待你,烂测试比没有测试更恼火。

一直重复这3个步骤,直到你的功能开发完成,这就是TDD。

软件质量

先抛开TDD,我们来聊一下项目管理。项目管理三要素:功能,时间,质量,这3者遵守着质量守恒定律。想象一个面积不变的三角形,如果把其中任意2个点往中心点外面拉伸,那第三个点肯定会往中心点靠近。

在传统的项目管理中,功能和时间往往是不可妥协的,比如领导要在xx日之前完成oo功能,开发团队没办法在规定时间完成指定功能,那要怎么办呢?这时候往往就会降低软件质量来达到目的。

而在敏捷开发中,软件质量是不可妥协的点,在保证高质量的软件基础上对其他2个要素进行裁剪,如果你的时间是deadline,一旦改了会影响产品推广,那我们就保证完成核心功能,其他不是那么重要的功能放到下一个版本;如果功能全部都是必须的,那么请把交付时间延后。

Which One

在TDD三顶帽子中,你最喜欢哪一个呢?可能大部分人都喜欢绿帽子(你才喜欢绿帽子!!你全家都喜欢绿帽子!!!…–_–#),因为绿帽子表示你的测试通过了,功能完成了,系统可以上线了。但我觉得蓝帽子和红帽子更加重要,为什么呢?

重构在软件开发中不是一项单独的活动,有的开发人员会说等开发完了所有功能之后,再单独找时间做重构,其实这是不对的,重构不是一个很”大“的事情,而是一个个编写好代码的手法或者技巧,这是一项贯穿软件开发整个过程的一个活动,比如在开发功能的时候进行重构,抽取重复代码进行功能复用,又或者在修复Bug时对之前不合理的代码进行重构,使之更具可维护性,各个阶段我们都可以进行重构。

重构是提高软件质量的重要手段之一,在极限编程中有很多实践都是用于提高软件质量的,包括单元测试,持续集成,TDD,结对编程等,而重构是贯穿在这些实践中的一个活动。

红帽子也比较重要,TDD——测试驱动开发,要先写出测试案例和验收条件,而这需要先分析需求、提炼需求,将需求转化为测试用例,测试驱动开发实际上是需求驱动开发,所以能写出一个好的测试用例,实际上就等于已经对功能代码做好了设计。经历过结对编程的人就有这种感觉,一个人写好测试案例,再由另外一个人来写功能代码,第二个人基本上不用费什么劲就可以写出功能代码,为什么呢?因为思路已经在测试案例中体现出来了,你只要照着写就可以了。

要学习TDD网上有很多资料,甚至还有不少视频是演示怎么做TDD的,这里就不详细举例子了,大家可以自行在网上查阅。

Comments