单元测试验证单个函数或模块逻辑,隔离依赖、速度快;集成测试验证多模块协作,贴近真实场景但较慢;二者互补,应先写单元测试再补充关键集成测试,并注重测试可维护性。

JavaScript 代码质量主要靠测试来保障,而单元测试和集成测试是两种基础且互补的测试类型。它们目标不同、粒度不同、运行速度和维护成本也不同——选对测试类型,才能高效发现问题。
单元测试:验证单个函数或模块是否按预期工作
单元测试聚焦最小可测单元(比如一个函数、一个类的方法),用隔离方式运行,不依赖外部系统(如 API、数据库、DOM)。它速度快、反馈及时,是开发时最常写的测试。
- 用 Jest 或 Vitest 搭配 mock 模拟依赖,确保只测目标逻辑
- 例如测试一个计算折扣价的函数:
calculateDiscount(price, rate),只需传入不同数值,断言返回结果是否正确 - 理想情况:每个纯函数、工具方法、组件逻辑分支都覆盖,覆盖率建议达 70% 以上(非硬性指标,重在关键路径)
集成测试:验证多个模块组合后能否协同工作
集成测试不隔离依赖,而是把相关模块(如 React 组件 + API 调用 + 状态管理)连起来跑,检查它们之间“对接”是否正常。它更贴近真实使用场景,但运行慢、调试难、易受环境影响。
- 常用工具包括 Cypress(端到端倾向)、Testing Library + Jest(组件集成)、或 Vitest 配合真实 API mock
- 例如测试一个用户登录流程:输入账号密码 → 触发 API 请求 → 更新全局状态 → 跳转页面,这一串协作需要集成测试来捕获接口字段错位、状态未同步等问题
- 不必全覆盖,优先覆盖核心业务流(如下单、支付、表单提交)和跨模块交互点
怎么搭配使用才合理
单元测试是地基,集成测试是承重墙。没有单元测试,集成测试失败难定位;只有单元测试,可能掩盖模块间协作缺陷。
立即学习“Java免费学习笔记(深入)”;
- 写新功能时:先写单元测试保证逻辑正确,再写少量集成测试验证主流程
- 重构时:靠单元测试守住边界,防止改出副作用
- CI 流程中:单元测试必须全部通过才允许合并;集成测试可设为“非阻塞”,失败时告警但不中断发布
别忽略测试可维护性
测试代码也是代码。写得随意,很快会变成负担。
- 测试命名要描述行为,比如
should calculate final price with tax when isVip is true,而不是test1 - 避免测试逻辑与实现强耦合(如断言内部变量名、过度校验无关细节)
- 用 Arrange-Act-Assert 结构组织测试代码,清晰易读











