Jest空测试套件执行耗时超200秒问题排查
Jest空测试套件执行耗时过长原因
核心耗时完全来自测试文件的依赖加载阶段,和用例本身是否有执行逻辑无关:Jest在收集测试用例、启动测试套件的阶段,会递归解析测试文件中所有静态导入的模块,完成转译、依赖注入工作,这一步在所有it用例执行之前就会跑完。你写的it.todo、全注释的空用例本身不会产生多少耗时,248秒的等待全耗在依赖解析上。
具体触发原因有三点:
- 测试文件顶部静态导入了
MyContent组件,该组件的依赖链极深:包含@progress/kendo-react-*整套重型UI库、@material-ui/icons图标库,还递归引入了业务层的服务模块、公共组件、常量文件,这些依赖又会拉取自己的子依赖,整个依赖树的文件量非常大。 - 当前Jest配置缺少关键的转译优化规则:默认配置下
node_modules下的文件不会走babel转译,但新版Kendo、MUI都默认输出ESM格式模块,Jest运行在CommonJS环境下加载未转译的ESM文件时,会做运行时兼容转换,这个过程性能极差,是耗时的主要来源。 - 带真实API调用的测试套件之所以总耗时更短,是因为对应测试文件的依赖树更浅,依赖加载阶段仅耗时数秒,哪怕API调用花了20秒,总时长也远低于重型依赖的转译加载耗时。
验证方式
执行Jest时追加--verbose参数输出日志,就能看到慢的测试套件在首个用例开始执行前,就已经消耗了99%的总时长,空用例和todo用例本身的执行时间不足10毫秒。
优化方案
- 调整
transformIgnorePatterns配置,将使用ESM格式的重型第三方依赖加入babel转译范围,避免Jest做运行时兼容转换,配置示例:
"jest": { "transform": { "^.+\\.[t|j]sx?$": "babel-jest" }, "testEnvironment": "jsdom", "transformIgnorePatterns": [ "node_modules/(?!(@progress|@material-ui)/)" ] }
- 保持Jest缓存开启,不要在执行命令中追加
--no-cache参数,首次完成依赖转译后,后续测试会直接读取缓存结果,依赖加载速度会提升90%以上。 - 仅编写todo待办用例、不需要实际执行组件渲染时,可以暂时注释掉对应组件的导入语句,等正式编写用例逻辑时再放开,避免无意义的依赖加载。
内容的提问来源于stack exchange,提问作者AIK DO
相关产品推荐
相关产品推荐

