代码之家  ›  专栏  ›  技术社区  ›  Elijah66

当新特性导致现有单元测试无效时,该怎么办?

  •  11
  • Elijah66  · 技术社区  · 16 年前

    • 更新或删除 全部的 现有测试以满足新功能需求(根据需要添加更多),然后实现该功能

    • 首先实现该功能,运行测试以查看失败,并更新或删除任何失败的测试(根据需要添加更多测试)

    • 实现该功能,运行所有测试 要看到旧的失败,请删除或删除

    第一种选择坚持TDD,但可能适得其反。第二个选项是最简单的,但是您不会忠实地首先进行测试,并且可能没有适当地“覆盖”。第三个选项是两者的折衷,在某种程度上是有吸引力的,但是您可能会冒着重新编写测试的风险,而您本可以更新一个旧的测试。

    我觉得我没有什么明确的策略。在这种情况下你会怎么做?

    6 回复  |  直到 16 年前
        1
  •  8
  •   tvanfosson    16 年前

    我会选择一个测试并将其更改为需要新功能。如果没有任何明显的候选者,也就是说,它确实是新的,我会创建一个。然后我将编写代码以通过该测试。在这一点上,我会运行我的其他测试,并注意到其中一些失败。在这一点上,我将依次重新访问每个测试,或者更正测试以反映新特性(因此它将在没有其他代码更改的情况下通过),或者根据新特性更新测试(这可能需要对测试中的代码进行进一步更改)。

        2
  •  4
  •   Robert Greiner    16 年前

    我将为新特性创建新测试,并更新现有测试以适应您的特性。如果你破坏了一个已经在运行的测试,你应该修复它。

        3
  •  4
  •   T.J. Crowder    16 年前

    包括 编写/更新单元测试;这是测试驱动开发的基础。所以你的第二个选择也是TDD,而不仅仅是第一个。在实践中,我怀疑您会希望您的第三个选项与一些MOD:

    1. 为特性编写测试(因为这有助于验证API/UI)
    2. 复习 单元测试在一般区域中进行,以查看 打破
    3. 运行测试
    4. 利润;-)
        4
  •  1
  •   ndp    16 年前

    我认为所有的方法都是合理的。你会得到同样的结果。

    有些人喜欢更小的步骤,并且更多地按照TDD的原意工作:编写一行测试,编写一行代码来修复它,然后重复。如果是您,请先递增地处理旧的测试,将它们演化(或删除)到新系统中。

    如果你不介意咬下更大的一块,那就去修理新东西吧。我发现这更自然,尤其是当结对编程时,你可以更大胆一点。

    我支持这样一种观点,即理想情况下,一次更改只会破坏一个测试,因此您可能需要重构测试代码,以便这就是您的行为。某种共享设置方法可能是解决方案。

        5
  •  0
  •   Kendall Helmstetter Gelner    16 年前

    摆脱旧的测试,编写新的测试。您可以在一些地方从旧测试中借用代码,但是您最好按照您试图做的事情进行哲学上的测试,而不是试图改变旧测试的性质。

    测试是为了支持你想要完成的事情,不应该对你不利。

        6
  •  0
  •   Cellfish    16 年前

    我认为这里有两件事要考虑。我不知道你是只考虑一个还是两个。

    第一部分是,由于规范(或预期行为)更改,您已经更改了特性。在这种情况下,我认为正确的做法是删除所有描述不再有效的行为的测试。因为我很懒,我会把它们注释掉或者暂时跳过。然后我将开始编写新的测试(或取消注释/修改旧测试),以开始描述新的行为,直到完成为止。

    推荐文章