如何处理单个简单测试用例将驱动整个实现的情况?

时间:2015-11-13 14:20:34

标签: java unit-testing tdd

当我学习“测试驱动开发”时,我从“生产程序员”一书中找到了一个有趣的案例:

  

您需要找到“完整号码”的所有因素。完整的数字是其所有因子的总和(除了与数字本身相等的因子)等于数字。因此6是最小完整数,其因子为1, 2, 3

如果我想要TDD,首先我想测试一个最简单的测试用例:

@Test public void completeNumber6() {
    CompleteNumber completeNumber = new CompleteNumber(6)
    assertEquals(completeNumber.findFactors(), new Int[] {1,2,3});
}

但是!问题是这个最简单的案例将驱动findFactors()的所有实现,这对我来说似乎太过分了。

作者给出了一些建议,我们可以将需求分成几个步骤:

  1. 检查数字是否是另一个因素
  2. 提供了一些将一些因素收集到集合中的方法
  3. 检查每个较小的数字,看看它是否是给定数字的因子,收集它们
  4. 检查收集的因子的总和是否等于给定的数字
  5. 我们可以先TDD前两步:

    @Test public void testIsFactor() {}
    @Test public void testAddFactor() {}
    

    之后会有2种公开(至少非私人)方法:

    boolean isFactor(Int n1, Int n2)
    void addFactor(Int factor)
    

    问题是这两种方法在整个实现后应该是私有,因为它们应该只在内部由findFactors使用!

    但如果将它们改为私有,那么对于它们的现有测试用例我们该怎么办?

    作者建议我们可以将它们更改为 private ,并使用Java refection API来获取和测试它们。听起来很可能,但我不确定这样做是不是很好。

    我也问过一些朋友,他们还提供了一些其他选择:

    1. 保持方法isFactoraddFactor不私有,这是可以接受的
    2. 为2种方法提取课程FactorCheckerFactorCollector
    3. 将其更改为私有,并删除测试用例,因为它们的功能已在后续测试用例中进行了测试(步骤3和4)
    4. 我现在真的很困惑,哪种方法是TDD的最佳实践?

1 个答案:

答案 0 :(得分:0)

在我看来,问题陈述这些是完整数字的事实有点无关紧要。您可以计算任何整数的因子。因此,我开始实现findFactors(1),然后继续努力。

这使得它在经典Prime Factors Kata上略有不同,唯一的区别是您在因子列表中添加了1。