代码之家  ›  专栏  ›  技术社区  ›  Bryan Denny

在应用TDD时,您使用什么启发式方法来选择下一个要编写的测试?

tdd
  •  6
  • Bryan Denny  · 技术社区  · 6 年前

    TDD循环的第一部分是选择要失败的测试。我想创建一个关于这个选择过程的社区wiki。

    有时选择试验开始是显而易见的,从低悬果开始。例如,在编写解析器时,一个容易开始的测试是不处理输入的测试:

    def testEmptyInput():
      result = parser.parse("")
      assertNullResult(result)
    

    有些测试很容易通过,只需要很少的实现代码,如上面的示例所示。

    其他测试需要通过复杂的实现代码块,我觉得我没有做“让测试通过的最简单的事情”。此时,我停止尝试通过此测试,并选择一个新的测试来尝试通过,希望它能为有问题的实现提供更容易的实现。

    我想探讨这些简单而富有挑战性的测试的一些特点,它们如何影响测试用例的选择和排序。

    测试选择如何与自上而下和自下而上的策略相关?有人能推荐一些关于TDD策略的文章吗?

    2 回复  |  直到 14 年前
        1
  •  2
  •   Lunivore    14 年前

    我首先锚定代码中最有价值的行为。

    例如,如果它是一个验证器,我将首先确保它说有效的对象是有价值的。现在我们可以展示代码,训练用户不要做愚蠢的事情,等等——即使验证器从未得到进一步的实现。之后,我开始添加边缘案例,首先是最危险的验证错误。

    如果我从一个解析器开始,而不是从一个空字符串开始,我可能会从一些我想要解析的典型但简单的东西开始,并且我想从中得到一些东西。对我来说,单元测试更像是我想要如何使用代码的例子。

    我也遵循BDD命名测试的惯例。 should -所以以你为例 shouldReturnNullIfTheInputIsEmpty() . 这有助于我识别代码接下来应该做的最重要的事情。

    这也与BDD的“外在内”有关。以下是我写的一些博客文章,可能会有所帮助: Pixie Driven Development Bug Driven Development . bug驱动的开发可以帮助我找出我需要的下一个系统级功能,然后帮助我找到下一个单元测试。

    希望这能给你一个稍微不同的视角,无论如何-祝你好运!

        2
  •  1
  •   Marius Gedminas    14 年前

    首先,我将选择一个简单的典型案例并为它编写一个测试。

    在编写实现时,我将注意代码处理错误的角情况。然后我将为这些案例编写测试。

    否则,我将寻找问题函数应该做但不应该做的事情。