测试指南 – 我们驱动设计

在第 5 章《编写我们的第一个测试》中,我们编写了我们的第一个测试。为了做到这一点,我们经历了许多设计决策。让我们回顾一下最初的测试代码,并列出我们必须做出的所有设计决策,如下所示:

@Test
public void oneIncorrectLetter() {
    var word = new Word("A");

    var score = word.guess("Z");

    assertThat( score.letter(0) ).isEqualTo(Letter.INCORRECT);
}

我们做出了以下决定:

  • 测试什么

  • 测试的名称

  • 被测试方法的名称

  • 将该方法放在哪个类上

  • 该方法的签名

  • 类的构造函数签名

  • 哪些其他对象应该协作

  • 协作中涉及的方法签名

  • 该方法的输出形式

  • 如何访问该输出并断言其工作

这些都是我们人类必须做出的设计决策。TDD 让我们在设计代码和决定如何实现代码时非常亲力亲为。老实说,我对此感到高兴。设计是有回报的,TDD 提供了有用的脚手架,而不是规定性的方法。TDD 作为一个指南,提醒我们尽早做出这些设计决策。它还提供了一种将这些决策记录为测试代码的方式。仅此而已,但同样,也不少。

在我们做出这些决策时,使用结对编程或群体编程(也称为合奏编程)等技术可能会有所帮助——这样,我们就为我们的解决方案增加了更多的经验和更多的想法。独自工作时,我们只能根据自己的经验做出最好的决策。

这里要传达的关键点是,TDD 不能也不会为我们做出这些决策。我们必须做出这些决策。因此,有一些指导原则来引导我们走向更好的设计是有用的。一组被称为 SOLID 原则的五个设计原则是有帮助的。SOLID 是以下五个原则的首字母缩写:

  • 单一职责原则(SRP)

  • 开闭原则(OCP)

  • 里氏替换原则(LSP)

  • 接口隔离原则(ISP)

  • 依赖倒置原则(DIP)

在接下来的部分中,我们将学习这些原则是什么,以及它们如何帮助我们编写良好设计的代码和测试。我们将从 SRP 开始,这可以说是任何程序设计风格中最基础的原则。