单元、集成和端到端测试有什么区别?

1,837 阅读5分钟

你已经写好了你的代码,当你运行它时,它是有效的--接下来是什么?当涉及到面向用户的代码时,"运行一次代码就成功了 "是不可能的。这就是为什么为你的代码编写测试是至关重要的:测试可以确保你的代码即使在你改变它的时候仍然是可靠的。然而,有这么多不同类型的软件测试--有哪些测试选项,以及如何选择使用哪些测试?

在这篇文章中,你将了解关键的测试类型(单元、集成和E2E测试)以及它们之间的高水平差异:

Unit, Integration, E2E Testing pyramid portrays relative amounts of each test type in a code base

关于环境的TL;DR

在我们深入了解不同的测试类型之前,我们必须了解我们可以运行代码的各种环境:

  • 本地:这是在你自己的设备上。除了你,没有人访问/与代码互动。
  • 开发:有时人们会跳过这个环境。它基本上是你的代码的共享、托管版本,允许被破坏。一个沙盒,如果你愿意的话。
  • 阶段:这是一个共享的、托管的、接近生产代码的副本。人们在部署到生产环境之前将代码部署到这个环境中,作为捕捉错误的最后冲刺。
  • 生产:真正的用户所接触的代码。

Lord of the Rings meme titled "One does not simply test in production!"

什么是单元测试?

单元测试是防止bug的第一道防线。这些测试是为了在本地运行并验证你的代码中最基本的逻辑部分。

我为什么要使用它们?

无论是一个函数,一个类,还是其他任何东西,单元测试都是为了测试每个功能/潜在的逻辑路径。事实上,为你的代码的每一个可能的流程写一个单元测试被称为100%代码覆盖。现实上,一个好的代码覆盖率看起来更像是80%。覆盖率越高,当你的单元测试通过时,你对你的代码就越有信心。

我应该什么时候使用它们?

始终如一。永远,永远。 总是.无论你是为学校编写代码,还是为数十亿用户部署代码,单元测试都是一种快速捕捉错误的低风险方式。

Broom guy shouting meme labeled "Unit test all the things!"

什么是集成测试?

集成测试检查不同的代码块是否在本地环境中成功交互。一个 "代码块 "可以有多种表现形式,但一般来说,集成测试涉及验证服务/API的交互。由于集成测试通常是本地的,你可能需要模拟不同的服务。

"嘲弄 "一个服务只是意味着你在模拟一个服务的输入和输出,而不是实际运行整个逻辑。嘲弄不是集成测试所独有的,但它们经常被用在集成测试中。要了解更多关于嘲弄的信息,请查看这篇关于Python中嘲弄的博文

为什么我应该使用它们?

有效的、可扩展的代码库通常由许多小块的代码组成,它们都能很好地完成自己的工作,但我们怎么能知道它们是否成功地协同工作呢?集成测试允许你验证服务之间的 "胶水",即API调用或数据库查询。当你的代码库变大并包括更复杂的交互时,这就很方便了。

Image of two drawers crashing into each other labeled "Unit tests passing. Not integration tests."

我应该什么时候使用它们?

集成测试并不像单元测试那样无处不在,但有很多理由可以使用它们,例如:

  • 当你有不同人编写的服务在一起工作时
  • 测试你的应用程序的数据库交互,或你的应用程序的前端/后端之间的交互
  • 实施 "合同测试",也就是验证你的API是否按预期定义。

什么是E2E测试?

端到端测试,或E2E测试,是一种从用户角度验证你的代码部署行为的方式。你自动化了一个用户模拟,作为一个黑匣子与你的系统互动,所以所有重要的是用户的操作是否及时对应于正确的输出。这些测试通常在开发或暂存环境中进行,以便尽可能地与生产中的用户交互相匹配。

为什么我应该使用它们?

E2E测试就像参加模拟考试一样--它是最接近真实情况的测试。验证你的代码在接近真实的情况下工作,可以提高你对你的代码在真实环境中工作的信心。

我应该什么时候使用它们?

E2E测试很复杂,很难实现。它们在生产级代码中最常见,所以如果手动测试更有效的话,你可能可以在宠物项目或学校作业上省下时间。综上所述,在以下情况下使用E2E测试:

  • 除了你自己之外,还会有用户
  • 你有足够的基础设施来建立一个暂存或开发环境

Success kid meme labeled "It ain"t over until the E2E are over"

关键差异的总结

总的来说,每种测试类型都有其优势和劣势。当决定使用哪种测试类型时,最终要看其目的/常见用例是否适合你,以及其属性(即执行时间,所需的技术基础设施等)对你的系统是否可行。

请看下面的图表,以了解每种测试类型的相同和不同之处:

Triple venn diagram for Unit Tests, Integration Tests, and E2E with pros and cons in each section