测试驱动开发
软体业界开始注重单元测试,大概是进入二十一世纪的头几年的事情,其中一个明显的指标就是Kent Beck在2002年出版的Test-Driven Development: By Example这本书,提出了「测试驱动开发」(Test-Driven Development,通常简称TDD)的观念,颠覆了不少人编程人员的习惯与流程:在开发软体的时候,我们不是先写主要功能,而是先写测试。
坊间跟测试驱动开发相关的书籍或其他阅读资料非常多,我们不会在这边花费太多篇幅。简单来说,Kent Beck 提出写程式的过程,应该是"Red, Green, Refactor" 三个阶段:
- Red: 在还没有主要功能之前,先写单元测试。 由于主要功能都还没有撰写,自然无法通过刚刚写出来的单元测试,所以会亮出红色的灯号。
- Green: 开始实作主要功能,直到可以通过单元测试,让测试的灯号变成绿色。
- Refactor: 继续整理写出的程式码。
这个流程后来引起一些批评,比较有名的案例像是Ruby on Rail的主要作者DHH(David Heinemeier Hansson)在个人blog上写了一篇TDD is dead. Long live testing.,反对TDD流程,主要论点是,如果非要让系统中每个部分都要能够被执行单元测试,反而会导致不适当、甚至有害的系统设计。此文一出,后续引发了一连串的争论。至于在你的开发流程中,是否适合使用测试驱动开发呢?还是那句话:先别排斥,先试试看吧!