`

TDD实践(二)

阅读更多

实践题目:分解质因数

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;
}
 
敏捷教练:http://www.maiyuan.me/
分享到:
评论

相关推荐

    TDD测试驱动开发

    5. **TDD实践** 文件名中的“测试驱动开发TDD培训讲义.ppt”、“TDD_测试驱动开发.ppt”和“测试驱动开发—1.1_测试驱动开发简介.ppt”很可能包含了关于TDD的详细讲解,涵盖了TDD的概念、原则、实践技巧以及如何在...

    基于Java语言的TDD实践应用设计源码

    本项目是一个基于Java语言的TDD(测试驱动开发)实践应用设计源码,共包含49个文件,其中包括14个可执行文件、14个Java源代码文件、11个锁定文件、6个Gradle构建脚本文件、2个属性文件、1个Git忽略文件以及1个...

    TDD 测试驱动开发 文档 详细

    描述中提到的“java TDD测试开发流程”,意味着这些文档专注于Java语言的TDD实践,可能包括如何在Java项目中实施TDD的具体步骤。 mekito是一个流行的Java模拟框架,用于单元测试。它允许开发者模拟对象的行为,以便...

    c#_tdd.zip

    在C#的TDD实践中,还有一种称为"行为驱动开发"(Behavior Driven Development,BDD)的方法,它使用自然语言描述测试场景,使非技术人员也能理解。例如,我们可以使用SpecFlow这个工具,将Gherkin语法的测试场景转化...

    TDD驱动测试开发培训

    管理测试资产也是TDD实践中不可忽视的一部分。测试资产包括测试用例、测试脚本、测试数据等,这些都应当得到良好的组织和维护,以便在软件开发的全生命周期内重复使用。 在敏捷开发中,测试类型主要分为单元测试、...

    UMTS-TDD手册

    本手册还提供了丰富的案例分析和实践指导,旨在帮助读者更好地理解和掌握UMTS-TDD仿真技术。例如,通过具体的场景设置,展示了如何在NS2环境中配置不同的网络参数、设置仿真场景以及分析仿真结果。此外,还包括了...

    phpunit-TDD驱动开发

    #### 二、环境搭建 为了能够顺利地使用TDD进行开发,首先需要搭建好必要的开发环境。以下是对开发环境的要求: - **PHP版本**:至少需要PHP 5.6及以上版本。 - **Composer**:用于管理项目的依赖关系。 - **Xdebug...

    工程与技术实践-TDD中常见的10大反模式

    ### 工程与技术实践-TDD中常见的10大反模式 #### 1. 引言 测试驱动开发(Test-Driven Development, TDD)是一种软件开发方法论,它要求在编写任何生产代码之前,先编写相关的测试用例。TDD的核心原则包括“先测试...

    嵌入式 TDD

    8. **最佳实践**:最后,本书总结了一系列TDD的最佳实践,帮助开发者避免常见错误,提升代码质量和开发效率。 #### 结语 通过《嵌入式TDD》,读者不仅能够深入了解TDD的核心原理,还能学习到如何将其有效地应用于...

    Ruby-TDD实战TestDrivenDevelopmentinAction

    在软件开发领域,Test-Driven Development(TDD)是一种编程实践,它强调先编写测试用例,然后编写满足这些测试的最小功能代码。Ruby作为一种动态、灵活的编程语言,是TDD的理想选择,因为它允许快速迭代和高效的...

    Test Driven: Practical TDD and Acceptance TDD for Java Developers (PDF英文版)

    这本书以PDF英文版的形式提供,旨在帮助Java程序员深入理解和实践TDD方法论,提升软件开发的质量和效率。 测试驱动开发(TDD)是一种软件开发方法,强调在编写任何生产代码之前先编写测试。TDD的核心流程可以概括为...

    TDD_In_Practice ThoughtWorks

    在TDD实践中,功能测试是至关重要的一步,它涉及到将应用程序置于各种可能的使用场景中进行测试,以验证其行为是否符合预期。这不仅包括正常操作路径,也包括异常情况和边界条件。通过列出所有可能的应用场景,可以...

    Laravel开发-tdd

    在软件开发领域,TDD(Test-Driven Development,测试驱动开发)是一种编程实践,它强调先编写测试用例,再编写实现功能的代码。Laravel,作为一款流行的PHP框架,高度支持TDD,使得开发者能够更高效、更稳定地构建...

    TDD读书报告

    #### 二、TDD的产生背景 - **软件开发挑战**: 传统软件开发模式中存在的问题,如开发周期长、代码质量难以保证等,促进了新的开发方法论的出现。 - **高效开发的需求**: 高效的软件开发过程对于软件团队至关重要,...

Global site tag (gtag.js) - Google Analytics