JavaScript单元测试核心是验证最小可测单元的输入输出,覆盖正常、边界、异常场景;主流工具为Jest或Vitest,React/Vue项目需搭配对应测试库;合格测试须遵循准备-执行-断言三要素,并践行命名直白、单点验证、谨慎Mock等最佳实践。

JavaScript 单元测试的核心是:针对函数或模块的最小可测单元,用确定输入验证确定输出,并覆盖正常、边界和异常场景。
常用测试工具选型
当前主流组合是 Jest(开箱即用)或 Vitest(Vite 生态优先、启动快、兼容 Jest API),适合大多数项目。Node.js 后端可考虑 Mocha + Chai + Sinon(更灵活但需手动配置断言和 Mock)。React 项目推荐 Jest 或 Vitest 配合 @testing-library/react;Vue 推荐 Vitest + @vue/test-utils。不建议从零搭框架——Jest 和 Vitest 已内置运行器、断言、Mock、覆盖率报告等功能。
写一个合格的单元测试三要素
每个测试应清晰体现「准备-执行-断言」流程:
- 准备(Arrange):构造输入数据、创建依赖模拟(如 mock 函数、API 调用)、设置初始状态
- 执行(Act):调用被测函数或方法,仅做一次核心操作
- 断言(Assert):用 toEqual、toBeCalledTimes、toThrow 等匹配器验证返回值、副作用或错误行为
例如测试一个加法函数:// sum.js
export const add = (a, b) => a + b;
// sum.test.js
import { add } from './sum.js';
test('add returns correct sum', () => {
expect(add(2, 3)).toBe(5);
expect(add(-1, 1)).toBe(0);
expect(add(0, 0)).toBe(0);
});
立即学习“Java免费学习笔记(深入)”;
关键最佳实践
-
测试命名直白:用
should/when/returns结构,如should return 0 when both inputs are zero,而非test1 - 一个测试只验证一个关注点:避免在单个 test 块里断言多个不相关行为
- 谨慎使用 Mock:只 mock 外部依赖(如 fetch、定时器、第三方库),不 mock 同一模块内其他函数——那会掩盖设计问题
-
覆盖边界与错误路径:如空数组、null 输入、Promise 拒绝、网络超时等,用
try/catch或await expect(...).rejects捕获 -
保持测试独立、可重复:不依赖全局状态、时间(用
jest.useFakeTimers())、随机数或外部文件
让测试真正有用的小细节
运行时加上 --coverage 查看未覆盖分支;把 testMatch 设为 **/*.test.js 统一识别;用 describe 分组相关测试;对异步逻辑用 async/await 或返回 Promise;CI 中强制要求新增代码行覆盖率达 80%+(非盲目追求 100%)。










