人人都会AI编程

20.2 E2E 端到端测试:Cypress / Playwright

更新时间:2026-07-11

端到端(End-to-End,简称 E2E)测试模拟真实用户在浏览器中的完整操作流程:打开页面、点击按钮、填写表单、跳转路由、验证结果。它不关心内部函数如何实现,只关心“用户最终看到和体验到的功能是否正确”。

在 Vue 项目中,E2E 测试主要用于保障关键业务流程不被回归破坏,例如登录注册、下单支付、权限流转等跨组件的长链路场景。

目前社区最主流的两款 E2E 测试工具是 CypressPlaywright。它们都能在真实浏览器中运行测试,但设计思路和适用场景略有不同。

Cypress:前端开发者的“贴身测试助手”

Cypress 是一个专为现代 Web 应用设计的测试框架,最大的优势是开发体验极佳

  • 安装与启动简单:一行命令就能在项目中引入,自带图形化测试运行器,测试执行过程会录像、截图,并且可以直接在界面中点击某一步骤查看当时的 DOM 和网络请求状态,调试起来非常直观。
  • 实时重跑:保存测试文件后自动重新执行,几乎等同于“边写边看”。
  • 内置等待机制:大部分命令会自动等待元素出现、动画结束、请求完成,不需要手写大量 sleep 或显式等待,测试代码更健壮。
  • 与 Vue DevTools 理念一致的调试体验:你可以在 Cypress 运行器中直接操作 Vue 组件的数据,甚至使用 Vue Test Utils 的一部分能力来做更精细的断言。

Vue 项目中使用 Cypress 的基本示例:

// 测试一个简单的计数器组件
describe('计数器', () => {
  it('点击按钮数字增加', () => {
    cy.visit('/counter')                  // 访问页面
    cy.contains('span', '0')             // 断言初始值
    cy.get('button').click()             // 点击按钮
    cy.contains('span', '1')             // 断言更新后的值
  })
})

Cypress 的局限与适用场景
Cypress 的架构决定了它只能测试单一浏览器标签页,无法同时操控多个标签页或跨域 iframe(虽然可以通过一些配置绕过,但不够原生)。另外它对浏览器的支持以 Chrome 系为主,Firefox 和 WebKit 支持相对较晚且不完全。如果你的测试场景不涉及多窗口切换或必须覆盖多种浏览器引擎,Cypress 是上手最快、反馈最爽的选择,尤其适合中小型项目或对测试实时交互要求高的团队。

Playwright:多浏览器全覆盖的“重型武器”

Playwright 由微软开发,定位是跨浏览器的自动化测试平台,支持 Chromium、Firefox 和 WebKit 三大引擎,并且可以模拟移动端设备、网络条件、地理位置等。

  • 多浏览器 / 多标签页支持:天然支持同时打开多个页面对象,适合测试如 OAuth 登录跳转、多窗口交互等复杂场景。
  • 强大的网络拦截和模拟:可以模拟各种 HTTP 响应、网络错误、慢速网络,非常适合测试容错逻辑和离线体验。
  • 自动等待与重试:与 Cypress 类似,Playwright 也会自动等待元素可操作,但它的等待策略更偏向“智能重试直到通过断言”,适合测试不稳定的异步内容。
  • 移动端模拟:可以设置 viewport、触摸事件等,帮助验证 H5 和响应式布局。

Vue 项目中使用 Playwright 的基本示例:

const { test, expect } = require('@playwright/test')

test('计数器功能正常', async ({ page }) => {
  await page.goto('/counter')
  await expect(page.locator('span')).toHaveText('0')
  await page.click('button')
  await expect(page.locator('span')).toHaveText('1')
})

Playwright 的配置更灵活,但学习曲线比 Cypress 稍陡峭,因为它需要理解浏览器上下文(Browser Context)的概念。不过它的断言和定位器设计非常清晰,一旦度过初期适应阶段,就能发挥极强威力,尤其适合需要严格多浏览器兼容性或复杂交互流程的企业级项目。

二者选型建议(没有绝对对错,看团队需求)

| 决策因素 | 推荐 Cypress | 推荐 Playwright |
|----------|-------------|-----------------|
| 快速上手、实时反馈的测试开发体验 | ✅ | ⚠️ 也可以,但稍显工程化 |
| 需要测试 Firefox / WebKit | ❌ 支持有限 | ✅ 原生支持 |
| 需要多标签页或跨域 iframe | ❌ 受限 | ✅ 天然支持 |
| 团队更熟悉 Vue DevTools 调试范式 | ✅ | ⚠️ 调试工具也强,但风格不同 |
| 移动端 H5 或设备模拟 | ⚠️ 可通过插件 | ✅ 内置丰富 |
| 社区插件与文档的丰富度 | ✅ 庞大 | ✅ 增长迅速 |

一个务实的策略:如果项目由前端自驱、规模不大、浏览器兼容要求不高,先用 Cypress 快速落地尝到测试的甜头;当业务增长到需要覆盖更多浏览器或复杂交互时,再引入 Playwright 作为补充,甚至可以二者并存(如用 Cypress 测核心功能回归,Playwright 测兼容性)。

E2E 测试不要求 100% 覆盖所有 UI 细节,而是守护那些“绝对不能出错”的关键流程。花少量时间在 Cypress 或 Playwright 上编写几条核心用例,远比上线后用户替你“手动测试”要划算得多。