Jest logo

Jest

零配置的 JavaScript 测试框架

测试工具单元测试快照测试Mock

Jest 是 Meta 开源的 JavaScript 测试框架,以零配置、内置 Mock、快照测试和并行执行著称,长期是 React 生态与 Node.js 项目的默认测试方案,在大型企业代码库中仍占主导地位。

Jest JavaScript 测试框架技术调研

Jest 是 Meta(Facebook)开源的 JavaScript 测试框架,以「零配置」、内置 Mock、快照测试和并行执行著称,长期是 React 生态与 Node.js 项目的默认测试方案。尽管 Vite 项目越来越多转向 Vitest,Jest 在大型企业代码库、React Native 和 Webpack 项目中仍占主导地位。


一、 基本信息

维度关键指标 / 描述
技术标签单元测试 / 快照测试 / Mock / React 生态
开发商Meta(开源社区维护)
官方网站https://jestjs.io/
GitHub 仓库jestjs/jest
npm 包jest
许可协议MIT License
首次发布2014 年
当前版本Jest 29.x(持续维护)
生态成熟度极高(JS 测试领域最广泛使用之一)

二、 技术定位与简介

Jest 是 开箱即用的全功能测试框架

  • 测试运行器:发现、执行、报告测试。
  • 断言库expect 内置丰富 matchers。
  • Mock 系统jest.mockjest.fn 自动 hoisting。
  • 快照测试:UI 与数据结构回归检测。
  • 代码覆盖率:内置 Istanbul 集成。
  • 并行执行:worker 进程加速大套件。

Create React App、React Native、许多 Node 后端项目默认集成 Jest。Vite 新项目更常选 Vitest,但 Jest API 仍是行业 lingua franca。


三、 快速上手安装说明

1. 安装

pnpm add -D jest @types/jest ts-jest

2. jest.config.ts

import type { Config } from 'jest'
 
const config: Config = {
  preset: 'ts-jest',
  testEnvironment: 'jsdom',
  roots: ['<rootDir>/tests'],
  moduleNameMapper: {
    '^@/(.*)$': '<rootDir>/src/$1',
  },
  collectCoverageFrom: ['src/**/*.{ts,tsx}'],
}
 
export default config

3. package.json

{
  "scripts": {
    "test": "jest",
    "test:watch": "jest --watch",
    "test:coverage": "jest --coverage"
  }
}

4. 基础测试

describe('math', () => {
  it('adds numbers', () => {
    expect(1 + 2).toBe(3)
  })
})

5. Mock 模块

jest.mock('./api', () => ({
  fetchUser: jest.fn(() => Promise.resolve({ id: '1', name: 'Alice' })),
}))

6. React 组件测试

pnpm add -D @testing-library/react @testing-library/jest-dom
import { render, screen } from '@testing-library/react'
import '@testing-library/jest-dom'
import Button from './Button'
 
test('renders button', () => {
  render(<Button>Click</Button>)
  expect(screen.getByRole('button')).toHaveTextContent('Click')
})

四、 核心特性

1. 零配置启动

Convention over configuration,新建项目即可运行。

2. 自动 Mock

__mocks__ 目录与 jest.mock 模块隔离。

3. 快照测试

expect(tree).toMatchSnapshot()

4. Timer Mock

jest.useFakeTimers() 控制 setTimeout/setInterval。

5. 并行与隔离

每个测试文件独立 worker,默认进程隔离。

6. Watch 模式

交互式 CLI 过滤失败/相关测试。

7. jest-environment

nodejsdom、自定义 environment。

8. Projects 多配置

Monorepo 多子项目不同 Jest 配置。


五、 适用场景

1. 黄金适用场景

  • Create React App / React Native 项目。
  • Webpack 老项目存量测试。
  • Node.js 后端单元测试。
  • 需要快照测试的组件库。
  • 团队已深度投资 Jest 工具链。
  • 大型企业标准化测试平台。

2. 局限适用场景

  • 新 Vite 项目(优先 Vitest)。
  • ESM 纯模块项目(配置复杂)。
  • 浏览器真实环境组件测试(考虑 Playwright Component Testing)。
  • 追求极致启动速度。

六、 技术亮点

1. 生态最大

教程、插件、Stack Overflow 资源最丰富。

2. 一体化体验

Runner + Assert + Mock + Coverage 无需拼装。

3. 快照测试成熟

视觉/结构回归检测行业标准之一。

4. React 深度集成

Testing Library + Jest 是 React 测试经典组合。

5. 稳定可靠

十年积累,企业级大规模套件验证。


七、 核心概念与架构

digraph Jest_Architecture {
  rankdir=TB
  node [shape=box, style="rounded,filled", fillcolor="#f0f9ff"]
  CLI [label="Jest CLI", fillcolor="#bae6fd"]
  Haste [label="Haste Map\n(Module Graph)"]
  Workers [label="Worker Processes"]
  Runtime [label="jest-runtime"]
  Env [label="Test Environment\n(jsdom/node)"]
  Reporters [label="Reporters"]
 
  CLI -> Haste
  Haste -> Workers
  Workers -> Runtime
  Runtime -> Env
  Workers -> Reporters
}

八、 技术局限与边界

  1. ESM 支持仍别扭:纯 ESM 项目配置繁琐。
  2. Vite 重复配置:alias、transform 需 jest 单独维护。
  3. 速度:冷启动与 watch 通常慢于 Vitest。
  4. jsdom 局限:同 Vitest,非真实浏览器。
  5. 配置膨胀:大型 Monorepo 配置复杂。
  6. 快照滥用:易导致脆弱测试。

九、 生态地图

类别工具
ReactTesting Library、Enzyme(遗留)
Vue@vue/vue2-jest、@vue/test-utils
MockMSW(需 jest-fixed-jsdom 等)
E2Ejest-puppeteer(较少用)
替代Vitest、bun:test、Mocha+Chai

十、 生态集成

方向说明
Testing Library用户行为导向组件测试。
MSWsetupServer + jest setupFiles。
ts-jest / babel-jestTypeScript/JSX 转换。
eslint-plugin-jest测试代码 lint 规则。
CI--ci --coverage --maxWorkers=2

十一、 开发与工程化

1. CI 优化

jest --ci --coverage --maxWorkers=50%

2. 迁移到 Vitest

Vitest 提供 Jest 兼容 API,可渐进迁移:

  • 替换 jestvi
  • 合并配置到 vitest.config.ts
  • 移除 ts-jest/babel-jest

3. 测试放置

遵循项目规范:apps/tests/ 镜像结构。


十二、 性能与安全

  • --maxWorkers 控制 CI 内存占用。
  • --onlyChanged 增量测试加速 PR。
  • Mock 模块注意不泄露 secrets。
  • 快照审查避免提交敏感数据。

十三、 技术对比

框架优势局限适合
Jest生态全、一体化ESM/Vite 摩擦CRA/RN/Webpack
VitestVite 原生、快较新Vite 项目
Mocha灵活可组合需自行拼装定制需求
bun:test速度快生态新Bun 栈

十四、 最佳实践

  1. 新 Vite 项目优先 Vitest;存量 Jest 不必强行迁移。
  2. 优先 Testing Library 查询语义化 DOM,少测实现细节。
  3. 快照仅用于稳定序列化输出,避免大 UI 快照。
  4. jest.mock 放在文件顶部,理解 hoisting 行为。
  5. 异步测试返回 Promise 或使用 async/await。
  6. CI 启用 --ci 禁用 watch,固定 worker 数。
  7. 覆盖率关注关键模块,非全局 100%。
  8. 与 MSW 集成测 API 层,减少 fetch mock。
  9. 定期 --clearCache 排查诡异缓存问题。
  10. Monorepo 用 projects 字段分项目配置。

十五、 学习与社区资源