Jest 测试怎么运行和调试?常用命令有哪些?
核心命令一览
运行测试最常用的几个命令:
bash# 运行所有测试 npx jest # 运行指定文件 npx jest path/to/test.spec.js # 运行匹配名称的用例 npx jest --testNamePattern="should add" # 监听模式,文件变动自动重跑 npx jest --watch # 只跑上次失败的用例 npx jest --onlyFailures # 只跑和改动文件相关的用例 npx jest --onlyChanged
--watch 是日常开发最高频的选项,保存即跑,不用手动重复执行。--onlyFailures 在修复阶段很实用——测试多的时候不用每次全量跑一遍。
运行测试的常见场景
按文件或路径筛选
bash# 跑某个目录下的所有测试 npx jest src/utils/ # 用正则匹配文件名 npx jest --testPathPattern="auth"
--testPathPattern 接收正则表达式,比手动拼路径灵活得多。比如项目里测试文件散落在多个目录,用 --testPathPattern="user" 就能一次跑完所有用户相关的测试。
按用例名称筛选
bash# 缩写形式 npx jest -t "login" # 完整写法 npx jest --testNamePattern="should handle error"
-t 是 --testNamePattern 的缩写,匹配的是 describe 或 test 块的名字。注意它是正则匹配,写 "add" 会同时命中 "should add" 和 "should handle addError"。
在 CI 环境中运行
CI 环境和本地开发不同,通常需要关注几个问题:
bash# CI 中推荐的做法 npx jest --ci --coverage --forceExit --detectOpenHandles
--ci:禁用快照交互提示,避免 CI 卡住--coverage:生成覆盖率报告,配合配置阈值可以在覆盖率不达标时让构建失败--forceExit:测试跑完强制退出进程,防止异步操作(定时器、未关闭的连接)导致进程挂起--detectOpenHandles:检测未关闭的句柄,帮你定位是哪个异步操作阻止了退出
调试测试的实用方法
用 console.log 快速排查
最直接的方式,适合简单问题:
javascripttest('计算结果验证', () => { const result = calculate(2, 3); console.log('结果:', result); // 快速看输出 expect(result).toBe(5); });
注意 console.log 在并行模式下输出顺序可能混乱,调试时建议加 --runInBand。
用 --runInBand 单线程运行
这是调试的关键选项。Jest 默认用多个 worker 进程并行跑测试,这会导致断点无法命中、日志顺序错乱。--runInBand 让所有测试在同一个进程中顺序执行:
bashnpx jest --runInBand
什么时候必须加 --runInBand:
- 使用
debugger断点调试时 - 用 Chrome DevTools Inspector 时
- 测试间有共享状态(虽然不推荐,但遗留项目常见)
- 需要 console.log 输出按顺序排列时
用 Node Inspector 调试
在代码中加 debugger 语句,然后用 Node 的 Inspector 模式启动 Jest:
bashnode --inspect-brk ./node_modules/.bin/jest --runInBand
--inspect-brk 会在第一行就暂停,给你时间打开调试工具。然后打开 Chrome,访问 chrome://inspect,点击 "inspect" 就能进入 DevTools 调试界面。
用 VSCode 调试
在 .vscode/launch.json 中添加配置:
json{ "type": "node", "request": "launch", "name": "Jest Current File", "program": "${workspaceFolder}/node_modules/.bin/jest", "args": ["${fileBasenameNoExtension}", "--runInBand"], "console": "integratedTerminal", "internalConsoleOptions": "neverOpen" }
配好之后,打开测试文件直接按 F5 就能断点调试,比每次手敲命令方便很多。
用 --verbose 查看详细输出
bashnpx jest --verbose
--verbose 会让每个测试用例单独列出结果,包括嵌套的 describe 层级。默认输出只显示文件级别的通过/失败,用 --verbose 能快速定位是哪个用例出了问题。
常用命令行选项速查
| 选项 | 作用 | 使用场景 |
|---|---|---|
--runInBand | 单进程顺序执行 | 调试、需要稳定输出顺序 |
--watch | 监听文件变化自动重跑 | 日常开发 |
--onlyFailures | 只跑失败的用例 | 修复阶段 |
--bail | 遇到失败立即停止 | 快速发现问题 |
--coverage | 生成覆盖率报告 | CI 检查、质量把控 |
--detectOpenHandles | 检测未关闭的句柄 | 进程挂起时排查 |
--forceExit | 强制退出 | CI 环境、异步泄漏 |
--verbose | 显示详细用例结果 | 定位具体失败用例 |
--no-cache | 禁用缓存 | 怀疑缓存导致问题时 |
--ci | CI 模式 | 持续集成环境 |
常见问题排查
测试跑不过的时候,按这个顺序排查:
- 先加
--verbose看清楚是哪个用例失败 - 用
--runInBand单线程重跑,排除并行导致的问题 - 加
--no-cache排除缓存干扰 - 用
debugger或console.log在失败处打断点 - 如果进程卡住不退出,用
--detectOpenHandles找到未关闭的资源
记住一点:并行模式下测试通过但单线程失败,或者反过来,通常说明测试之间有隐式依赖,需要检查是否共享了状态或 mock 没有正确清理。