代码之家  ›  专栏  ›  技术社区  ›  Rei Miyasaka

试着对TDD的好处有信心

  •  11
  • Rei Miyasaka  · 技术社区  · 14 年前

    The Art of Unit Testing 来自亚马逊。我对理解TDD非常认真,所以请放心,这是一个真正的问题。

    但我觉得我一直在寻找理由放弃它的边缘。

    我将在这里扮演魔鬼代言人的角色,并试图击落所谓的TDD的好处,希望有人能证明我错了,并帮助我对它的优点更有信心。我想我遗漏了什么,但我不知道是什么。

    1.TDD减少错误

    这个 often-cited blog post 说单元测试是设计工具,不是用来捕捉bug的:

    以我的经验,单元测试不是 找到错误或检测回归的有效方法。

    TDD是一种健壮的设计方法 软件组件(单元) 是通过单元测试指定的。 就这些!

    有道理。边缘案例仍然会一直存在,你只会发现表面的bug——不管怎样,只要你运行你的应用程序,你就会发现这些bug。在构建好软件之后,仍然需要进行适当的集成测试。

    公平地说,减少bug并不是TDD应该帮助的唯一事情。

    这可能是最大的。TDD是一种设计范例,它可以帮助您(或迫使您)使您的代码更加复杂 composable

    例如,为了在数据库上执行业务逻辑,可以在一个函数中隔离IO代码,该函数执行访问数据库并将其作为参数传递给负责业务逻辑的函数的“一元”任务。这将是一种实用的方法。

    当然,这有点笨拙,因此我们可以将数据库IO代码的一个子集扔到类中,并将其交给包含相关业务逻辑的对象。它是完全相同的东西,是对功能性做事方式的一种调整,它被称为存储库模式。

    3.TDD作为文件

    当然,TDD方法可以作为示例代码的基础,但是测试通常包含一些不应该出现在示例代码中的模拟,并且通常都是精心设计的,因此可以根据预期结果对它们进行相等的评估。

    一个好的单元测试将在它的方法签名中描述被验证的确切行为,并且测试将验证不多于也不少于该行为。

    所以,我想说,你最好把时间花在完善你的文档上。见鬼,为什么不先彻底完成文档,并称之为文档驱动设计?

    上面那篇文章提到TDD对于检测回归不太有用。当然,这是因为当您更改一些代码时,不明显的边缘情况总是会出错。

    在这个话题上,值得注意的是 你的代码在很长一段时间内都会保持不变。所以,在需要的基础上编写单元测试是不是更有意义,只要代码被更改,就保留旧代码并将其结果与新函数的结果进行比较?

    6 回复  |  直到 4 年前
        1
  •  4
  •   BobTurbo    14 年前

    我相信TDD的好处在于,您实际上编写了测试,因为当它们是您必须实现的目标时(创建代码以通过测试),它们更有趣,而不是您必须在之后做的琐事。

        2
  •  5
  •   Yishai    14 年前

    在设计方面,TDD的一个主要好处是它驱动设计变得足够。你知道他们说工程师看到的玻璃是它应该的两倍大吗。软件的过度设计可能是一个大问题。我发现90%以上的时间TDD强迫正确的抽象平衡来支持代码的后期扩展。TDD并不神奇,它也需要程序员来完成,但它是工具箱的重要组成部分。

    我认为你的单子上有太多孤立的TDD。重构呢?我认为测试的一个主要好处是它锁定了行为,这样当你重构时你就可以确信你没有改变任何东西,这反过来又可以让你对重构充满信心。没有什么比白板更像是从经验中产生的设计了(尽管高级白板设计仍然非常重要)。

    我认为鲍勃马丁说得最好,TDD是编程,就像复式记账是会计。它防止了某种程度的错误。它并不能防止所有的问题,但是可以确保如果你的程序打算加2加2,它不会减去它们。基本行为很重要,当它出错时,您可以花费大量时间了解调试器。

        3
  •  2
  •   P.K    14 年前

    TDD不是一种方法论,而是一种心态。

    :随着代码库开始增长,在源代码管理的每个签入上运行所有测试是非常重要的。当团队中有一个新成员时,这样做的好处就显而易见了。

    测试是代码的第一个用户。最初,使用测试驱动您的设计是非常困难的。但是,一旦您习惯了它,您就会意识到测试代码实际上帮助您决定您的设计。这自然会带来一些TDD经验。例如,使用TDD,您希望在接口中包装对服务的访问。这允许你嘲笑。但是,这里最重要的是它是正确的设计方法。

    TDD作为文件 该文档是用于代码开发人员使用的代码文档。开发人员发现阅读编写良好的单元测试比阅读一页又一页的文档更容易。

        4
  •  1
  •   Camilo Martin    14 年前

    要解决的问题。

    至少比锤击F5和使用 console.log() 甚至是警报。

    不过,我认为这应该主要用于中间件或复杂的RIA,因为几乎不可能用很少的业务逻辑来TDD用户界面。

    JSTestDriver

        5
  •  1
  •   Burkart Rutger Nijlunsing    10 年前

    我只是想强调一下:

    “单元测试的目的是孤立地测试代码单元。”

    来自斯蒂芬·沃尔特的博客文章 TDD Tests are not Unit Tests

        6
  •  0
  •   John Saunders    14 年前