《Test-Driven development By Example》阅读(一)

前端之家收集整理的这篇文章主要介绍了《Test-Driven development By Example》阅读(一)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
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)重构!
4、为什么软件工程师还要写自动程序测试的代码?为什么一个设计观念就可以让软件瞬息万变的软件工程师却要一小步一小步的工作?—— 我们需要勇气!增加代码质量的信心
TDD开发方法更多是 一个管理你在编程过程中的担心和忧虑的方式
5、本书的结构
本书由三部分组成:
第一部分:用TDD方法实现的典型例子;
第二部分:一个用来测试更复杂逻辑的实例,通过建立自动测试框架来进行测试,包括反射和异常;
第三部分:TDD开发的一些模式。
第一章 故事背景(Story Time)
第二章 资金实例(Money Example)
1、介绍了实例中TDD开发的步骤:
(1)快速建立一个测试;
(2)运行所有建立的测试,发现有新增加的测试不能通过;
(3)对失败的测试做一些小改动;
(4)再次运行所有测试,并发现全部通过;
(5)重构测试代码,并去除冗余。
第三章 资金实例测试(Money Example)
1、TDD并不是非要采取一小步一小步这样的开发过程,而是要培养你能够把开发过程化为这样一小步一小步的开发任务的能力。
存在的问题:
(1)汇率转换问题,当汇率为2:1时,5美元 + 10法郎 = 10美元;
(2)5美元 * 2 = 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);
}
}
为了消除此问题,对原先Dollar类的times()方法进行修改
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类的副作用!

猜你在找的设计模式相关文章