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

Testing TDD和测试优先开发(或测试优先编程)之间有区别吗?,testing,tdd,testing-strategies,test-first,Testing,Tdd,Testing Strategies,Test First,这两个想法听起来很相似,但可能有细微的差异或完全相同的东西,以不同的方式解释。TDD和测试优先开发/编程之间的关系是什么?它们完全是一样的。这两种方法都是先编写测试,然后编写通过测试的代码 当您使用TFD时,您会应用一些重构来使代码更通用和健壮。TDD(测试驱动开发)是测试优先的开发/编程,尽管我曾经听说过TDD用于表示创建持久的、可重复的单元测试(即使在代码之后),但实际上,这意味着测试是在测试代码之前编写的。在驱动因素方面存在差异 你是否对课程(或系统——当然,这可能发生在不同的尺度上)应该

这两个想法听起来很相似,但可能有细微的差异或完全相同的东西,以不同的方式解释。TDD和测试优先开发/编程之间的关系是什么?

它们完全是一样的。这两种方法都是先编写测试,然后编写通过测试的代码


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

TDD(测试驱动开发)是测试优先的开发/编程,尽管我曾经听说过TDD用于表示创建持久的、可重复的单元测试(即使在代码之后),但实际上,这意味着测试是在测试代码之前编写的。

在驱动因素方面存在差异

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

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

我的风格倾向于两者兼而有之。有时,在编写任何测试之前,API应该是什么是显而易见的——在其他情况下,可测试性真正驱动了设计


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

它们基本上是描述同一事物的不同名称——事实上,五个名称,最后一个D代表设计和开发

testfirst是最初用于测试代码重构周期的术语,特别是在极限编程环境中。测试驱动开发这个名字被提出,并很快被采纳,以强调TFD是一种设计策略而不是测试策略,而且一直以来都是这样一个事实


显然,今天有些人对这两个术语有不同的含义,但这并不是他们存在的目的,我也不会相信这是常识(因为事实并非如此)。事实上,我宁愿看到术语TFD被弃用。

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

1。测试优先编程(TFP)

术语测试优先编程是一种编程最佳实践。肯特·贝克(Kent Beck)在《极限编程解释》(Extreme Programming Explained)一书中重新引入了它(如果不是杜撰的话):“在编程之前编写单元测试,并让所有测试始终运行”。所以,当谈到测试优先编程时,我们谈论的是由编写代码以满足这些测试的开发人员编写自动单元测试。单元测试堆积起来,并构建一个可以定期运行的自动化回归测试套件

2。测试驱动开发(TDD)

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

有些人使用术语“测试优先开发”、“测试驱动设计”或“测试驱动编程”和。。。有一点是肯定的:成熟的方法是测试驱动开发,而编程技术是测试优先编程。其余的要么通常指在编写代码之前编写测试,要么错误地指测试驱动开发或测试优先编程。

历史上正确:测试优先编程和测试驱动开发是同一回事,但名称有所改进 在XP(极限编程)的背景下,这是一种软件开发过程,使测试优先编程和测试驱动开发变得流行,在认识到先编写测试对软件体系结构和软件系统的设计有巨大的积极影响之后,测试先行编程被重命名为测试驱动开发,然后是测试驱动设计

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

  • 可测试
  • 解耦
  • 可重复使用
  • 可独立部署
  • 独立可展
  • 独立合理
软件实体只有在解耦的情况下才能很容易地重用、测试、独立部署、独立开发或单独推理。在实际实现之前编写测试几乎是一种确保持续解耦的防弹方法

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

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

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

测试第一编程… …是在测试代码之前编写测试代码的任何方法

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

  • 在首次编写失败的单元测试之前,您不能编写任何生产代码
  • 你不会写字