演化架构与紧急设计: 测试驱动设计,第 1 部分
2009-11-05 00:00:00 来源:WEB开发网
清单 1. 后测试开发的 PerfectNumberFinderpublic 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]));
}
}
测试名称中的 “_” 是怎么回事?
更多精彩
赞助商链接