【读书笔记】测试驱动开发(中文版)
作者:gnuhpc
出处:http://www.cnblogs.com/gnuhpc/
1. 书籍信息
作者: Kent Beck
译者: 张平平
出版社: 中国电力出版社
出版年: 2004-4-1
页数: 184
定价: 28.0
装帧: 平装(无盘)
ISBN: 9787508321738
2. 读书笔记
上学的时候常常接触实作性很强的书籍,少有接触带有方法论的书籍,看这本书算是个好的起点。Test Driven Development,简称TDD,翻译为测试驱动开发,在极限编程(XP)中占有核心的地位。
这本书实质上分为三个部分,第一部分是TDD的一个实例,第二部分介绍测试框架的构建原理,第三部分介绍TDD的流程和常用方法。前两部分完全可以跟着动手做,后一部分理论和经验居多,有些看的不是非常懂,还需要回头返回来在实践中反复揣摩。
这本书在开篇前言中就提出了TDD的目标,即“Clean code that works ”,在这个目标的指引下,整个过程要经过不可运行->可运行->重构:
- 快速新增一个测试。
- 运行所有的测试,发现最新的测试无法通过。
- 做一些小小的改动。
- 运行所有的测试,并且全部都通过。
- 重构重复代码,以消除重复设计,优化设计结构。
虽然,当采用TDD时,最终要编写的代码和测试代码几乎相同。但这种程序编写流程的具备如下优点:
- 不是从构建对象开始,而是从一个个实际的业务测试用例开发,使得开发人员能够更加专注于业务需求。
- 采用将一个问题以测试用例是否通过的方式来一步步分解,这样不断的逼近进行问题的求解,使得程序的设计和实现得到最大的简化。
- TDD是对付完美主义分子进度缓慢的良药,因为强调速度,所以允许在构建测试用例时丧失掉一切优秀的软件设计原则。(不过作者提到“给自己下保证要是不消除重复设计绝不回家”,这种完美主义太坑爹,多少程序员就是这么加班的啊~其实“不完整的测试用例有时对工作进度是一个记忆的标识~”)
- TDD并不能使我们灵光乍现,但是TDD有时会在心理上形成良性循环,帮助人更加自信,不断的测试除了可以使我们逐步自信之外还可以帮助我们在认真重构中寻找洞察力。
上述这个逼近目标进行重构的过程中,在代码层次上可以使用以下技巧:
- 建立Stub。
- 用变量逐步替代常量。
- 利用数值对象:某一种需求中要求一旦实例变量的值在构造函数中指定好了,那么以后再不允许发生变化,这就是说所有的操作都必须返回一个新的对象,这就是数值对象,像书中写美元等对象一样,采用值对象,注意在Java 中这意味着你必须重写equals和hashcode方法。
- 通过将子类由父类或接口代替而隐藏了接口,并引入能进一步完成解耦,此时测试代码可能有所冗余,可以暂时不管他们。并且利用逐步重构->产生相同的重复代码->Pull up代码这个步骤完成结构上的重构。
- 逐渐掏空子类的功能,然后将其删除。
- 无论何时,当我们需要显式的判定是哪种类时才进行下一步工作,都要用多态来替代。
- Java中使用匿名内部类对方法进行重载是制造Mock Object、实现对象部分逻辑与错误测试的一个有效方法。
- 在测试的时候通过运算式代替魔数,来表现所测试的功能流程。
- 通过工厂方法可以消除不必要存在的子类,另外当创建对象时需要一定灵活性时,工厂方法是个不错的主意。
- 模板方法的最佳实践:当发现两个子类中存在某一顺序步骤的两个变体时,你需要一点一点地缩小他们的差异,一旦从某个方法中提取出相异的部分后剩下的就是模板方法了,这时就可以将这个模板方法提到父类中去。
- 在检查条件等时可以采用空对象的方式,返回一个带有与后续相关操作同名但空实现方法的类的实例,这样就不用检查某些特殊条件了。
- 当一个子类的有太多的子类,而且每个子类仅仅实现一个方法,那么可以使用反射来进行一个统一类的构建。
- 重构时的思路:从最简化的结果形式上倒着推。
在过程控制上,可以使用以下技巧:
- 三角形法则:只有当测试用例多于2个时才对代码进行一般化,显然这是一个带有偷懒性质的东西,但确实是一个工作进行推进的方式。在推动抽象进程时采用三角法 ,即通过两个或两个以上的例子进行举例,进而得到抽象的灵感。
- 请使用TO-DO清单来记录整个过程,遇到一个潜在的问题时,没有立即着手解决的把它们记录在计划清单上,以防有遗漏。
- 引入大规模的测试前,先使得小规模测试获得通过。
- 选择那些具有指导意义,并且有把握实现的测试来进行测试用例的编写,并且在测试的刚开始要选择实质上不做任何工作开展测试。
作者在描述一些场景时采用了比喻的手法,有时,比喻的作用非常的显著,能指导开发。另外,通过这本书的第二部分还对Junit测试框架的设计理念和基本设计方法有了初步的认识,例如Junit之所有setUP等方法,目的有两个一个是为了测试的性能,一个是为了隔离各个测试用例。
3. 书中代码实作
http://gnuhpc.googlecode.com/svn/trunk/Wycash/
http://gnuhpc.googlecode.com/svn/trunk/TestFrame/
4. 有关后续阅读材料贮备