单元测试指南
测试类型
- 单元测试:指的是以软件的单元为单位进行测试。单元可以是一个函数、一个模块或一个组件。其基本特征是只要输入不变,必定返回同样的输出。软件越容易编写单元测试,通常表明其模块化结构越好,模块间的耦合越弱。
- 集成测试:在单元测试的基础上,将所有模块按照设计要求组装成子系统或系统,进行测试以验证模块间的接口与协作。
- 功能测试:相当于黑盒测试。测试者不了解程序内部逻辑,只关注程序的输入、输出和功能,从用户角度对界面、功能和外部结构进行测试。
- 端到端测试:一种测试方法,用于测试整个软件系统的功能和性能。它模拟真实用户的操作流程,从用户界面开始,验证系统各组件间的交互与协作。
- 冒烟测试:在正式进行全面测试之前,对软件的主要功能进行的快速测试,目的是确认主要功能是否正常,软件是否能运行。
什么是单元测试
单元测试(Unit Testing)是指对软件中的最小可测试单元进行检查和验证的测试活动。最小可测试单元通常是函数、方法或类。
- 目的:在开发过程中尽早发现和解决代码问题,确保软件质量与稳定性。
- 执行者:通常由开发人员编写。
- 特性:自动化、可重复运行。通常利用测试框架和断言库来编写与运行测试用例。
- 优点:
- 提高代码质量和可维护性。
- 减少错误和缺陷。
- 提高代码可读性和可重用性。
- 早期发现问题,降低开发成本与风险。
主流前端单测框架对比
下表对几种主流的 JavaScript/TypeScript 单元测试框架进行了对比:
| 特性 | Vitest | Jest | Mocha | Jasmine | Ava |
|---|---|---|---|---|---|
| 开发者 | 自主研发 | Facebook 开源 | Mochajs 开源 | Pivotal Labs 开源 | 原创 |
| npm周下载 | 4,050,192 | 23,587,892 | 7,660,831 | 1,519,135 | 299,381 |
| 文档质量 | 高(中文) | 中 | 中 | 极低 | 无官方文档 |
| 异步测试 | 支持 | 支持 | 支持 | 支持 | 支持 |
| Mock | 支持 | 支持 | 支持 | 支持 | 支持 |
| 覆盖率 | 支持 | 支持 | 支持 | 支持 | 支持 |
| 快照测试 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
| 并行测试 | 支持 | 支持 | 支持 | 不支持 | 支持 |
| 配置难度 | 中 | 低 | 低 | 低 | 中 |
| 社区支持 | 中 | 高 | 高 | 中 | 中 |
| 断言库 | 内置 | 内置 | 需手动安装 | 需手动安装 | 内置 |
| 应用案例 | Vite, Vue3 | Lodash, React | Express | Angular | - |
总结与选择建议:
- Jest:应用最广泛的“开箱即用”测试框架,适用于各种 JS/TS 项目,社区生态庞大。
- Vitest:Vite 项目的首选测试框架,专为 Vite 设计,与 Vite 的配置、转换器和解析器保持一致,开发体验更优。Vue3、Vite 等新项目多采用它。其 API 与 Jest 高度兼容。
- Mocha:灵活的老牌框架,常见于较老的项目中。需要自行搭配断言库和报告工具。
- 综合建议:
- Vite 项目推荐使用 Vitest。
- 其他类型的前端项目(如 Webpack、Create React App)推荐使用 Jest。
前端开源项目单测使用情况
| 框架分类 | 框架 | 单测框架 |
|---|---|---|
| 前端开源框架 | Vue.js 2.x | Jest |
| Vue.js 3.x | Vitest | |
| Vite | Vitest | |
| React | Jest | |
| Angular | Karma + Jasmine | |
| Svelte | Vitest | |
| Node 开源框架 | Express | Mocha |
| 前端开源 UI 框架 | Element Plus | Vitest |
| Ant Design (React) | Jest | |
| Ant Design Vue | Jest | |
| Naive UI | Jest | |
| NG-ZORRO (Angular) | Ng Test (Karma/Jasmine) | |
| 前端工具库 | Axios | Karma |
| Lodash | Jest | |
| Babel | Jest |
注:部分项目(如 naive-ui、Ant Design Vue)因历史原因或构建工具(Webpack)未使用 Vitest,但新启动的 Vite 项目普遍倾向选择 Vitest。
单测优点
- 提高代码质量与稳定性:从源头上减少 Bug,功能稳定时,单测是保障生产安全的重要防线。
- 减少后期 Bug 数量:帮助开发人员在代码提交前发现并解决问题。
- 实现“文档化”:优秀的单测本身就是最准确、最及时的使用文档。
- 提高开发效率:快速反馈问题,增强重构和修改代码的信心。
- 降低维护成本:通过强制编写可测试的代码来降低模块间的耦合度,从而降低长期维护的复杂度。
- 建立安全网:代码变更时,单元测试能迅速捕获回归错误,是持续集成的关键环节。
参考资源
官方网站
- Jest: https://jestjs.io/ (中文)
- Vitest: https://vitest.dev/
- Vue 测试:
- Vue Test Utils (for Vue 3): https://test-utils.vuejs.org/
- Vue Test Utils (for Vue 2): https://v1.test-utils.vuejs.org/zh/
- Vue.js 官方测试指南: https://vuejs.org/guide/scaling-up/testing.html