SQ3R阅读法:
一、Survey(阅读前的调查)
1、书名:《Test-Driven development By Example》,中文译名《测试驱动开发实例》。
2、作者:Kent Beck(肯特·贝克),美国著名软件工程师与作家,在软件工程方面有很大的贡献。他是Smalltalk软件的开发者,设计模式的先驱,测试驱动开发的支持者,也是极限编程的创始者之一。现在Facebook工作。
维基百科摘录:
Beck全家似乎都弥漫着技术的味道。生长在硅谷,有着一个对无线电痴迷的祖父,以及一个电器工程师父亲。从小就引导Kent Beck成为了业余无线电爱好者。在俄勒冈州大学读本科期间,Kent Beck就开始研究起模式。然而在他最终拿到计算机学位之前,他却是在计算机和音乐中交替学习。似乎Java大师都能够有这样的能耐,另一Java大牛Rod Johnson同样也拥有音乐学的博士学位。 Kent Beck一直倡导软件开发的模式定义。早在1993年,他就和Grady Booch(UML之父)发起了一个团队进行这个方面的研究。虽然著有了《Smalltalk Best Practice Patterns》一书,但这可能并不是Kent Beck最大的贡献。他于1996年在DaimlerChrysler启动的关于软件开发的项目,才真正地影响后来的软件开发。这次的杰作就是XP(极限编程)的方法学。和软件开发大师Martin Fowler合著的《Planning Extreme Programming》可谓是关于XP的奠基之作。从此,一系列的作品如《Test Driven Development: By Example》,《Extreme Programming Explained: Embrace Change》让更多的人领略到了极限编程的精髓,也逐步导致了极限编程的流行。Kent Beck的贡献远不仅如此。对于众多的Java程序员来说,他和Erich Gamma共同打造的JUnit,意义更加重大。也许正式这个简单而又强大的工具,让众多的程序员更加认可和信赖极限编程,从而引起了Java敏捷开发的狂潮吧。
二、Questions(提出问题)
1、极限编程(XP)、敏捷编程(Agile)、测试驱动开发(TDD)的区别与联系?
TDD在XP中处于核心地位,想要采用极限编程(XP),必须熟练掌握测试驱动开发技术(TDD)。
2、什么才叫测试驱动开发(TDD)?
3、测试驱动开发(TDD)真的有用吗?
要让测试可行,需首先进行设计!(至少根据blog内容)
三、Read(阅读全书)
前言
1、
clean code that works!——TDD一直追逐的目标!
2、如何做才能做到clean code that works?——
TDD开发的两大原则!
(1)只有在测试失败时,才重新写代码!
(2)消除重复设计,优化设计结构!
3、TDD两大原则中蕴含的三个阶段?——
“不可运行/可运行/重构”就是TDD的口号!
(1)不可运行!
(2)可运行!
(3)重构!
TDD开发方法更多是
一个管理你在编程过程中的担心和忧虑的方式!
5、本书的结构
本书由三部分组成:
第一部分:用TDD方法实现的典型例子;
第三部分:TDD开发的一些模式。
第一章 故事背景(Story Time)
第二章 资金实例(Money Example)
1、介绍了实例中TDD开发的步骤:
(1)快速建立一个测试;
(2)运行所有建立的测试,发现有新增加的测试不能通过;
(3)对失败的测试做一些小改动;
(4)再次运行所有测试,并发现全部通过;
第三章 资金实例测试(Money Example)
1、TDD并不是非要采取一小步一小步这样的开发过程,而是要培养你能够把开发过程化为这样一小步一小步的开发任务的能力。
存在的问题:
(1)汇率转换问题,当汇率为2:1时,5美元 + 10法郎 = 10美元;
(3)将amount定义为私有;
(4)Dollar类有副作用吗?
(5)钱数为整数;
(6)实现equals()函数;
(7)实现hashCode()函数;
(8)与空对象判等;
(9)与非同类对象判等;
(10)5法郎 * 2 = 10法郎;
同步工程实践:
publicclasstestDollarextendsTestCase{
publicvoidtestMultiplication(){
Dollarfive=newDollar(5);//此时amount=5
five.times(2);//此时amount=5*2
assertEquals(10,five.amount);
five.times(3);//此时amount=10*3--已经不是原先amount
assertEquals(15,five.amount);
}
}
publicclassDollar{
publicintamount=0;
publicDollar(intamount){
this.amount=amount;
}
publicDollartimes(intmultiplier){
returnnewDollar(amount*multiplier);
}
}
publicclasstestDollarextendsTestCase{
voidtestMultiplication(){
Dollarfive=newDollar(5);//此时amount=5
Dollarproduct=five.times(2);//此时amount=5*2
assertEquals(10,product.amount);
product=five.times(3);
assertEquals(15,product.amount);
}
}
测试通过,消除了Dollar类的副作用!