javaScript单元测试是针对函数等最小单元验证其输入输出与逻辑分支是否符合预期,核心目标是确保代码正确性、支持安全重构、倒逼良好设计并作为活文档,常用Jest工具。

javascript 的单元测试,就是针对代码中最小可测单元(比如一个函数、一个方法)单独验证它是否按预期工作。核心目标是:输入确定的数据,检查输出是否符合预期,同时确保逻辑分支、异常情况都覆盖到。
为什么需要写单元测试?
不靠手动点按钮或看控制台日志来“猜”代码对不对。单元测试能帮你:
- 快速发现修改引发的回归问题(改了 A,结果 B 崩了)
- 让重构更有底气——跑通测试就说明没破坏原有功能
- 倒逼写出更清晰、职责单一、易组合的函数(因为不好测的代码,往往本身设计就有问题)
- 成为活文档——看测试用例就能明白这个函数到底干啥、支持哪些输入
常用工具和基础结构
主流组合是 Jest(零配置、内置断言、Mock 友好) + vs code(装 Jest 插件可实时看结果)。安装后,测试文件通常放在 __tests__ 文件夹或以 .test.js / .spec.js 结尾。
一个最简测试结构长这样:
立即学习“Java免费学习笔记(深入)”;
test('sum 函数应正确返回两数之和', () => { expect(sum(2, 3)).toBe(5); expect(sum(-1, 1)).toBe(0); });
其中 test 定义用例,expect(...).toBe(...) 是断言——声明你“期望”什么发生。
怎么写有用的测试用例?
别只测“正常情况”。重点覆盖三类场景:
- 正常输入:如
calculateTax(100, 0.1)→ 应得10 - 边界值:空字符串、0、
NULL、undefined、极大/极小数字。例如trim(' ')应返回空字符串 - 错误路径:用
expect(() => fn()).toThrow()检查是否抛出预期错误;或验证函数在非法输入下是否安静失败(返回默认值、不崩溃)
每个测试用例聚焦一个行为,名字要直白,比如 'filterUsersByRole throws when role is not String',而不是 'test 1'。
简单例子:测试一个格式化手机号的函数
假设函数:formatPhone('13812345678') 返回 '138-1234-5678',输入非 11 位数字时返回空字符串。
对应测试可写成:
test('formatPhone 正确格式化 11 位数字', () => { expect(formatPhone('13812345678')).toBe('138-1234-5678'); }); test('formatPhone 对非 11 位输入返回空字符串', () => { expect(formatPhone('123')).toBe(''); expect(formatPhone('138123456789')).toBe(''); expect(formatPhone('abc')).toBe(''); });
不需要测浏览器 API 或网络请求本身——那些交给集成测试或 mock 处理。
基本上就这些。不复杂但容易忽略的是:测试不是越多越好,而是要稳、准、快;写测试的时间,远少于调试随机 bug 的时间。