5月28日 04:22

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 的缩写,匹配的是 describetest 块的名字。注意它是正则匹配,写 "add" 会同时命中 "should add""should handle addError"

在 CI 环境中运行

CI 环境和本地开发不同,通常需要关注几个问题:

bash
# CI 中推荐的做法 npx jest --ci --coverage --forceExit --detectOpenHandles
  • --ci:禁用快照交互提示,避免 CI 卡住
  • --coverage:生成覆盖率报告,配合配置阈值可以在覆盖率不达标时让构建失败
  • --forceExit:测试跑完强制退出进程,防止异步操作(定时器、未关闭的连接)导致进程挂起
  • --detectOpenHandles:检测未关闭的句柄,帮你定位是哪个异步操作阻止了退出

调试测试的实用方法

用 console.log 快速排查

最直接的方式,适合简单问题:

javascript
test('计算结果验证', () => { const result = calculate(2, 3); console.log('结果:', result); // 快速看输出 expect(result).toBe(5); });

注意 console.log 在并行模式下输出顺序可能混乱,调试时建议加 --runInBand

用 --runInBand 单线程运行

这是调试的关键选项。Jest 默认用多个 worker 进程并行跑测试,这会导致断点无法命中、日志顺序错乱。--runInBand 让所有测试在同一个进程中顺序执行:

bash
npx jest --runInBand

什么时候必须加 --runInBand

  • 使用 debugger 断点调试时
  • 用 Chrome DevTools Inspector 时
  • 测试间有共享状态(虽然不推荐,但遗留项目常见)
  • 需要 console.log 输出按顺序排列时

用 Node Inspector 调试

在代码中加 debugger 语句,然后用 Node 的 Inspector 模式启动 Jest:

bash
node --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 查看详细输出

bash
npx jest --verbose

--verbose 会让每个测试用例单独列出结果,包括嵌套的 describe 层级。默认输出只显示文件级别的通过/失败,用 --verbose 能快速定位是哪个用例出了问题。

常用命令行选项速查

选项作用使用场景
--runInBand单进程顺序执行调试、需要稳定输出顺序
--watch监听文件变化自动重跑日常开发
--onlyFailures只跑失败的用例修复阶段
--bail遇到失败立即停止快速发现问题
--coverage生成覆盖率报告CI 检查、质量把控
--detectOpenHandles检测未关闭的句柄进程挂起时排查
--forceExit强制退出CI 环境、异步泄漏
--verbose显示详细用例结果定位具体失败用例
--no-cache禁用缓存怀疑缓存导致问题时
--ciCI 模式持续集成环境

常见问题排查

测试跑不过的时候,按这个顺序排查:

  1. 先加 --verbose 看清楚是哪个用例失败
  2. --runInBand 单线程重跑,排除并行导致的问题
  3. --no-cache 排除缓存干扰
  4. debuggerconsole.log 在失败处打断点
  5. 如果进程卡住不退出,用 --detectOpenHandles 找到未关闭的资源

记住一点:并行模式下测试通过但单线程失败,或者反过来,通常说明测试之间有隐式依赖,需要检查是否共享了状态或 mock 没有正确清理。

标签:Jest