这两天翻了下 Kent Beck 的 Test-Driven Development By Example 感觉还不错,第一部分的例子讲的挺好,本来想归纳一下,貌似太长了,等有时间了再归纳下,最后看到了附录里面的一个Fibonacci数列的例子感觉也有那么点TDD的味道在里面,总结分享一下:
让我们从最简单的fibonacci(0)=0开始吧,先写测试如下:
java 代码
- import junit.framework.TestCase;
-
- public class TestFibonacci extends TestCase {
- public void testFibonacci(){
- assertEquals(0,fibonacci(0));
- }
- }
添加fibonacci方法的简单实现即可:
java 代码
- private int fibonacci(int i) {
- return 0;
- }
很显然顺利通过了测试;
再加一个测试实现fibonacci(1)=1;如下:
java 代码
- import junit.framework.TestCase;
-
- public class TestFibonacci extends TestCase {
- public void testFibonacci(){
- assertEquals(0,fibonacci(0));
- assertEquals(1,fibonacci(1));
- }
- }
为了顺利通过测试,只需简单的改动下fibonacci方法实现即可;
java 代码
- private int fibonacci(int i) {
- if(i==0) return 0;
- else return 1;
- }
在添加第三个测试条件fibonacci(2)=1时候发现,随着测试条件的增多无疑带来了大量的断言重复代码,通过分析我们可以将testFibonacci方法改写如下:
java 代码
- public void testFibonacci(){
- int cases[][]={{0,0},{1,1}};
- for(int i=0;i
- assertEquals(cases[i][1],fibonacci(cases[i][0]));
- }
这样我们就可以很容易的添加测试条件:fibonacci(2)=1;
java 代码
- import junit.framework.TestCase;
-
- public class TestFibonacci extends TestCase {
- public void testFibonacci(){
- int cases[][]={{0,0},{1,1},{2,1}};
- for(int i=0;i
- assertEquals(cases[i][1],fibonacci(cases[i][0]));
- }
-
- private int fibonacci(int i) {
- if(i==0) return 0;
- else return 1;
- }
- }
嘿嘿,很顺利,状态条依然出现的是绿色,那我们就不管代码到底合不合理了,出现绿色就是王道,继续添加下一个测试条件:fibonacci(3)=2;
java 代码
- import junit.framework.TestCase;
-
- public class TestFibonacci extends TestCase {
- public void testFibonacci(){
- int cases[][]={{0,0},{1,1},{2,1},{3,2}};
- for(int i=0;i
- assertEquals(cases[i][1],fibonacci(cases[i][0]));
- }
-
- private int fibonacci(int i) {
- if(i==0) return 0;
- else return 1;
- }
- }
终于又出现红色了,it fails .说明我们又将快有新进展了.为了满足fibonacci(3)=2,也很简单,简单的修改下fibonacci方法即可,如下:
java 代码
- private int fibonacci(int i) {
- if(i==0) return 0;
- if(i<=2) return 1;
- else return 2;
- }
又出现绿色了吧! 这里返回的2可以表示为1+1;
我们可以写成:
java 代码
- private int fibonacci(int i) {
- if(i==0) return 0;
- if(i<=2) return 1;
- else return 1+1;
- }
很明显,这里的第一个1可以写成fibonacci(i-1):
java 代码
- private int fibonacci(int i) {
- if(i==0) return 0;
- if(i<=2) return 1;
- else return fibonacci(i-1)+1;
- }
第二个1可以写成fibonacci(i-2):
java 代码
- private int fibonacci(int i) {
- if(i==0) return 0;
- if(i<=2) return 1;
- else return fibonacci(i-1)+fibonacci(i-2);
- }
最终的程序:
java 代码
- import junit.framework.TestCase;
-
- public class TestFibonacci extends TestCase {
- public void testFibonacci(){
- int cases[][]={{0,0},{1,1},{2,1},{3,2}};
- for(int i=0;i
- assertEquals(cases[i][1],fibonacci(cases[i][0]));
- }
-
- private int fibonacci(int i) {
- if(i==0) return 0;
- if(i==1) return 1;
- else return fibonacci(i-1)+fibonacci(i-2);
- }
- }
再添加测试条件:fibonacci(4)=3;fibonacci(5)=5:
java 代码
- import junit.framework.TestCase;
-
- public class TestFibonacci extends TestCase {
- public void testFibonacci(){
- int cases[][]={{0,0},{1,1},{2,1},{3,2},{4,3},{5,5}};
- for(int i=0;i
- assertEquals(cases[i][1],fibonacci(cases[i][0]));
- }
-
- private int fibonacci(int i) {
- if(i==0) return 0;
- if(i==1) return 1;
- else return fibonacci(i-1)+fibonacci(i-2);
- }
- }
依然是绿色,呵呵,我们得到了正确的Fibonacci数列,驱动源于测试.
附:
Fibonacci数列简介:Fibonacci数列从第0项开始依次为0,1,1,2,3,5,8……的数列,它存在如下特点:第0,1个数为0,1。从第2个数开始,该数是前面两个数之和。即该数列第n项的值满足如下公式:
分享到:
相关推荐
- **Chapter 38: Fibonacci** - 通过斐波那契数列的例子,展示 TDD 的实际操作过程。 #### 四、TDD的关键技术与工具 - **单元测试框架**:如 JUnit、NUnit 等。 - **持续集成/持续部署(CI/CD)工具**:如 Jenkins...
测试驱动开发(Test-Driven Development, 简称TDD)是一种软件开发方法,它强调在编写实际代码之前先编写测试。"Kata"在编程领域中是指一种重复练习特定编程任务的方式,以提高技能和熟悉特定技术。在这个"Tdd-kata...
其中,测试驱动开发(TDD)是一种流行的编程实践,它要求先编写测试用例,然后编写最小化的代码来通过这些测试。这样做可以确保代码的正确性和健壮性。 @stephenlloyd提出的TDD保龄球比赛周末挑战,可能是指一个...
《测试驱动开发示例》是由Kent Beck撰写的一本关于TDD(Test-Driven Development,测试驱动开发)的经典书籍。本书特别适合Java开发人员阅读,它不仅介绍了TDD的基本概念和实践方法,还通过实际案例,一步步带领读者...
在MATLAB单元测试框架中,测试驱动开发可以用于算法开发,例如使用fibonacci数列或者算符重载和量纲分析等案例。 最后,基于类的单元测试也是框架支持的测试方式。在这种风格下,用户通过提供测试类来进行测试。...
- 测试驱动开发:先写测试用例,再编写满足测试的代码,如TDD、XP。 - 代码审查关注点:清晰性、效率、可维护性等。 - 抽象类与接口:抽象类提供部分实现,接口定义行为契约。 5. **算法**: - 数字性质检查:...
在这个项目中,开发人员利用了测试驱动开发(TDD)的方法,并在开发过程中融入了一些幽默元素,以增加项目的趣味性和可玩性。 斐波那契数列是数学中的一个重要概念,它是一系列数字,其中每个数字是前两个数字的和...
- 测试驱动开发(TDD)和行为驱动开发(BDD)的理解。 - 代码优化和性能调优技巧。 10. 问题解决能力: - 思路清晰,能够将复杂问题分解为可操作的小部分。 - 逻辑严谨,避免出现逻辑漏洞。 - 能够用伪代码或...
4. **测试驱动开发**:通过编写测试用例来验证代码的正确性,TDD(Test-Driven Development)的实践可能贯穿于整个代码编写过程中。 通过对这些知识点的深入理解和实践,读者不仅可以掌握数据结构和算法的基础,还...
如果项目包含测试代码,还能进一步了解TDD(Test Driven Development,测试驱动开发)和持续集成/持续部署(CI/CD)的概念。 总的来说,"fibonacy-calculator"项目是一个很好的学习资源,涵盖了JavaScript编程、...
总之,"javascript-Algorithms-with-jest"项目是学习和提升JavaScript算法技能的宝贵资源,结合Jest提供的强大测试支持,可以帮助开发者建立坚实的算法基础,并锻炼测试驱动开发(TDD)的能力。通过参与这个项目,你...
这对于我们理解测试驱动开发(TDD)的理念和实践也是大有裨益的。 在深入研究这些解决方案时,我们还能发现如何利用Java的标准库,如`java.util`中的工具类和`java.math`包下的高精度数值计算类。这些库为开发者...
- 测试驱动开发(TDD):编写测试用例先于功能代码,确保代码质量。 - 代码重构:改善代码结构和可读性,但不改变其行为。 5. 实践挑战的步骤: - 问题理解:分析题目需求,确定输入和输出格式。 - 设计解决...
- 测试驱动开发(TDD):先写测试用例,再编写代码以通过测试。 通过阅读 "leetcode-master" 中的代码,我们可以学习到不同问题的解题思路,以及不同算法在实际问题中的应用。这不仅能加深对算法和数据结构的理解...
通过解决这些code kata,开发者不仅能增强对JavaScript语言的理解,还能提升问题解决能力,培养良好的编程习惯,比如代码复用、测试驱动开发(TDD)和持续集成。同时,这也有助于适应不同的编程挑战和面试场景。 ...
7. **测试支持(TDD友好)**:Struts2的测试驱动开发支持使单元测试和集成测试变得简单,有助于保证代码质量。 8. **国际化(Internationalization)**:Struts2内置了对多语言的支持,可以通过资源文件轻松实现界面的...
- **测试驱动开发(TDD)**:编写单元测试,确保代码正确性。 - **性能优化**:分析和优化代码性能,减少时间复杂度和空间复杂度。 总的来说,通过LeetCode上的Java编程挑战,不仅可以巩固和提升基础的编程技能,还...
11. **单元测试**: TDD(测试驱动开发)是现代软件开发的一个重要实践。JUnit等测试框架的使用可以帮助开发者确保代码的正确性。 12. **性能优化**: 通过分析和调优,如内存管理、垃圾回收、CPU占用等,提升程序...
6. **测试驱动开发(TDD)**:先写测试后写代码,确保代码质量。 7. **重构**:如何改进既有代码,使其更简洁、更易读。 8. **代码风格**:遵循一定的编码规范,保持代码一致性。 9. **设计原则**:开闭原则、依赖...
10. **测试驱动开发(TDD)**:如何编写单元测试,确保算法的正确性。 11. **包管理与发布**:了解如何使用npm来管理和发布自己的包,以及如何在项目中引用外部包。 以上是基于一个基础算法库可能包含的知识点,具体...