在这样一个迭代的流程中,在写任何的production code之前,先写test,再写production code,并且不断地对代码进行清理和重构,并且每次迭代都要进行回归测试,保证新增的test和production code不会break任何已有的test和production代码。
一般来讲,支持自动化的回归测试的工具相对比较容易实现。整个流程中的难点在于:当先行写test代码的时候,必然要求先定义被测试的production code的外部接口,对于第一次迭代,自然没有问题;但是,由于需求的变更,或者整体设计的变更,在后续的迭代过程中,经常会发生,已有的已经实现并且包含完整测试的production code的外部接口需要变更或者说重构;尽管从理论上,绝大多数的重构需求,都有规律甚至是模式可循,但是,如果完全依赖于人工操作,则不仅效率不高,且极易出错。所以,但凡成功的TDD实践,其中都不乏很多支持重构的工具。比如,现行绝大多数的集成开发环境,都有很多自动化的代码重构工具,大大的降低了代码重构的成本。
但是还有一些领域,TDD还略微有些力不从心,或者说,至少,至今没有看到太多比较好的实践案例。比如:对于Database和UI。
对于数据库开发的TDD,到目前为止面临的主要挑战是工具的支持。无论是自动化的回归测试工具,还是重构工具都还远远不够成熟。
而对于UI的TDD,则是本文的主题。
TDD in HTML & JavaScript 概述
谈到应用程序的UI,其实包括两个方面的内容:一方面是纯图形的look & feel;另一方面,则是用户和应用程序的交互。用户和应用程序的交互往往同时导致图形界面的变化,并且,转换到新的交互行为。
由于工作实践中主要是基于WEB的HTML和JavaScript的项目,这里对TDD in UI的讨论,将focus在基于HTML和JavaScript的UI。
同时,一般来讲,WEB程序的表现层主要有客户端代码和服务端代码,而服务端代码,相对来说,更容易被测试。所以,本文讨论的重点,主要focus在客户端代码。换句话说,这里讨论的TDD in HTML & JavaScript指的是对于客户端的HTML和JavaScript的TDD。
TDD in HTML & JavaScript 之可行性
jsc – Write any .NET code, convert .NET assembly to JavaScript, ActionScript, java or PHP code
这些方案的特点是,利用现有的IDE对流行的编程语言如C#源代码的完善的coding,尤其是强类型,重构和测试的支持,让开发人员写C#,由工具转换为可直接执行的,格式化的JavaScript代码。除了充分利用IDE对流行语言的coding支持之外,这类方案的另一个好处是,相对于高薪聘请Senior的JavaScript开发人员,Junior的C#的开发人员要便宜得多,也易招得多,但得益于Script#,已经足够能用他们熟悉的C#,写出逻辑复杂和OO的JavaScript代码,因此,开发成本被大大降低。
综上所述,TDD in JavaScript不仅理论上是可行,实际应用上,也是有足够的工具支持的。尤其是如Script#这样的工具的出现,极大地提高了JavaScript代码的开发效率。
TDD in JavaScript 之最佳实践