You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 20:45:31