Jest vs Vitest:2024年JavaScript测试框架的正面交锋
如果你最近启动了一个新的前端项目,大概率会面临这个选择:测试框架用 Jest 还是 Vitest?
先看一组数据。根据 State of JS 2023 的调研,Jest 的使用率仍然高达 74%,但 Vitest 在"满意度"和"使用意愿"两项指标上已经反超。npm 周下载量方面,Jest 稳定在 1800 万左右,Vitest 则从 2022 年的 20 万飙升至现在的 400 万。增长曲线说明了一切。
性能:Vite 带来的原生优势
Vitest 的第一个卖点是快。它基于 Vite,利用 esbuild 做依赖预构建,用原生 ESM 运行测试。一个包含 200 个测试文件的仓库,Jest 冷启动需要 8-12 秒,Vitest 只需要 1-2 秒。热更新场景下差距更明显,Vitest 的 HMR 几乎是即时的。
Jest 的慢主要来自它的转译流程。它使用 Babel 或 ts-jest 处理 TypeScript,每次运行都要重新转换整个代码库。虽然 Jest 29 引入了 SWC 支持,但配置起来麻烦,而且 SWC 对 decorator 和某些 Babel 插件的兼容性并不完美。
说句公道话,Jest 的慢是相对的。一个小型项目,两者差距可能只有几秒。但项目一旦超过 500 个测试文件,Vitest 的体验优势就非常明显了。
兼容性:Jest 的护城河
Jest 最大的资产是生态。它从 2014 年诞生至今,积累了海量的文档、插件和社区解决方案。你在网上搜到的大部分测试相关教程,默认都是 Jest。
Vitest 的优势在于 API 几乎完全兼容 Jest。describe、it、expect、mock 这些核心 API 用法一致,迁移成本很低。但细节处有差异,比如 jest.mock 的工厂函数在 Vitest 中需要写成 vi.mock,jest.fn() 对应 vi.fn(),模块模拟的机制也不完全相同。
有一个坑值得注意:Vitest 对 ESM 的支持是原生的,而 Jest 的 ESM 支持直到 28 版本才稳定,且仍然有一些限制。如果你的项目使用纯 ESM 的依赖包,Vitest 会省去很多麻烦。
配置体验:从零到一的速度
Vitest 的配置几乎为零。如果你已经有 Vite 配置,Vitest 会自动读取它。没有 Vite 的项目,Vitest 也能独立运行,但优势会打折扣。
Jest 的配置则相对繁琐。需要安装 jest、ts-jest 或 babel-jest、@types/jest,还要配置 moduleNameMapper 处理路径别名,setupFilesAfterEnv 引入测试工具。一个典型的 Jest 配置动辄 40-60 行。
但配置繁琐的代价换来的是稳定性。Jest 的配置体系虽然复杂,但经过多年迭代,坑基本都被踩平了。Vitest 还在快速演进中,偶尔会遇到一些文档没覆盖到的边界情况。
真实场景下的选择建议
如果你在维护一个大型存量项目,测试用例已经用 Jest 写了很多,迁移成本会很高。除非测试速度已经严重影响开发效率,否则不建议折腾。
如果你在开新项目,或者项目已经使用了 Vite 作为构建工具,Vitest 是更顺手的选择。它的速度和 TypeScript 支持都是原生优势。
还有一个折中方案:Jest 配合 SWC 使用,可以通过配置把测试速度提升 5-10 倍。但 SWC 的配置本身也是一笔学习成本。
未来的走向
Vitest 的团队正在推进 2.0 版本,计划加入更多 Jest 兼容特性,同时优化大型项目的性能。Jest 团队也在持续改进,Meta 内部仍然大量使用 Jest,短期内不会放弃维护。
两个框架都在进步,选择哪个都不会错。关键看你的项目场景和团队熟悉度。工具是拿来用的,不是拿来比的。