测试金字塔

思考不同类型测试的一个非常有用的方法是使用 测试金字塔。它是一个简单的图形表示,展示了我们代码周围所需的不同类型的测试以及每种测试的相对数量。本节介绍了测试金字塔背后的关键思想。

测试金字塔的图形形式如下:

image 2025 01 12 17 13 20 003
Figure 1. Figure 10.2 – The test pyramid

从上面的图形中我们可以看到,测试分为四层。最底层是单元测试。集成测试位于其之上。金字塔的顶部是端到端测试和用户验收测试。图形显示,在我们的系统中,单元测试的数量最多,集成测试较少,验收测试最少。

其中一些测试类型是本书中首次提到的。让我们定义一下它们是什么:

  • 单元测试

    这些我们已经很熟悉了。它们是我们到目前为止一直在使用的 FIRST 测试。这些测试的一个定义特征是它们不需要任何外部系统(如数据库或支付处理器)的存在。

  • 集成测试

    这些测试验证软件组件是否正确集成了外部系统,例如数据库。这些测试速度较慢,并且严重依赖于外部环境的可用性以及为我们的测试正确设置。

  • 端到端测试

    这些是所有测试中最广泛的。端到端测试代表了非常接近最终用户体验的内容。这种测试针对系统的所有真实组件进行——可能在具有测试数据的测试环境中——使用与真实用户相同的命令。

  • 用户验收测试

    这是对真实系统的测试,就像用户使用它一样。在这里,我们可以根据用户提供给我们的需求,确认最终系统是否适合使用。

起初,为什么减少任何类型的测试数量会成为一种优势并不明显。毕竟,到目前为止,本书中的所有内容都对测试的价值给予了积极评价。为什么我们不简单地拥有所有测试呢?答案是一个务实的答案:并非所有测试都是平等的。它们并不都为我们开发者提供同等的价值。

金字塔形状的原因是为了反映每一层测试的实际价值。作为 FIRST 测试编写的单元测试速度快且可重复。如果我们能够仅用这些单元测试构建一个系统,我们肯定会这样做。但单元测试并不能覆盖代码库的每个部分。具体来说,它们不会测试从我们的代码到外部世界的连接,也不会像用户那样测试我们的应用程序。随着我们逐步向上通过测试层,我们逐渐从测试软件的内部组件转向测试它与外部系统的交互,最终测试应用程序的最终用户。

测试金字塔是关于平衡的。它旨在创建实现以下目标的测试层:

  • 尽可能快地运行

  • 尽可能多地覆盖代码

  • 尽可能多地防止缺陷

  • 最小化测试工作的重复

在接下来的部分中,我们将分解测试金字塔每一层涉及的测试。我们将考虑每种测试的优缺点,从而理解测试金字塔引导我们走向什么方向。