程序员升级必练内功:测试驱动开发
试驱动开发(简称TDD)是一种程序开发的技巧,简单来说就是先写测试程序,然后才实作功能。具体的流程则是通过Red–Green–Refactor cycle的循环:
Red:先写测试程序,此时因为还没有实作功能,所以这个测试是会失败
Green:快速实作出功能,让上述的测试通过
Refactor:重构代码,去除多余多余的代码,提高代码质量,同时维持测试通过
对于开发软件需要撰写自动化测试,已经广泛获得专业软件开发者的认同。软件产品想要走的长远,就必须为其撰写自动化的测试程序来确保软件质量。但是对于是否全然实行测试驱动开发的争议则层出不穷,特别是对于测试驱动开发被当作一种教条的反感。
但无论是否百分之百实行测试驱动开发,笔者都认为学习测试驱动开发会是一个专业软件开发者升级的必经过程。通过练习测试驱动开发,软件开发者可以学习到如何撰写好的自动化测试,怎样设计软件可以更模块化、更容易扩充,以及设计出好用的API界面。
那要如何上手学习测试驱动开发呢?光看理论是不行的,唯一的办法就是动手做来获得经验。要直接利用公司项目练习测试驱动开发可能会比较困难,一来在不熟悉的情况下会大大拖慢开发速度,二来在有GUI和Multilayered软件构架的环境中,导入测试驱动开发会一次面对太多问题和挑战。
推荐利用Code Kata学习测试驱动开发
因此学习测试驱动开发最好的方式,没有之一。个人认为就是Code Kata形式了。「Kata」是日本字「形」的意思,中文的意思是「套路」。而Code Kata就是通过一些小型的程序题目进行重复锻炼,就像学功夫套拳。不需要GUI或复杂的软件框架,只需要程序语言本身和一个单元测试函式库,通过全然遵守测试驱动开发的规范来练习这些题目,内化及提升程序设计能力。
搜寻Code Kata(实在不懂可以谷歌一下)可以在网络上找到很多Kata题目。这里举一例:
有一家书店在销售《十万个为什么》系列书籍,每一本书定价100元。买两本不同的书可以打5%的折扣、买三本不同的书可以打10%的折扣、买四本不同的书可以打20%。如果买到五本可以打到25%的折扣。请写出一个函式可以计算价格。
我们练习写下第一个测试案例,一开始这个测试案例应该是失败的,因为还没有开始实作这个函式:
第一次买1本:总价应为100元
然后我们就可以开始实作这个函式通过这个测试案例。根据TDD规则,你只需要通过这个测试案例即可,不多也不少。例如这个实作只要将数量乘上100元就可以通过了。
接着,我们可以写第二个测试案例,一开始这个测试案例也是不通过的:
第一次买1本、第二次买1本:总价应为190元
接着撰写实战通过以上两个测试案例。接着继续撰写下一个测试案例,事情开始变得有趣:
第一次1本、第二次买2本:总价应为290元(要不同集数才有折扣,所以第二集第二本没有折扣)
重复这个循环过程,直到完成为止。
注意,过程中你必须完全遵守TDD规则:
一定是先写一个不通过的单元测试,才开始实作功能。
每次只新加一个单元测试,只需要刚刚好不通过即可,不要一次加多个测试情境
每次实作功能时,只需要刚刚好通过测试即可,不多也不少。
听起来很简单吧,但是在这个过程中,你将不知不觉面对以下的问题:
测试案例要怎么写?如何建构测试数据?要举多少例子才算完成可以涵盖规格和所有其他情况?
每一次的开发循环,程序都会变得越来越复杂,是不是要停下来重构一下?让程序可以更简洁容易扩充。
如何确保每个测试案例都有效益?不会发生砍掉实作却没有造成任何测试失败。
如何安全地重构不会改坏之前写好的程序?
测试案例会越加越多edge case,那么实作要如何因应来越改越通用呢?
API要如何设计,才会好测试和呼叫?
测试代码的质量、可读性和扩充性也和产品代码也相等重要吗?
这些问题都会在练习的过程中逐步学习和思考,让你升级成为更好的程序员。