统一单元测试规范的核心是结构一致、断言清晰、依赖可控、覆盖合理:文件命名与位置规范,describe/test 描述完整,断言聚焦纯逻辑,mock 外部依赖,且必须覆盖正常、边界、错误三类输入。

团队协作中统一单元测试编写规范,关键不是让所有人写得一模一样,而是让测试行为可预期、可维护、可复现。核心落在“结构一致、断言清晰、依赖可控、覆盖合理”四个点上。
统一测试文件组织与命名
所有测试文件必须以 .test.js 或 .spec.js 结尾,放在对应源码目录下(如 src/utils/formatDate.js → src/utils/formatDate.test.js),或集中于 tests/ 目录但保持路径映射清晰。每个测试文件只测一个模块或函数,避免混杂多个被测目标。
- 用
describe()按功能分组,例如describe('formatDate', ()),内部再按输入类型细分:describe('when timestamp is valid', ...) - 每个
test()或it()描述必须是完整语句,明确“什么输入 → 什么输出”,如returns "2023-01-01" for timestamp 1672531200000 - 禁止使用模糊描述,如
'works'、'should pass'
强制约定断言风格与验证重点
团队需明确:单元测试不验证 UI 渲染、不触发真实网络请求、不读写 localStorage,只验证函数的纯逻辑行为。断言必须聚焦返回值、抛出错误、或 mock 后的调用状态。
- 主断言必须使用
expect(...).toBe()(原始值)或.toEqual()(对象/数组),禁用==或手动比较 - 对异常场景,统一用
expect(() => fn()).toThrow(),而非try/catch+ 手动fail() - 若验证函数被调用,必须同时检查参数,例如:
mockFn.mock.calls[0][0]是否等于期望值
标准化依赖隔离方式
外部影响是测试不稳定主因。团队应规定哪些依赖必须 mock,并提供标准写法模板。
立即学习“Java免费学习笔记(深入)”;
- HTTP 请求:统一用
vi.mock('./api')(Vitest)或jest.mock('./api')(Jest),返回固定响应对象 - 时间相关:不 mock
Date.now,改为函数接收now = Date.now()作为可选参数,测试时传入固定时间戳 - 全局状态(如
localStorage):在beforeEach()中清空并 mock,避免跨测试污染 - 禁止在测试中出现未声明的全局变量或隐式依赖
定义最小覆盖要求与评审红线
不强求 100% 行覆盖率,但每次新增/修改函数,必须覆盖三类输入:
-
正常路径:如
sum(2, 3) → 5 -
边界值:空数组、
null、undefined、极小/极大数、负数等 - 错误输入:类型错误、非法格式(如非 ISO 字符串传给日期解析函数)
代码评审时,若缺少任一类覆盖,视为不通过;若测试中出现 setTimeout、fetch 未 mock、或直接操作 DOM,则必须修改。


















