测试驱动开发TDD实战与模式解析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实例演示----Fibonacci数列
• • • • • • • • • •
为了能让测试通过,我们编写如下代码: int fib(int n) { if(n==0) return 0; return 1; } 绿条模式,测试通过! 从测试代码中我们看到: assertEquals(0,Fib(0)); assertEquals(1,Fib(1));
TDD
测试驱动开发TDD
实战与模式解析
概述
• Kent Beck先生最早在其极限编程(XP)方 法论中,向大家推荐“测试驱动”这一最 佳实践,还专门撰写了《测试驱动开发》 一书,详细说明如何实现。经过几年的迅 猛发展,测试驱动开发已经成长为一门独 立的软件开发技术,其名气甚至盖过了极 限编程。
简介
开发过程
• • • • •
(5) 测试通过。 (6) 对代码进行重构,并保证测试通过。 (7) 循环完成所有功能的开发。 更概括的来说,可以分为三部曲: 红条模式 绿条模式 重构
实例演示----Fibonacci 数列
• • • • • •
测试驱动开发,那么测试先行是必然的了. 第一个测试: public void testFibonacci(){ assertEquals(0,fib(0)); } 我们都知道:Fibonacci 数列的第一个数是 0,现在测试代码有了,那么我们先运行一下 测试吧. • 报错,红条模式! • 显然,因为我们甚至还没有fib()这个函数! • 我们赶紧让这个测试通过吧,于是添加如下
实例演示----Fibonacci数列
• • • • • • • • • • • int fib(int n) { return 0; } 绿条模式,测试通过! 第二个测试 public void testFibonacci() { assertEquals(0,Fib(0)); assertEquals(1,Fib(1)); }
• 现在,我们准备对上面的代码进行重构。 我们将返回值设置为2,但是,我们的真正 的用意并不是2,而是1+1,第一个1是 fib(n-1)的一个实例,第二个1是fib(n-2)的一 个实例: • int fib(int n) • { • if(n==0) return 0; • if(n<=2) return 1; • return fib(n-1)+fib(n-2); • }
Байду номын сангаас
实例演示----Fibonacci数列
• • • • • • • •
对于fib(2)来说,上面的结构同样可以工作, 所以我们对上面的代码结构进一步重构: int fib(int n) { if(n<=1) return 1; return fib(n-1)+fib(n-2); } 运行上述所有测试,绿条模式,全部测试 通过!
演示实例----Fibonacci数列
• 红条模式!测试失败,修改功能代码如下:
• • • • • • • int fib(int n) { if(n==0) return 0; if(n<=2) return 1; return 2; } 绿条模式!测试通过!
实例演示----Fibonacci数列
演示实例----Fibonacci数列
• 这样添加测试代码就容易多了. • 测试代码改过了,再运行下,绿条模式!还能通 过,那我们就可以放心继续了!
• public void testFibonacci • { • int cases[][]={{0,0},{1,1},{2,1},{3,2}}; • for(int i=0; i<cases.length;i++) • assertEquals(cases[i][1],fib(cases[i][0])); • }
优点
• (1)完工时完工。表明开发人员可以很清楚 的看到自己的这段工作已经结束了,而传 统的方式很难知道什么时候编码工作结束 了。 • (2)全面正确的认识代码和利用代码,而传 统的方式没有这个机会。 • (3)开发小组间降低了交流成本,提高了相 互信赖程度。 • (4)避免了过渡设计。
优点
• (5)系统可以与详尽的测试集一起发布,从 而对程序的将来版本的修改和扩展提供方 便。 • (6)逃避了设计角色。对于一个敏捷的开发 小组,每个人都在做设计。 • (7)大部分时间代码处在高质量状态,100% 的时间里成果是可见的。 • (8)由于可以保证编写测试和编写代码的是 相同的程序员,降低了理解代码所花费的 成本。
实例演示----Fibonacci 数列
• 重复!不仅在源代码,就是在测试代码中,我们 也要避免重复!(因为测试代码中也会出现模 式!) • 改写测试代码: • public void testFibonacci • { • int cases[][]={{0,0},{1,1},{2,1}}; • for(int i=0; i<cases.length;i++) • assertEquals(cases[i][1],fib(cases[i][0])); • }
• 测试驱动开发(Test Driven Development, 英文缩写TDD)是极限编程的一个重要组 成部分,它的基本思想就是在开发功能代 码之前,先编写测试代码。也就是说在明 确要开发某个功能后,首先思考如何对这 个功能进行测试,并完成测试代码的编写, 然后编写相关的代码满足这些测试用例。 然后循环进行添加其他功能,直到完成全 部功能的开发。代码整洁可用(clean code that works) 是测试驱动开发所追求的目标。
优点
• (9)为减少文档和代码之间存在的细微的差 别和由这种差别所引入的Bug作出杰出贡献。 • (10)在预先设计和紧急设计之间建立一种平 衡点,区分哪些设计该事先做、哪些设计 该迭代时做提供了一个可靠的判断依据。 • (12)发现比传统测试方式更多的Bug
开发过程
• 概括起来,测试驱动开发的基本过程如下: • (1) 明确当前要完成的功能。可以记录成一 个 TODO 列表。 • (2) 快速完成针对此功能的测试用例编写。 • (3) 测试代码编译不通过。 • (4) 编写对应的功能代码。
相关文档
最新文档