`
温柔一刀
  • 浏览: 862306 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

(TDD)测试驱动开发小例------Fibonacci数列

阅读更多

这两天翻了下 Kent  Beck 的 Test-Driven Development By Example 感觉还不错,第一部分的例子讲的挺好,本来想归纳一下,貌似太长了,等有时间了再归纳下,最后看到了附录里面的一个Fibonacci数列的例子感觉也有那么点TDD的味道在里面,总结分享一下:

让我们从最简单的fibonacci(0)=0开始吧,先写测试如下:

java 代码
  1. import junit.framework.TestCase;       
  2.       
  3. public class TestFibonacci extends TestCase {       
  4.     public void testFibonacci(){       
  5.         assertEquals(0,fibonacci(0));       
  6.     }           
  7. }      

添加fibonacci方法的简单实现即可:

java 代码
  1. private int fibonacci(int i) {             
  2.         return 0;       
  3.     }      

很显然顺利通过了测试;

再加一个测试实现fibonacci(1)=1;如下:

java 代码
  1. import junit.framework.TestCase;       
  2.       
  3. public class TestFibonacci extends TestCase {       
  4.     public void testFibonacci(){       
  5.         assertEquals(0,fibonacci(0));       
  6.         assertEquals(1,fibonacci(1));       
  7.     }           
  8. }      

为了顺利通过测试,只需简单的改动下fibonacci方法实现即可;

java 代码
  1. private int fibonacci(int i) {             
  2.         if(i==0return 0;       
  3.         else return 1;       
  4.     }      

在添加第三个测试条件fibonacci(2)=1时候发现,随着测试条件的增多无疑带来了大量的断言重复代码,通过分析我们可以将testFibonacci方法改写如下:

java 代码
  1. public void testFibonacci(){   
  2.         int cases[][]={{0,0},{1,1}};   
  3.         for(int i=0;i
  4.             assertEquals(cases[i][1],fibonacci(cases[i][0]));      
  5.     }  

这样我们就可以很容易的添加测试条件:fibonacci(2)=1;

java 代码
  1. import junit.framework.TestCase;   
  2.   
  3. public class TestFibonacci extends TestCase {   
  4.     public void testFibonacci(){   
  5.         int cases[][]={{0,0},{1,1},{2,1}};   
  6.         for(int i=0;i
  7.             assertEquals(cases[i][1],fibonacci(cases[i][0]));      
  8.     }   
  9.   
  10.     private int fibonacci(int i) {         
  11.         if(i==0return 0;   
  12.         else return 1;   
  13.     }   
  14. }  

嘿嘿,很顺利,状态条依然出现的是绿色,那我们就不管代码到底合不合理了,出现绿色就是王道,继续添加下一个测试条件:fibonacci(3)=2;

java 代码
  1. import junit.framework.TestCase;   
  2.   
  3. public class TestFibonacci extends TestCase {   
  4.     public void testFibonacci(){   
  5.         int cases[][]={{0,0},{1,1},{2,1},{3,2}};   
  6.         for(int i=0;i
  7.             assertEquals(cases[i][1],fibonacci(cases[i][0]));      
  8.     }   
  9.   
  10.     private int fibonacci(int i) {         
  11.         if(i==0return 0;   
  12.         else return 1;   
  13.     }   
  14. }  

终于又出现红色了,it fails .说明我们又将快有新进展了.为了满足fibonacci(3)=2,也很简单,简单的修改下fibonacci方法即可,如下:
java 代码
  1. private int fibonacci(int i) {         
  2.         if(i==0return 0;   
  3.         if(i<=2return 1;   
  4.         else return 2;   
  5.     }  


又出现绿色了吧! 这里返回的2可以表示为1+1;

我们可以写成:

java 代码
  1. private int fibonacci(int i) {         
  2.         if(i==0return 0;   
  3.         if(i<=2return 1;   
  4.         else return 1+1;   
  5.     }  

很明显,这里的第一个1可以写成fibonacci(i-1):
java 代码
  1. private int fibonacci(int i) {         
  2.         if(i==0return 0;   
  3.         if(i<=2return 1;   
  4.         else return fibonacci(i-1)+1;   
  5.     }  

第二个1可以写成fibonacci(i-2):
java 代码
  1. private int fibonacci(int i) {         
  2.         if(i==0return 0;   
  3.         if(i<=2return 1;   
  4.         else return fibonacci(i-1)+fibonacci(i-2);   
  5.     }  

最终的程序:

java 代码
  1. import junit.framework.TestCase;   
  2.   
  3. public class TestFibonacci extends TestCase {   
  4.     public void testFibonacci(){   
  5.         int cases[][]={{0,0},{1,1},{2,1},{3,2}};   
  6.         for(int i=0;i
  7.             assertEquals(cases[i][1],fibonacci(cases[i][0]));      
  8.     }   
  9.   
  10.     private int fibonacci(int i) {         
  11.         if(i==0return 0;   
  12.         if(i==1return 1;   
  13.         else return fibonacci(i-1)+fibonacci(i-2);   
  14.     }   
  15. }  

再添加测试条件:fibonacci(4)=3;fibonacci(5)=5:

java 代码
  1. import junit.framework.TestCase;   
  2.   
  3. public class TestFibonacci extends TestCase {   
  4.     public void testFibonacci(){   
  5.         int cases[][]={{0,0},{1,1},{2,1},{3,2},{4,3},{5,5}};   
  6.         for(int i=0;i
  7.             assertEquals(cases[i][1],fibonacci(cases[i][0]));      
  8.     }   
  9.   
  10.     private int fibonacci(int i) {         
  11.         if(i==0return 0;   
  12.         if(i==1return 1;   
  13.         else return fibonacci(i-1)+fibonacci(i-2);   
  14.     }   
  15. }  

依然是绿色,呵呵,我们得到了正确的Fibonacci数列,驱动源于测试.

附:

Fibonacci数列简介:Fibonacci数列从第0项开始依次为0,1,1,2,3,5,8……的数列,它存在如下特点:第0,1个数为0,1。从第2个数开始,该数是前面两个数之和。即该数列第n项的值满足如下公式:

http://zhupan.iteye.com/upload/picture/pic/1449/c2c970c3-04ff-485c-8587-80e3d1836397.gif

分享到:
评论
14 楼 liuzongan 2007-05-31  
非常好,学习中!!
13 楼 gigix 2007-05-23  
悠悠吾心 写道
最近也看了一些TDD的书,感到比较迷惑,书中的例子都是非常简单的,一直不明白的就是如何在大型系统的开发中运用TDD

实际上99%的程序都应该是简单的。大多数人在大多数时候的问题不是解决不了复杂的问题,而是不知道怎么用简单的办法解决简单的问题。
12 楼 抛出异常的爱 2007-05-23  
悠悠吾心 写道
最近也看了一些TDD的书,感到比较迷惑,书中的例子都是非常简单的,一直不明白的就是如何在大型系统的开发中运用TDD
如果没有设计几千行代码的一个类比比皆 是。。
如果设计了。。。。很难想象一个几千行代码类的存在。。。

不是例子简单。是设计用的时间比较长而已
11 楼 悠悠吾心 2007-05-23  
最近也看了一些TDD的书,感到比较迷惑,书中的例子都是非常简单的,一直不明白的就是如何在大型系统的开发中运用TDD
10 楼 温柔一刀 2006-12-15  
yuxie 写道
呵呵,不知道楼主有没有看过这个帖子
http://www.iteye.com/topic/6551
有对此更加深刻的讨论,同时此贴也是家爱跑题强贴之一。。。


呵呵,sorry,没有注意过,刚才从头到尾看了一遍
2004年的啊,当时TDD在国内还没有现在这么火吧
果然是跑题强贴啊,TDD直接变成了算法讨论,呵呵,不过还是有很大收获
9 楼 clamp 2006-12-15  
我觉得拿纯算法型的来举TDD的例子不是很合适,假如有一个数学家来给你需求的话,他很可能不告诉你F(n)=F(n-1)+F(n-2),而是直接告诉你通项公式。
比如F(n)=[(1+√5)/2]^n /√5 - [(1-√5)/2]^n /√5

事实上,我认为这种纯数学函数性质的东西是不适合用测试驱动开发的。因为要确保结果正确,就是把测试断言里面的条件写的和方法本身的条件一样。

8 楼 抛出异常的爱 2006-12-15  
花花公子 写道
我们的开发人员一般拿单元测试逐断查找问题用。javascript的单元测试可能比java的更多。

介绍一下....例子
想找这种东西好久了...
7 楼 yuxie 2006-12-15  
呵呵,不知道楼主有没有看过这个帖子
http://www.iteye.com/topic/6551
有对此更加深刻的讨论,同时此贴也是家爱跑题强贴之一。。。
6 楼 花花公子 2006-12-14  
我们的开发人员一般拿单元测试逐断查找问题用。javascript的单元测试可能比java的更多。
5 楼 温柔一刀 2006-12-14  
lighter 写道
温柔一刀 写道
理解不到位的地方就多拍块砖哈,最近对TDD产生了浓厚的兴趣,多拍砖进步快

最近也对TDD发生很大的兴趣,才看了一些书,不过实践讲TDD的书好像少了一些;
温柔一刀,能不能推荐一本TDD在开发WEB程序时与数据库相交互时实践性的书啊?
<<Test_Drivent Development A Practical Guide>>只是讲一下SWING界面交互开发的TDD实践

我也想看看这方面的书,但是不知道什么书讲了web的,比如用strurs/webwork/springmvc+spring+hibernate之类的框架开发的话怎么实践TDD?不知道有没有团队采用strurs/webwork/springmvc+spring+hibernate开发时用了TDD,能分享下经验就好了
4 楼 lighter 2006-12-14  
温柔一刀 写道
理解不到位的地方就多拍块砖哈,最近对TDD产生了浓厚的兴趣,多拍砖进步快

最近也对TDD发生很大的兴趣,才看了一些书,不过实践讲TDD的书好像少了一些;
温柔一刀,能不能推荐一本TDD在开发WEB程序时与数据库相交互时实践性的书啊?
<<Test_Drivent Development A Practical Guide>>只是讲一下SWING界面交互开发的TDD实践
3 楼 温柔一刀 2006-12-14  
lighter 写道
感觉<<Test-Driven Development By Example>>太多繁琐话了一点,不过书很薄,很快可以看完.
我刚开始看TDD的时候是看<<Test_Drivent Development A Practical Guide>>这一本书的中文版,作为入门很好.
ps:如果代码是楼主自己写的,会投精华的,哈哈,现在不投


呵呵,确实,讲的不错,一天就看完了英文版,又花了一天翻了下中文版,加深理解
代码全部是自己敲的
呵呵,自己是一边敲代码测试,一边写blog,以免出现失误被拍,呵呵
2 楼 温柔一刀 2006-12-14  
理解不到位的地方就多拍块砖哈,最近对TDD产生了浓厚的兴趣,多拍砖进步快
1 楼 lighter 2006-12-14  
感觉<<Test-Driven Development By Example>>太多繁琐话了一点,不过书很薄,很快可以看完.
我刚开始看TDD的时候是看<<Test_Drivent Development A Practical Guide>>这一本书的中文版,作为入门很好.
ps:如果代码是楼主自己写的,会投精华的,哈哈,现在不投

相关推荐

    tdd_by_example.pdf

    - **Chapter 38: Fibonacci** - 通过斐波那契数列的例子,展示 TDD 的实际操作过程。 #### 四、TDD的关键技术与工具 - **单元测试框架**:如 JUnit、NUnit 等。 - **持续集成/持续部署(CI/CD)工具**:如 Jenkins...

    tdd-kata:测试驱动开发 Katas

    测试驱动开发(Test-Driven Development, 简称TDD)是一种软件开发方法,它强调在编写实际代码之前先编写测试。"Kata"在编程领域中是指一种重复练习特定编程任务的方式,以提高技能和熟悉特定技术。在这个"Tdd-kata...

    fibonacci:JavaScript 中的斐波那契数列

    其中,测试驱动开发(TDD)是一种流行的编程实践,它要求先编写测试用例,然后编写最小化的代码来通过这些测试。这样做可以确保代码的正确性和健壮性。 @stephenlloyd提出的TDD保龄球比赛周末挑战,可能是指一个...

    test driven development by example

    《测试驱动开发示例》是由Kent Beck撰写的一本关于TDD(Test-Driven Development,测试驱动开发)的经典书籍。本书特别适合Java开发人员阅读,它不仅介绍了TDD的基本概念和实践方法,还通过实际案例,一步步带领读者...

    matlab函数单元测试案例

    在MATLAB单元测试框架中,测试驱动开发可以用于算法开发,例如使用fibonacci数列或者算符重载和量纲分析等案例。 最后,基于类的单元测试也是框架支持的测试方式。在这种风格下,用户通过提供测试类来进行测试。...

    JAVA面试题集.doc

    - 测试驱动开发:先写测试用例,再编写满足测试的代码,如TDD、XP。 - 代码审查关注点:清晰性、效率、可维护性等。 - 抽象类与接口:抽象类提供部分实现,接口定义行为契约。 5. **算法**: - 数字性质检查:...

    斐波那契娱乐前端

    在这个项目中,开发人员利用了测试驱动开发(TDD)的方法,并在开发过程中融入了一些幽默元素,以增加项目的趣味性和可玩性。 斐波那契数列是数学中的一个重要概念,它是一系列数字,其中每个数字是前两个数字的和...

    华为摩托罗拉等公司面试题(程序设计)

    - 测试驱动开发(TDD)和行为驱动开发(BDD)的理解。 - 代码优化和性能调优技巧。 10. 问题解决能力: - 思路清晰,能够将复杂问题分解为可操作的小部分。 - 逻辑严谨,避免出现逻辑漏洞。 - 能够用伪代码或...

    Chapter-1-Source-Code.rar_Noé 1

    4. **测试驱动开发**:通过编写测试用例来验证代码的正确性,TDD(Test-Driven Development)的实践可能贯穿于整个代码编写过程中。 通过对这些知识点的深入理解和实践,读者不仅可以掌握数据结构和算法的基础,还...

    fibonacy-calculator:一个简单的回购描述了多服务应用程序如何运行和部署

    如果项目包含测试代码,还能进一步了解TDD(Test Driven Development,测试驱动开发)和持续集成/持续部署(CI/CD)的概念。 总的来说,"fibonacy-calculator"项目是一个很好的学习资源,涵盖了JavaScript编程、...

    javascript-Algorithms-with-jest

    总之,"javascript-Algorithms-with-jest"项目是学习和提升JavaScript算法技能的宝贵资源,结合Jest提供的强大测试支持,可以帮助开发者建立坚实的算法基础,并锻炼测试驱动开发(TDD)的能力。通过参与这个项目,你...

    Project-Euler-Solutions:解决方案from projecteuler.net

    这对于我们理解测试驱动开发(TDD)的理念和实践也是大有裨益的。 在深入研究这些解决方案时,我们还能发现如何利用Java的标准库,如`java.util`中的工具类和`java.math`包下的高精度数值计算类。这些库为开发者...

    pratice_problems:编码挑战问题

    - 测试驱动开发(TDD):编写测试用例先于功能代码,确保代码质量。 - 代码重构:改善代码结构和可读性,但不改变其行为。 5. 实践挑战的步骤: - 问题理解:分析题目需求,确定输入和输出格式。 - 设计解决...

    leetcode:leetcode的个人答案

    - 测试驱动开发(TDD):先写测试用例,再编写代码以通过测试。 通过阅读 "leetcode-master" 中的代码,我们可以学习到不同问题的解题思路,以及不同算法在实际问题中的应用。这不仅能加深对算法和数据结构的理解...

    code-katas:代码集及其解决方案

    通过解决这些code kata,开发者不仅能增强对JavaScript语言的理解,还能提升问题解决能力,培养良好的编程习惯,比如代码复用、测试驱动开发(TDD)和持续集成。同时,这也有助于适应不同的编程挑战和面试场景。 ...

    struts2 in action

    7. **测试支持(TDD友好)**:Struts2的测试驱动开发支持使单元测试和集成测试变得简单,有助于保证代码质量。 8. **国际化(Internationalization)**:Struts2内置了对多语言的支持,可以通过资源文件轻松实现界面的...

    leetcode

    - **测试驱动开发(TDD)**:编写单元测试,确保代码正确性。 - **性能优化**:分析和优化代码性能,减少时间复杂度和空间复杂度。 总的来说,通过LeetCode上的Java编程挑战,不仅可以巩固和提升基础的编程技能,还...

    java-challenges:回购解决算法挑战

    11. **单元测试**: TDD(测试驱动开发)是现代软件开发的一个重要实践。JUnit等测试框架的使用可以帮助开发者确保代码的正确性。 12. **性能优化**: 通过分析和调优,如内存管理、垃圾回收、CPU占用等,提升程序...

    刷LeetCode刷LeetCode刷LeetCode刷LeetCode

    6. **测试驱动开发(TDD)**:先写测试后写代码,确保代码质量。 7. **重构**:如何改进既有代码,使其更简洁、更易读。 8. **代码风格**:遵循一定的编码规范,保持代码一致性。 9. **设计原则**:开闭原则、依赖...

    basic-ts-algorithms:具有使用打字稿编写的一组基本算法的库

    10. **测试驱动开发(TDD)**:如何编写单元测试,确保算法的正确性。 11. **包管理与发布**:了解如何使用npm来管理和发布自己的包,以及如何在项目中引用外部包。 以上是基于一个基础算法库可能包含的知识点,具体...

Global site tag (gtag.js) - Google Analytics