原文: What is End-to-End Testing and When Should You Use It?

每个重要的应用都应该配备一些测试套件,以验证其稳定性和性能。

有许多类型的测试,每种测试都有自己的目的,涵盖应用的特定方面。因此,当你测试你的应用时,应确保各种测试的良好平衡。

giphy

但是有一种测试通常受到开发者的青睐,因此往往被过度使用,这是端对端测试(E2E)。

什么是端对端测试

对于那些仍在探索软件测试世界的人来说,E2E 测试是在完成应用程序及其所有依赖项时进行验证的过程。

在 E2E 测试中,你创建一个与真实用户将使用的环境相同的环境。然后测试用户可能在你的应用程序上执行的所有操作。

通过端到端测试,你可以测试整个流程,比如登录网站或从在线商店购买产品。

s_EA4D61AC224EF8447071464ABC3123BDD99BABBB705D8D6423915F4DE15DDD1B_1603950228233_2_++1+

但是,如果你过度使用 E2E 测试,你就是在颠倒测试金字塔。我曾经遇到过这样的情况。在我的一个项目中,我计划用 E2E 测试覆盖大部分情况,甚至更糟糕的是,只使用 E2E 测试。幸运的是,我改变了主意。所以现在我想和你分享我学到的东西。

为什么你应该遵循测试金字塔

乱七八糟地编写的测试起初可能看起来和感觉很正常,但最终总是令人痛苦的。

我们编写测试是为了节省更多时间,我们通过自动化测试来实现这一点。当然,我们可以自己打开应用程序并手动测试它们。如果我们只需要做一次,那么就没有问题。但这种情况很少见。

软件总是在不断更新。因此,你需要执行持续测试,以便随时掌握情况。你不可能在每次应用程序更新时都手动运行所有测试。如果你能编写一次测试套件,然后每次想要测试应用程序的某个方面时都运行它,你将节省大量时间。

每个测试都有其自己的目的。如果你超越了每种测试类型的界限,你的测试将开始对你造成伤害而不是帮助。这是因为你最终会花费更多的时间编写和维护测试,而不是开发应用程序本身。换句话说,你将失去自动化测试的最大优势之一。

一个好的起点是遵循测试金字塔。它可以帮助你找到测试的正确平衡。它代表了行业标准的指南,自2000年代中期以来一直持续,因为它仍然具有实用性。

那么这是否意味着开发人员总是遵循其指南?并非如此。有时金字塔看起来像一个倒置的金字塔,其中大部分测试都是 E2E。或者它看起来像一个沙漏,有很多单元测试和 E2E 测试,但没有很多集成测试。

s_EA4D61AC224EF8447071464ABC3123BDD99BABBB705D8D6423915F4DE15DDD1B_1603950198553_02

测试金字塔的三层

测试金字塔通常有三层:单元测试、集成测试和E2E测试。现在让我们详细了解它们。

1. 单元测试

单元测试关注代码的最小单元,如函数或类。

它们简短且没有任何外部依赖。如果它们有外部依赖,你可以使用模拟对象代替。

如果一个单元测试失败,找到问题通常是一个简单的过程。它们的测试范围有限,使得编写、运行和维护变得简单、快速和容易。

2. 集成测试

集成测试关注两个独立实体之间的交互。它们通常运行速度较慢,因为需要设置更多内容。

如果集成测试失败,找到问题会更具挑战性,因为失败范围更大。

编写和维护集成测试也相对困难,主要是因为它们需要更高级的模拟和更广泛的测试范围。

3. 端对端测试

最后,E2E 测试关注从最简单到最复杂的流程。它们可以被看成多步骤的集成测试。

这些测试运行速度最慢,因为它们涉及构建、部署、启动浏览器以及在应用程序中执行操作。

如果E2E测试失败,找到问题通常很困难,因为现在失败范围扩展到整个应用程序。基本上,在路径中,任何东西都可能出问题。

在这里考虑的三种测试类型中,它们无疑是最难编写和维护的,因为测试范围巨大,而且涉及整个应用程序。

希望你现在能明白为什么测试金字塔是这样设计的。从底层到顶层,每一层测试都代表着速度的降低以及范围、复杂性维护需求的增加。

这就是为什么要记住的一件重要事情是,E2E测试不能取代其他方法——它是为了扩展它们。E2E测试的目的是定义明确的,测试不应超出这个范围。

理想情况下,测试应该尽可能地在金字塔的根部捕捉到错误。E2E测试的目的是验证按钮、表单、更改、链接、外部流程以及整个工作流程的功能是否正常运行。

用代码测试与无代码测试

总的来说,有两种测试类型:手动测试和自动化测试。这意味着我们可以通过手动或使用脚本进行测试。

第二种方法是最常用的。但是自动化测试可以进一步分为两部分:
用代码测试无代码测试

用代码测试

当你使用代码进行测试时,你可以使用能够自动化浏览器的框架。最受欢迎的工具之一是 Selenium,但我更喜欢并经常在我的项目中使用 Cypress(仅适用于 JavaScript)。然而,它们的工作方式大致相同。

基本上,使用这样的工具,你可以模拟网络浏览器并指示它们在目标应用程序上执行不同的操作。之后,你可以测试应用程序是否对相应的操作做出了响应。

下面是一个简单的模拟示例,摘自 Cypress 文档,以帮助你更好地了解这个工具的工作原理:

s_EA8BC9D2CF83E24BF57AB3EC5A73F372F5ADA41ABD62DE1DA2D26BB58DE3CD82_1603530185695_carbon

上图是来自文档的原始代码

让我们看看发生了什么:

  1. 假设用户访问 https://example.cypress.io
  2. 当他们点击标签为 “type” 的链接时,URL 应该包含 /commands/actions
  3. 如果他们在 .action-email 输入框中输入 “fake@email.com”,那么 .action-email 输入框的值应为 “fake@email.com”。

无代码测试

无代码测试情况下,你使用由人工智能驱动的框架来记录你的操作。根据一些额外的信息,它们测试目标应用程序是否按预期响应。

这些工具通常看起来像低代码平台,你可以拖放不同的面板。其中一个工具是 TestCraft,它是基于 Selenium 的 无代码 解决方案。

s_EA8BC9D2CF83E24BF57AB3EC5A73F372F5ADA41ABD62DE1DA2D26BB58DE3CD82_1603531312592_ezgif-3-e3440d13da31

由于它们提供的功能(如使用简单的拖放选项创建、维护和运行测试,无需编码知识),这类工具通常价格较高。但我想提一下 TestCraft ,因为它们有一个基本包含所有内容的免费计划。

当然,如果你想要速度和省钱,无代码解决方案可能有优势,但这些解决方案很新。因此,它们还无法解决你自己通过代码才能解决的复杂测试。

如果目标应用程序具有一些非常复杂的流程,包括多个移动部件,那么传统的测试方法是最佳选择。但是,如果你有简单的流程,那么无代码解决方案正是你所需要的。

总结

为任何应用编写测试是必不可少的。如果你遵循基本的原则并根据测试类型编写测试套件,那么你的测试将只会改善你的应用程序,并且编写和维护起来也相对容易。

你应该只在适当的场景下使用端到端测试,就像其他测试一样。它们的目的是通过模拟真实用户场景,从头到尾测试应用程序的工作流程。但最后,请记住,大多数错误应尽可能在根源处被捕获。