端到端与用户验收测试

在这一部分,我们将逐步深入到测试金字塔的顶端。我们将回顾什么是端到端测试和用户验收测试,以及它们对单元测试和集成测试的补充作用。

在测试金字塔的顶端,有两种相似的测试类型,称为 端到端测试用户验收测试。从技术上讲,它们是同一种测试。在每种情况下,我们启动软件,并将其完全配置为在最接近实际运行环境的测试环境中运行,甚至可能在生产环境中运行。其目的是从一端到另一端对整个系统进行测试。

端到端测试的一个具体用途是 用户验收测试UAT)。在这里,运行几个关键的端到端测试场景。如果它们全部通过,软件就被宣布为符合用途,并被用户接受。这通常是商业开发中的一个合同阶段,软件的买方正式同意开发合同已经得到满足。这仍然是使用端到端测试来确定这一点,只不过使用的是精选的测试用例。

这些测试有其优点和局限性,如下表所总结:

Table 1. Table 10.3 – End-to-end test advantages and disadvantages
优点 限制

最全面的功能测试。我们是在与系统的用户(无论是人还是机器)相同的层级上进行测试,模拟他们的系统体验。

运行速度最慢的测试。

这些层级的测试关注的是从系统外部观察到的纯行为。 我们可以重构和重新架构系统的大部分部分,这些测试仍然能够保护我们。

可靠性问题——我们系统的许多问题,特别是在环境和设置方面,可能会导致虚假失败的测试,这被称为“脆弱性”——我们的测试高度依赖于环境的正常运作。环境可能因我们无法控制的情况而出现问题。

合同上至关重要——这些测试体现了最终用户关心的核心功能。

这些是所有测试中最具挑战性的,因为它们需要广泛的环境设置。

验收测试位于金字塔顶端,反映了我们不需要很多这样的测试。我们的大部分代码现在应该已经被单元测试和集成测试覆盖,确保我们的应用逻辑以及我们与外部系统的连接都能正常工作。

显而易见的问题是,还有什么需要测试?我们不想重复已经在单元和集成测试级别完成的测试。但我们确实需要某种方式来验证整个软件是否能按预期工作。这就是端到端测试的工作。在这里,我们配置我们的软件,使其连接到真实的数据库和真实的外部服务。我们的生产代码已经通过了所有使用测试替身的单元测试。这些测试通过表明,当我们连接这些真实的外部服务时,我们的代码应该可以工作。但“应该”是软件开发中一个美妙的模糊词汇。现在是时候通过端到端测试来验证它确实可以工作了。我们可以用下图来表示这些测试的覆盖范围:

image 2025 01 12 17 27 22 059
Figure 1. Figure 10.6 – End-to-end/user acceptance tests cover the entire code base

端到端测试覆盖了整个代码库,包括领域模型和适配器层。因此,它重复了单元测试和集成测试已经完成的工作。我们在端到端测试中想要测试的主要技术方面是我们的软件是否正确配置和连接。在本书中,我们使用了依赖倒置和注入来隔离我们与外部系统的连接。我们创建了测试替身并注入它们。现在,我们必须创建实际的生产代码,即连接到生产系统的真实适配器层组件。我们在系统初始化和配置期间将这些组件注入到我们的系统中。这使得代码能够真正工作。

端到端测试将重复一小部分已经在单元测试和集成测试中覆盖的 “快乐路径” 测试。这里的目的不是验证我们已经测试过的行为。相反,这些测试通过确认系统在连接到生产服务时整体行为正确,来验证我们是否注入了正确的生产对象。

用户验收测试在此基础上运行关键测试场景,这些场景被认为是接受软件为完成的关键。从技术层面上讲,这些将是端到端测试。但它们的目的不仅仅是确保我们的系统正确配置的技术目标。它们更具有法律合同性质:我们是否构建了被要求的东西?通过使用本书中的迭代方法及其技术实践,我们更有可能做到这一点。

验收测试工具

有许多测试库可以帮助我们编写自动化的验收测试和端到端测试。诸如连接到数据库或调用 HTTP Web API 等任务在这种测试中很常见。我们可以利用这些库来完成这些任务,而不是自己编写代码。

这些工具之间的主要区别在于它们与我们的软件交互的方式。有些工具旨在模拟用户点击桌面 GUI 或基于浏览器的 Web UI。其他工具则会通过 HTTP 调用我们的软件,测试 Web 端点。

以下是一些流行的验收测试工具:

  • RestEasy

    一个用于测试 REST API 的流行工具: https://resteasy.dev/

  • RestAssured

    另一个流行的 REST API 测试工具,采用流畅的方式来检查 JSON 响应: https://rest-assured.io/

  • Selenium

    一个通过浏览器测试 Web UI 的流行工具: https://www.selenium.dev/

  • Cucumber

    可以从 https://cucumber.io/ 获取。Cucumber 允许领域专家用类似英语的语言描述测试。至少理论上是这样。在我参与的任何项目中,我从未见过开发人员以外的人编写 Cucumber 测试。

验收测试构成了测试金字塔的最后一部分,使我们的应用程序能够在类似于生产环境的条件下进行测试。唯一需要的就是一种自动化运行所有这些测试层的方法。这就是 CI/CD 流水线的用武之地,它们将是下一部分的主题。