WEB开发网
开发学院软件开发Java 演化架构与紧急设计: 测试驱动设计,第 1 部分 阅读

演化架构与紧急设计: 测试驱动设计,第 1 部分

 2009-11-05 00:00:00 来源:WEB开发网   
核心提示: 清单 1. 后测试开发的 PerfectNumberFinderpublicclassPerfectNumberFinder1{publicstaticbooleanisPerfect(intnumber){//getfactorsList<Integer>factors=newAr


清单 1. 后测试开发的 PerfectNumberFinder
public class PerfectNumberFinder1 { 
  public static boolean isPerfect(int number) { 
    // get factors 
    List<Integer> factors = new ArrayList<Integer>(); 
    factors.add(1); 
    factors.add(number); 
    for (int i = 2; i < number; i++) 
      if (number % i == 0) 
        factors.add(i); 
 
    // sum factors 
    int sum = 0; 
    for (int n : factors) 
      sum += n; 
 
    // decide if it's perfect 
    return sum - number == number; 
  } 
} 

这并不是特别好的代码,但是它完成了工作。首先把所有因子创建为一张动态列表(ArrayList)。我把 1 和目标数字添加到列表中(我在遵守上面给出的公式,并且所有因子列表都包括 1 和该数字本身)。然后,我迭代可能的因子直到该数字本身,逐个检查以查看它是不是一个因子。如果是,我将把它添加到列表中。接下来,我将把所有因子加起来,并最终编写上面所示的公式的 Java 版本以确定是否为完全数。

现在,我需要一个后测试的单元测试以确定它是否可以工作。我至少需要两个测试:一个测试用于查看是否正确报告了完全数,另一个测试用于检查我没有得到误判断(false positives)。单元测试位于清单 2 中:


清单 2. PerfectNumberFinder 的单元测试
public class PerfectNumberFinderTest { 
  private static Integer[] PERFECT_NUMS = {6, 28, 496, 8128, 33550336}; 
 
  @Test public void test_perfection() { 
    for (int i : PERFECT_NUMS) 
      assertTrue(PerfectNumberFinder1.isPerfect(i)); 
  } 
 
  @Test public void test_non_perfection() { 
    List<Integer>expected = new ArrayList<Integer>( 
        Arrays.asList(PERFECT_NUMS)); 
    for (int i = 2; i < 100000; i++) { 
      if (expected.contains(i)) 
        assertTrue(PerfectNumberFinder1.isPerfect(i)); 
      else 
        assertFalse(PerfectNumberFinder1.isPerfect(i)); 
    } 
  } 
 
  @Test public void test_perfection_for_2nd_version() { 
    for (int i : PERFECT_NUMS) 
      assertTrue(PerfectNumberFinder2.isPerfect(i)); 
  } 
 
  @Test public void test_non_perfection_for_2nd_version() { 
    List<Integer> expected = new ArrayList<Integer>(Arrays.asList(PERFECT_NUMS)); 
    for (int i = 2; i < 100000; i++) { 
      if (expected.contains(i)) 
        assertTrue(PerfectNumberFinder2.isPerfect(i)); 
      else 
        assertFalse(PerfectNumberFinder2.isPerfect(i)); 
    } 
    assertTrue(PerfectNumberFinder2.isPerfect(PERFECT_NUMS[4])); 
  } 
} 

测试名称中的 “_” 是怎么回事?

上一页  1 2 3 4 5 6 7 8  下一页

Tags:演化 架构 紧急

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接