这两个想法听起来与我非常相似,但可能存在细微的差异或完全相同的东西,以不同的方式解释。TDD 和测试优先开发/编程之间有什么关系?
8 回答
在驱动因素是什么方面存在差异。
您是否对类(或系统——当然,这可以在不同的尺度上发生)应该是什么样子有一个模糊的概念,然后想出一些测试来赋予它实际的形状?这就是TDD。
您是否确切知道该类的公共 API 应该是什么,并且只是在实现之前编写测试?那是测试优先的开发。
我的风格往往是两者的混合。有时,在编写任何测试之前,API 应该是什么是显而易见的——在其他情况下,可测试性真正推动了设计。
换句话说,TDD 从“我想问什么问题?”开始。而非 TDD(无论是否先测试)以“我想给出什么答案?”开头
它们基本上是描述同一事物的不同名称 - 实际上是五个名称,因为最后一个 D 可以代表设计和开发。
测试优先是最初使用的术语,特别是在极限编程的上下文中,用于测试-代码-重构周期。测试驱动开发这个名称后来被提出 - 并很快被采用 - 强调 TFD 是 - 并且一直是 - 更多的设计策略而不是测试策略。
显然今天有些人对这两个术语有不同的含义,但这不是他们存在的意图,我不会依赖它是常识(因为它不是)。实际上,我宁愿将 TFD 一词视为已弃用。
有很多类似的术语,例如测试优先编程、测试优先开发、测试驱动开发甚至测试驱动设计。澄清几点很重要:
1. 测试优先编程(TFP)
术语测试优先编程是一种编程最佳实践。Kent Beck 在他的《Extreme Programming Explained》一书中重新引入(如果不是创造的话):“在编程之前编写单元测试并保持所有测试始终运行”。因此,在谈论测试优先编程时,我们谈论的是由将编写代码以满足这些测试的开发人员编写自动化单元测试。单元测试堆积起来并构建了一个可以定期运行的自动化回归测试套件。
2. 测试驱动开发(TDD)
测试驱动开发 (TDD) 是 Kent Beck 在其“示例测试驱动开发”一书中介绍的一种方法的名称。这是一个软件开发过程,不仅仅是在代码之前编写测试。整本书试图通过模式、工作流程、文化等来解释它。它的一个重要方面是强调重构。
有些人使用测试优先开发、测试驱动设计或测试驱动编程等术语……有一点是肯定的:完善的方法论是测试驱动开发,而编程技术是测试优先编程。其余的要么通常是指在代码之前编写测试的想法,要么是错误地指代测试驱动开发或测试优先编程。
TDD = TFD + 重构。
当您执行 TFD 时,您会应用一些重构以使代码更加通用和健壮。
从历史上看是正确的:测试优先编程和测试驱动开发意味着相同的东西,但名称有所改进
在 XP(Extreme Programming)的上下文中,这是使测试优先编程和测试驱动开发流行的软件开发过程,测试优先编程被重命名为测试驱动开发,然后是测试驱动设计,因为认识到首先编写测试对软件体系结构和软件系统的设计具有极大的积极影响。
这种对建筑和设计的影响是或多或少令人惊讶的同义词的结果:
- 可测试
- 解耦
- 可重复使用的
- 可独立部署
- 可独立开发
- 独立合理
软件实体只有在解耦的情况下才能容易地重用、测试、独立部署、独立开发或容易单独推理。在实际实现之前编写测试几乎是一种确保持续解耦的万无一失的方法。
除了其他积极影响之外,这种对软件设计和架构的影响变得如此重要,以至于创建者发现值得将其从测试优先编程重命名为测试驱动开发。
测试驱动开发这个名称还有助于在接受度和正确理解方面更好地营销该方法,因为测试驱动开发这个名称比测试优先编程更强调方法的整体方面。
历史上不正确但有用
虽然从历史上看不正确,但我发现以下区别非常有用:
测试优先编程……</h2>
…是在被测代码之前编写被测代码测试的任何方法。
测试驱动开发……</h2>
…是测试优先编程的一个特定子集,它遵循 Robert C. Martin 所描述的测试驱动开发的 3 条法则:
- 在您首先编写失败的单元测试之前,您不能编写任何生产代码。
- 您不能编写超过足以失败的单元测试,并且不编译是失败的。
- 您编写的生产代码不能超过足以通过当前失败的单元测试的数量。— Robert C. Martin,测试驱动开发的三定律
遵循这三个规则将使您进入所谓的红-绿-重构循环。1. 你写了一个失败的测试。2. 你让它通过。3. 现在它通过了,你可以在编写下一个失败的测试之前毫不留情地重构。
请注意,安全地重构需要测试。重构意味着在不改变重要行为的情况下改变源代码的结构。但是我们怎么知道我们没有意外改变重要的行为呢?什么定义了重要的行为?这是测试有用的许多事情之一。
顺便说一句,如果你的测试妨碍了重构,那么你的测试太低级了,耦合太紧了,也许你使用了太多的模拟。
极限编程中其他有趣的重命名
- 持续集成 -> 持续交付 -> 持续部署;严格来说,它们的含义不同,但是,在 XP 的精神中,它从一开始就意味着持续部署,当人们赶上潮流时,人们意识到集成过于字面意思,人们在完成之前就停止了。
- 持续重构 -> 持续设计改进;重构本身并不是达到目的的手段,而是遵循更高的目的。
- 每周 40 小时 -> 可持续步伐(城市传奇:这个更名是在法国软件开发商的抗议之后发生的。)
TDD(测试驱动开发)是测试优先开发/编程虽然我曾经看到和听说过 TDD 意味着创建持久的、可重复的单元测试(即使在代码之后),但实际上它意味着测试是在他们正在测试的代码之前编写的。
在Test Driven Development: By Example中,作者Kent Beck明确指出“测试优先”(TF)是规则。所以TF是支配TDD的原则。后一个是过程。
它们是完全一样的。两者都先参考编写测试,然后编写将通过测试的代码