当前位置:首页 > 开发 > 研发管理 > 正文

TDD实践(二)

发表于: 2014-09-20   作者:bijian1013   来源:转载   浏览:
摘要: 实践题目:分解质因数 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.

实践题目:分解质因数

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实践(二)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
实践题目:保龄球比赛计分 保龄球比赛一般分十局,每局最多可扔两个球,如果第一个球将所有的瓶子打
实践题目:保龄球比赛计分 保龄球比赛一般分十局,每局最多可扔两个球,如果第一个球将所有的瓶子打
“我的TDD实践”系列之TDD概念篇 写在前面:   我的TDD实践这几篇文章主要是围绕测试驱动开发所展
昨天写了从书上抄过来的关于TDD的理论,自己也颇有收获,但纸上得来终觉浅,觉知此事要躬行。很多人
社区化产品的长久生存之道可能莫过于对迭代周期的控制。还记得以前采用老土的阶段开发的年代,将软
大家好: 今天的TDD练习又开始了。回头看看上一次留下的任务。 To-Do-List: 猜测数字 输入验证 生成
本节我们将学习一些测试驱动开发环境的搭建,测试驱动开发概念和流程。所涉及的内容全部会以截图的
我的TDD实践---SVN架设篇 “我的TDD实践”系列之SVN架设 写在前面:   我的TDD实践这几篇文章主要
结对编译与TDD结合的方式是:首先,第一个人写一个失败的单元测试,第二个人写代码让这个单元测试通
结对编译与TDD结合的方式是:首先,第一个人写一个失败的单元测试,第二个人写代码让这个单元测试通
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号