TDD和测试优先开发(或测试优先编程)之间有区别吗?

时间:2008-12-02 17:33:42

标签: testing tdd testing-strategies test-first

这两个想法听起来与我非常相似,但可能存在微妙的差异或完全相同的事情,以不同的方式解释。 TDD与测试优先开发/编程之间有什么关系?

8 个答案:

答案 0 :(得分:60)

驱动因素的区别在于。

你对类(或系统 - 当然可以在不同尺度上发生)应该是什么样子有一个模糊的概念,然后想出能给它实际形状的测试吗?这是TDD。

您是否确切知道该类的公共API应该是什么,并且只是在实现之前编写测试?这是测试优先开发。

我的风格往往是两者的混合体。在编写任何测试之前,有时候API应该是显而易见的 - 在其他情况下,可测试性确实推动了设计。

换句话说,TDD以“我想问什么问题?”开头。而非TDD(无论是否首先测试)以“我想给出什么答案?”开头?

答案 1 :(得分:24)

它们基本上是描述同一事物的不同名称 - 实际上是五个名称,因为最后一个D可以代表设计和开发。

Test First是最初使用的术语,特别是在极限编程的上下文中,用于测试代码重构循环。测试驱动开发这个名称已被提出 - 后来很快被采用 - 强调TFD是 - 并且一直是 - 更多的是设计策略而不是测试策略。

显然今天有些人对这两个词有不同的含义,但这不是他们存在的意图,我不会依赖它是常识(因为它不是)。事实上,我宁愿将TFD这个词视为已被弃用。

答案 2 :(得分:13)

许多类似的术语,如测试优先编程,测试优先开发,测试驱动开发甚至测试驱动设计。重要的是澄清几点:

<强> 1。测试优先编程(TFP)

术语测试优先编程是一种编程最佳实践。肯特贝克在他的书“极限编程解释”中重新引入了(如果没有创造出来的话):“在编程之前编写单元测试,并始终保持所有测试运行”。因此,在谈论测试优先编程时,我们正在谈论由开发人员编写自动化单元测试,编写代码以满足这些测试。该单元测试堆积并构建一个可以定期运行的自动回归测试套件。

<强> 2。测试驱动开发(TDD)

测试驱动开发(TDD)是Kent Beck在他的书“按示例进行测试驱动开发”中介绍的方法的名称。它是一个软件开发过程,它不仅仅是在代码之前编写测试。整本书试图通过模式,工作流程,文化等来解释它。其中一个重要方面是强调重构。

有些人使用术语测试优先开发,测试驱动设计或测试驱动编程......有一件事是肯定的:完善的方法是测试驱动开发,编程技术是测试优先节目。其余的要么通常是指在代码之前编写测试或错误地引用测试驱动开发或测试优先编程的想法。

答案 3 :(得分:10)

TDD = TFD +重构。

当你做TFD时,你应用一些重构来使代码更通用和健壮。

答案 4 :(得分:6)

历史正确:测试优先编程和测试驱动开发意味着具有改进名称的相同内容

在XP(极限编程)的背景下,这是使测试优先编程和测试驱动开发流行的软件开发过程,测试优先编程被重命名为测试驱动开发,然后是测试驱动设计认识到编写测试首先会对软件体系结构和软件系统的设计产生巨大的积极影响。

这对建筑和设计的影响是或多或少令人惊讶的同义词的结果:

  • 可测试
  • 解耦
  • 可重复使用
  • 可独立部署
  • 独立发展
  • 独立合理

软件实体只能轻松地重复使用,测试,独立部署,独立开发,或者如果它们分离,则可以单独轻松推理。在实际实施之前编写测试是一种几乎防弹的方法,以确保连续解耦。

这种对软件设计和架构的影响变得如此重要,除了创造者发现值得将其从测试优先编程重新命名为测试驱动开发的其他积极影响。

名称测试驱动开发还有助于在接受和正确理解方面更好地推广方法,因为测试驱动开发这一名称比测试优先编程更强调方法的整体方面。

历史不正确但有用

虽然历史上不正确,但我发现以下区别非常有用:

测试优先编程......

...是在测试代码之前编写测试代码的测试的任何方法。

测试驱动开发......

...是测试优先编程的一个特定子集,遵循Robert C. Martin描述的测试驱动开发的3个定律:

  
      
  1. 在您第一次编写失败的单元测试之前,您不能编写任何生产代码。
  2.   
  3. 你不能写更多的单元测试而不是足以失败,而不是编译失败。
  4.   
  5. 您无法编写足以通过当前失败的单元测试的生产代码。    - Robert C. Martin,The Three Laws of Test-Driven Development
  6.   

遵循这三条规则会让您进入所谓的Red-Green-Refactor循环。 你写了一个失败的考试。 你让它通过了。 3.现在它通过了,你可以在编写下一个失败的测试之前无情地重构。

请注意,重构安全需要测试。重构意味着在不改变重要行为的情况下改变源代码的结构。但是,我们怎么知道我们没有意外改变重要行为?什么定义了重要行为?这是测试有用的众多事情之一。

顺便说一句,如果你的测试妨碍了重构,你的测试太低级,耦合太紧,也许你使用了太多的嘲弄。

极限编程中的其他有趣的重命名

  • 持续整合 - &gt;持续交付 - &gt;持续部署;严格来说,它们意味着不同的东西,但是,在XP的精神中,它意味着从一开始就进行持续部署,当人们跳上这个潮流时,人们意识到整合过于字面意义,人们在完成之前就停止了。
  • 连续重构 - &gt;持续改进设计;重构本身并不是达到目的的手段,而是遵循更高的目标。
  • 每周40小时 - &gt;可持续的步伐(城市传奇:这次重命名发生在法国软件开发商的抗议之后。)

答案 5 :(得分:1)

他们完全是一回事。两者首先引用写入测试,然后编写将通过测试的代码

答案 6 :(得分:1)

TDD(测试驱动开发)是测试优先开发/编程虽然我已经看到和听过TDD曾经意味着创建持久的,可重复的单元测试(甚至在代码之后),但实际上它意味着测试是在代码之前编写的正在测试。

答案 7 :(得分:0)

测试驱动的开发中:以示例为例,作者 Kent Beck 明确指出“测试优先”(TF)是规则。因此,TF是统治TDD的原则。后一个是过程。