实践题目:分解质因数
Step1:
单元测试:
package com.bijian.study.factor.test; import java.util.Arrays; import junit.framework.Assert; import org.junit.Before; import org.junit.Test; import com.bijian.study.factor.Factor; public class FactorTest { private Factor factor; @Before public void setUp() { factor = new Factor(); } @Test public void test_factor() { Assert.assertEquals(Arrays.asList(2), factor.getFactors(2)); Assert.assertEquals(Arrays.asList(3), factor.getFactors(3)); } }
编写测试通过的代码:
package com.bijian.study.factor; import java.util.ArrayList; import java.util.List; public class Factor { public List<Integer> getFactors(int i) { List<Integer> resList = new ArrayList<Integer>(); resList.add(i); return resList; } }
Step2:
再编写一个不通过的单元测试案例:
Assert.assertEquals(Arrays.asList(2,2), factor.getFactors(4));
修改代码,让单元测试案例通过:
package com.bijian.study.factor; import java.util.ArrayList; import java.util.List; public class Factor { public List<Integer> getFactors(int i) { List<Integer> resList = new ArrayList<Integer>(); if(i % 2 == 0 && i != 2) { resList.add(2); i = i/2; } resList.add(i); return resList; } }
Step3:
再编写如下单元测试案例,发现最后一个案例不能通过
Assert.assertEquals(Arrays.asList(5), factor.getFactors(5)); Assert.assertEquals(Arrays.asList(2,3), factor.getFactors(6)); Assert.assertEquals(Arrays.asList(7), factor.getFactors(7)); Assert.assertEquals(Arrays.asList(2,2,2), factor.getFactors(8));
修改代码,如下:
package com.bijian.study.factor; import java.util.ArrayList; import java.util.List; public class Factor { public List<Integer> getFactors(int i) { List<Integer> resList = new ArrayList<Integer>(); while(i % 2 == 0 && i != 2) { resList.add(2); i = i/2; } resList.add(i); return resList; } }
Step4:
增加如下单元测试案例
Assert.assertEquals(Arrays.asList(3,3), factor.getFactors(9));
修改代码:
package com.bijian.study.factor; import java.util.ArrayList; import java.util.List; public class Factor { public List<Integer> getFactors(int i) { List<Integer> resList = new ArrayList<Integer>(); while(i % 2 == 0 && i != 2) { resList.add(2); i = i/2; } while(i % 3 == 0 && i != 3) { resList.add(3); i = i/3; } resList.add(i); return resList; } }
Step5:
增加单元测试案例如下,发现最后一个案例执行不通过:
Assert.assertEquals(Arrays.asList(2,5), factor.getFactors(10)); Assert.assertEquals(Arrays.asList(11), factor.getFactors(11)); Assert.assertEquals(Arrays.asList(2,2,3), factor.getFactors(12)); Assert.assertEquals(Arrays.asList(2,11,13), factor.getFactors(2*11*13));
修改代码如下:
package com.bijian.study.factor; import java.util.ArrayList; import java.util.List; public class Factor { public List<Integer> getFactors(int i) { List<Integer> resList = new ArrayList<Integer>(); for(int j=2;j<i;j++) { while(i % j == 0 && i != j) { resList.add(j); i = i/j; } } resList.add(i); return resList; } }
Step6:
随意增加单元测试案例,如下所示:
Assert.assertEquals(Arrays.asList(3,7,13,23), factor.getFactors(3*7*13*23));
测试通过,但这代码不易理解,我们来重构,重构后代码如下:
package com.bijian.study.factor; import java.util.ArrayList; import java.util.List; public class Factor { public List<Integer> getFactors(int factor) { List<Integer> resList = new ArrayList<Integer>(); for(int j=2;j<factor;j++) { while(factor % j == 0 && factor != j) { resList.add(j); factor = factor/j; } } resList.add(factor); return resList; } }
上面仅用到一个很简单的重构方法,重命名。
以上这些步骤或练习的过程就是Kata。Kata(路数练习)的思想就是通过反复练习来实践编码,在不断使用各种技能的过程中形成肌肉记忆。Kata从很多方面改善工作流程,比如编写测试、处理错误甚至编辑器的使用,更熟悉语言技巧。
附另一种分解质因数的方法:
public List<Integer> getFactors2(int factor) { List<Integer> resList = new ArrayList<Integer>(); for(int j=2;j<=factor;j++) { if(factor%j == 0) { resList.add(j); factor = factor/j; j=1; } } return resList; }
相关推荐
5. **TDD实践** 文件名中的“测试驱动开发TDD培训讲义.ppt”、“TDD_测试驱动开发.ppt”和“测试驱动开发—1.1_测试驱动开发简介.ppt”很可能包含了关于TDD的详细讲解,涵盖了TDD的概念、原则、实践技巧以及如何在...
本项目是一个基于Java语言的TDD(测试驱动开发)实践应用设计源码,共包含49个文件,其中包括14个可执行文件、14个Java源代码文件、11个锁定文件、6个Gradle构建脚本文件、2个属性文件、1个Git忽略文件以及1个...
描述中提到的“java TDD测试开发流程”,意味着这些文档专注于Java语言的TDD实践,可能包括如何在Java项目中实施TDD的具体步骤。 mekito是一个流行的Java模拟框架,用于单元测试。它允许开发者模拟对象的行为,以便...
在C#的TDD实践中,还有一种称为"行为驱动开发"(Behavior Driven Development,BDD)的方法,它使用自然语言描述测试场景,使非技术人员也能理解。例如,我们可以使用SpecFlow这个工具,将Gherkin语法的测试场景转化...
管理测试资产也是TDD实践中不可忽视的一部分。测试资产包括测试用例、测试脚本、测试数据等,这些都应当得到良好的组织和维护,以便在软件开发的全生命周期内重复使用。 在敏捷开发中,测试类型主要分为单元测试、...
本手册还提供了丰富的案例分析和实践指导,旨在帮助读者更好地理解和掌握UMTS-TDD仿真技术。例如,通过具体的场景设置,展示了如何在NS2环境中配置不同的网络参数、设置仿真场景以及分析仿真结果。此外,还包括了...
#### 二、环境搭建 为了能够顺利地使用TDD进行开发,首先需要搭建好必要的开发环境。以下是对开发环境的要求: - **PHP版本**:至少需要PHP 5.6及以上版本。 - **Composer**:用于管理项目的依赖关系。 - **Xdebug...
### 工程与技术实践-TDD中常见的10大反模式 #### 1. 引言 测试驱动开发(Test-Driven Development, TDD)是一种软件开发方法论,它要求在编写任何生产代码之前,先编写相关的测试用例。TDD的核心原则包括“先测试...
8. **最佳实践**:最后,本书总结了一系列TDD的最佳实践,帮助开发者避免常见错误,提升代码质量和开发效率。 #### 结语 通过《嵌入式TDD》,读者不仅能够深入了解TDD的核心原理,还能学习到如何将其有效地应用于...
在软件开发领域,Test-Driven Development(TDD)是一种编程实践,它强调先编写测试用例,然后编写满足这些测试的最小功能代码。Ruby作为一种动态、灵活的编程语言,是TDD的理想选择,因为它允许快速迭代和高效的...
这本书以PDF英文版的形式提供,旨在帮助Java程序员深入理解和实践TDD方法论,提升软件开发的质量和效率。 测试驱动开发(TDD)是一种软件开发方法,强调在编写任何生产代码之前先编写测试。TDD的核心流程可以概括为...
在TDD实践中,功能测试是至关重要的一步,它涉及到将应用程序置于各种可能的使用场景中进行测试,以验证其行为是否符合预期。这不仅包括正常操作路径,也包括异常情况和边界条件。通过列出所有可能的应用场景,可以...
在软件开发领域,TDD(Test-Driven Development,测试驱动开发)是一种编程实践,它强调先编写测试用例,再编写实现功能的代码。Laravel,作为一款流行的PHP框架,高度支持TDD,使得开发者能够更高效、更稳定地构建...
#### 二、TDD的产生背景 - **软件开发挑战**: 传统软件开发模式中存在的问题,如开发周期长、代码质量难以保证等,促进了新的开发方法论的出现。 - **高效开发的需求**: 高效的软件开发过程对于软件团队至关重要,...