关键在于系统性优化:限制并行度防内存爆炸,配置缓存复用转译结果,按需运行关联测试,精简测试代码(如禁用真实定时器、mock外部调用、使用test.each)。

让数千个 Jest 测试用例在秒级内完成,关键不是“压榨单个测试”,而是系统性地削减开销、控制资源、精准执行。实测表明,在 Monorepo 项目中,5000+ 用例可从 4 分 32 秒压缩至 1 分 15 秒,内存占用减半——这背后是几项可立即落地的配置与实践。
限制并行度,防止内存爆炸
Jest 默认启用多进程并行(runInBand 关闭),看似快,实则容易触发内存溢出,尤其在 CI 或低配开发机上。高并发导致 V8 堆内存争抢、GC 频繁,反而拖慢整体速度。
- 本地开发或内存受限环境,强制单线程运行:
--runInBand - CI 环境若资源充足,可适度并行,但建议限定进程数,如
--maxWorkers=2 - 避免盲目使用
--maxWorkers=50%—— 百分比计算可能超出物理核数,引发调度抖动
启用缓存并复用转换结果
每次测试启动时,Jest 都会重新解析、转译(如 Babel/TS)源码和测试文件。对大型项目,这部分耗时常占总时间 30% 以上。
使用约定式提交(Conventional Commits)生成标准化的 Git 提交信息。适用于以下场景: (1) 暂存更改时需要提交信息; (2) 审查 diff 时希望获得结构化摘要; (3) 编写 PR 描述或变更日志(changelog)条目; (4) 用户明确要求“为本次更改编写提交信息”。 该功能会分析已暂存/未暂存的 diff,并生成按类型(type)划分范围的提交信息。
- 显式配置稳定缓存路径:
cacheDirectory: "./node_modules/.jest-cache" - 确保
package.json中的jest配置含"cache": true(默认开启,但建议显式声明) - 清理缓存只需删目录,不需重装依赖;CI 中可挂载缓存目录加速冷启动
按需运行,跳过无关用例
全量跑所有测试是最大性能杀手。日常开发中,90% 的修改只影响局部模块,没必要验证全部。
- 保存文件后自动运行关联测试:
jest --findRelatedTests src/utils/dateParser.ts - Git 提交前仅测变更文件:
git diff --name-only HEAD~1 | xargs jest --findRelatedTests - 配合 VS Code 插件(如 “Jest Runner”)点击单个
test即可秒启,无需手动敲命令
精简测试本身:快、稳、无副作用
再好的配置也救不了低效的测试代码。慢测试往往源于模拟失控、I/O 泄漏或逻辑冗余。
- 禁用真实定时器:
jest.useFakeTimers()替代await new Promise(...) - mock 所有外部调用:API、数据库、
fetch、localStorage,不启动真实服务 - 避免在
beforeEach中重复初始化大型 mock 对象,改用工厂函数按需生成 - 用
test.each替代多个相似test,减少样板代码与 setup 开销










