FE-13-前端测试:单元、集成、E2E
本节目标:掌握现代前端测试体系:单元测试(Vitest)、组件测试(Testing Library)、E2E(Playwright),能搭建完整测试流水线。
1. 测试金字塔
1 | /\ |
比例建议:70% 单元 / 20% 集成 / 10% E2E
2. 单元测试:Vitest
Vitest = Jest 的现代替代,原生 ESM、TypeScript、速度快。
2.1 初始化
1 | npm install -D vitest @vitest/ui |
1 | // vite.config.ts |
2.2 基本测试
1 | // math.ts |
2.3 表驱动测试
1 | describe('add', () => { |
2.4 Mock
1 | import { vi, describe, it, expect, beforeEach } from 'vitest'; |
Mock 时间:
1 | import { vi } from 'vitest'; |
2.5 Snapshot 测试
1 | import { expect, it } from 'vitest'; |
注意:快照是”防止意外变化”,不是”保证正确”。变更前要检查快照更新。
3. 组件测试:React Testing Library
RTL 的核心哲学:测用户行为,不测实现细节。
3.1 基本查询
1 | import { render, screen, fireEvent } from '@testing-library/react'; |
3.2 异步操作
1 | import { render, screen, waitFor } from '@testing-library/react'; |
3.3 表单测试
1 | it('submits form with valid data', async () => { |
3.4 上下文 Provider 包裹
1 | function renderWithProviders(ui: React.ReactElement) { |
4. Hooks 测试
1 | import { renderHook, act } from '@testing-library/react'; |
异步 hook:
1 | import { renderHook, waitFor } from '@testing-library/react'; |
5. E2E 测试:Playwright
Playwright = 现代 E2E 框架,支持 Chromium、Firefox、WebKit。
5.1 初始化
1 | npm install -D @playwright/test |
1 | // playwright.config.ts |
5.2 编写测试
1 | // e2e/login.spec.ts |
5.3 Page Object Model
1 | // e2e/pages/LoginPage.ts |
5.4 视觉回归测试
1 | test('homepage looks correct', async ({ page }) => { |
6. 服务端 Mock:MSW
MSW (Mock Service Worker) 拦截 fetch/XHR:
1 | // mocks/handlers.ts |
1 | // test setup |
7. 覆盖率
1 | # Vitest |
覆盖率目标:
- 工具函数:90%+
- 业务组件:70%+
- 整体:70%+(不必追求 100%)
8. CI 集成
1 | # .github/workflows/test.yml |
9. 视觉回归:用 Chromatic
1 | npm install -D chromatic |
Chromatic 在云端对比视觉变化,适合 UI 库。
10. 测试反模式
❌ 测实现细节:
1 | // 错 |
**❌ 测试覆盖率追求 100%**:
- 配置类、类型定义、简单 getter 不需要测
- 重点测业务逻辑
❌ E2E 测一切:
- E2E 慢、贵、不稳定
- 80% 单元 + 20% 集成 + 关键路径 E2E
❌ 快照过度依赖:
- 大量快照 = 大量误报
- 只对”稳定 UI”用快照
❌ 不测边界:
- 空值、null、超长字符串、特殊字符
- 并发、竞态、超时
实战:测试完整流程
1 | 1. 单元测试(开发时跑) |
小结
| 测试类型 | 工具 | 速度 | 覆盖 |
|---|---|---|---|
| 单元 | Vitest | 极快 | 函数、纯逻辑 |
| 组件 | RTL + Vitest | 快 | UI 交互、props |
| 集成 | Vitest + MSW | 中 | 多个模块协作 |
| E2E | Playwright | 慢 | 完整流程 |
| 视觉 | Chromatic / Playwright snapshot | 慢 | UI 一致性 |
| 服务端 mock | MSW | — | 替代真实 API |
2026 推荐:
- 单元/组件:Vitest + React Testing Library
- E2E:Playwright(取代 Cypress)
- API mock:MSW
- 视觉回归:Chromatic(Storybook 集成)
核心原则:
- 测用户行为,不测实现
- 70/20/10 比例
- 测试要快(慢测试会被跳过)
- 不要追求 100% 覆盖率
- CI 必跑测试,没测试的代码别合并
下一节讲可访问性(a11y)与国际化(i18n)。
- 本文作者: CoderSong
- 本文链接: https://jack-song-gif.github.io/2026/09/19/FE-13-前端测试:单元集成E2E/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!