likes
comments
collection
share

前端 E2E Testing

作者站长头像
站长
· 阅读数 9

前端測試之小試前言

前端 E2E Testing

从最基本的测试,即单元测试,覆盖大部分的代码,而端到端(E2E)测试仅关注测试所需的流程。

单元测试 (Unit testing)

  • 单元测试以代码的最小单元为测试对象,因此这种测试类型通常执行速度快(测试范围小)、可靠度高(确保小部分代码正常运作)、有效地隔离失败(从数万行代码中隔离可能的错误)。
  • 然而,在实际应用中,单元测试相当考验系统架构的能力,如果程序架构不足够健全的话 S.O.L.I.D. 通常也意味着单元测试很难编写。当单元测试很容易编写时,通常也表示你的程序架构相对清晰。
  • 理论上,单元测试应该在所有测试中占比最高,因为其相对成本较低。(但前提是程序结构良好,单元测试才会容易编写)。

举例来说,一个简单的函数,用于将数字与货币符号相加,属于单元测试,前面提到的难以测试,是因为它与其他部分有依赖关系(例如需要全局变量才能运行或者影响结果)。

bear-jsutils/src/number/number.spec.ts at main · imagine10255/bear-jsutils

整合测试 (Integration testing)

  • 整合测试会跨越单元测试的范围,对不同模块之间的互动进行测试,这意味着您需要准备更完整的模拟环境来协助完成测试工作。
  • 一般来说,整合测试的数量应该介于单元测试和端对端测试之间,只需对几个主要模块进行整合测试。

端对端测试 (End-to-end testing)

  • 端对端测试是从用户的角度出发对系统进行测试,所需的测试环境是一个完整的系统部署。如果能够通过 Docker 容器技术进行部署,那么设置测试环境的成本将会大幅降低。
  • 由于端对端测试可以准确反映出用户需求是否满足,因此具有较高的商业价值。但要对一个复杂的系统进行完整的端对端测试开发,可能需要相当多的测试用例。如果真的要实现100%的测试覆盖率,成本也会相对提高许多!

为什么需要端对端测试?

当涉及到多步骤的功能,例如需要进行7个步骤时,如果在第3步出现错误,我们必须在修复问题后,从头开始手动测试直至第7步。或许你会说这只是2-3分钟的事情,但来回重复这个过程,累积的时间将会非常多。

又或者是需要用来回更改模拟API返回的数据方式来进行测试,大脑需要记住这些操作是为了什么?

而当产品上线后,我们的功能还会继续迭代或优化,重要的流程可能会被QA测试人员忽略,因为他们不知道是否有修改。在人力有限的情况下,他们可能不会再次进行测试,当用户在线上操作时出现Bug就会很糟糕。

所以为什么需要端对端测试答案应该很清楚了。

什么情况适合e2e测试??

  • 可重复执行的项目
  • 特别重要的 (例如登录、注册和与公司收入相关的)

看起来很简单明了,但可重复执行的部分并不那么容易,因为它牵涉到了API的一部分,所以我们肯定需要使用模拟API来实现可重复执行。

例如,注册功能或需要审核的功能,通常执行一次后就不能再次执行了。

写到这里也就代表了,我们测试的重点是前端用户界面的操作流程,不包括后端API,如果要测试API,那就是后端的单元测试或整合测试了,两者分开。

测试框架的模拟浏览器?

Chrome、Edge和Electron 都使用 Chromium 内核引擎。至于后来支持的 Firefox,Firefox官网提到:

Firefox 是使用 Chromium 技术的浏览器吗? Firefox 并非使用 Chromium 核心(Google Chrome 的浏览器核心的开源项目)的浏览器。实际上,我们是最后一套不采用 Chromium 的主流浏览器。Firefox 使用的是我们专门为 Firefox 打造的 Quantum 核心,以确保能够充分尊重您的数据并确保隐私。

可参考 Cypress Launching Browsers

测试框架有哪些?

目前知道比较有讨论度的有 cypresspuppeteerseleniumplaywrightnightwatch,还蛮多的,但没关系,我们只需要选择

  • 环境建置容易
  • 有UI视觉化检视操作流程
  • 可模拟API
  • 可比对结果,列出绿勾勾或是红叉叉
  • 可在终端执行(例如,用于CICD和Docker等需求)

NightWatch官方提供了一个比较表,也许会偏向他们自己的部分,但可以作为参考。

Comparison with leading frameworks | Developer Guide | Nightwatch.js

测试框架的测试

Cypress

  • Cypress 测试文章

  • 类似于 Jest 的测试语法

  • 提供 API 拦截 Mock 数据

  • 提供 UI 操作测试项目和步骤追踪

  • 支持 Javascript、Typescript

  • 支持 Chrome、Edge、Electron、Firefox

前端 E2E Testing

Playwright

  • 微软官方测试框架
  • 提供录制脚本生成器
  • 提供UI操作测试项目和步骤追踪
  • 支持多种编程语言(JavaScript、Python、Java、Typescript、.NET)
  • 支持多个浏览器核心,包括Chromium、WebKit、Firefox

前端 E2E Testing

Selenium

  • 支援不同的語言 (Java, Python, CSharp, Ruby, Javascript, Kotlin)
  • 平行測試 (分散效能在不同機器上)
  • 支援 Chrome、Edge、IE、Firefox、Safari
  • 文件不太友善

NightWatch

  • 支持多种编程语言(Java、Python、CSharp、Ruby、JavaScript、Kotlin)
  • 并行测试(在不同机器上分散执行测试以提高性能)
  • 支持 Chrome、Edge、IE、Firefox、Safari
  • 文档不够友好

Puppeteer

  • Google官方的爬虫框架
  • 提供官方的Docker镜像
  • 支持Javascript、Typescript
  • 仅支持自家的Chrome核心Chromium
  • 需要自行结合Jest进行测试

结论

不管你選擇的是什麼測試框架,若能符合需求解決問題的都是好框架。

原則上測試框架就是 基於爬蟲的概念來做到測試驗證,所以不只是測試,還能夠作為爬蟲功能

Cypress e2e测试框架 前端測試之小試 Cypress

Playwright e2e测试框架 前端測試之小試 Playwright

最早听说的爬虫框架是Nightwatch,后来使用了Puppeteer(在编写爬虫时使用过)。

根据使用经验,最终决定选择Cypress作为端对端测试工具。它的文档较为详尽,操作较为直观,提供了UI和模拟浏览器的同时支持终端测试方式。虽然它没有Safari浏览器支持,但通常情况下我只使用一种浏览器进行测试。

关于Playwright的候选,有一些可惜的地方,例如HAR(HTTP存档格式)或显示方式,文档和使用方式方面。其他方面与Cypress相似,支持多种编程语言,这既是优点又是缺点,因为不够专精,而且在谷歌搜索相关问题时,会找到其他语言的用法。

其他框架缺乏同时支持UI和模拟浏览器的功能,所以暂时不予考虑。