vscode本身不运行测试,仅调用本地jest执行;插件失效、断点不生效、测试不可见,90%因jest命令终端无法运行或testmatch配置错误、缺少--runinband参数。

VSCode 本身不运行测试,它只是把命令转给 Jest 执行;插件点不动、断点不生效、找不到测试,90% 是因为 jest 命令在终端里就跑不通,或者配置没对齐。
确认 jest 命令能在终端里直接运行
这是所有后续操作的前提。VSCode 插件(比如 orta.vscode-jest)本质就是调用你本地的 jest 可执行文件,它不会帮你装 Jest,也不会自动读取 package.json 脚本。
- 在 VSCode 集成终端中执行
npx jest --version,必须能输出版本号(如29.7.0) - 如果报错
command not found: jest,说明没装或没装对:运行npm install --save-dev jest @types/jest - 别依赖全局
npm install -g jest—— 插件默认找项目级node_modules/.bin/jest,全局安装常导致版本错乱或路径找不到 - 用 pnpm?改用
pnpx jest --version;用 yarn?用yarn jest --version
testMatch 必须匹配你的测试文件名和位置
VSCode 测试面板(Test Explorer)和 orta.vscode-jest 都靠 jest.config.js 里的 testMatch 扫描文件。配错就等于“看不见”测试,图标不亮、右键没菜单、点运行没反应。
- 默认值
["**/__tests__/**/*.[jt]s?(x)", "**/?(*.)+(spec|test).[jt]s?(x)"]不会匹配src/components/Button.unit.tsx或tests/Api.test.ts - 如果你的测试文件后缀是
.unit.tsx,加一条:"**/*.unit.{ts,tsx}" - 如果你把测试全放在
src/tests/下,改成:"<rootdir>/src/tests/**/*.{test,spec}.{js,ts,tsx}"</rootdir> - 别同时写
testMatch和testRegex——testMatch优先级更高,后者会被忽略
调试单个测试时必须加 --runInBand
Jest 默认多进程并行跑测试,而 VSCode 的 Node.js 调试器只能 attach 到主进程。不加 --runInBand,断点基本不会触发,或者只在某个子进程里静默停住,你根本看不到。
- 不要依赖插件“自动加参数”——手动写进
.vscode/launch.json才可靠:
{
"type": "node",
"request": "launch",
"name": "Debug Jest Tests",
"program": "${workspaceFolder}/node_modules/.bin/jest",
"args": ["--runInBand", "--testNamePattern", "should render button"],
"console": "integratedTerminal"
}
jest.config.js 中如果有 maxWorkers,务必设为 1 或删掉,否则和 --runInBand 冲突tsconfig.json 同时开启:"sourceMap": true 和 "inlineSources": true
插件组合不能装错或漏装
VSCode 的 Test Explorer 是通用 UI 层,真正干活的是框架专用 adapter。装错一个,图标灰色、“No test provider registered”,点击完全无响应。
- Jest 用户:必装
ms-vscode.test-adapter-converter+hbenl.vscode-test-explorer+orta.vscode-jest(轻量)或kavod-io.vscode-jest-test-adapter(推荐用于 Jest 29+) - Vitest 用户:装
webfreak.vitest-explorer,且vitest必须本地安装(npm install --save-dev vitest),不兼容pnpm dlx vitest - Python 用户:用
ms-python.python自带测试支持,配python.testing.pytestArgs即可,不用额外 adapter - 装完必须彻底退出 VSCode 再重开,不是“重载窗口”——旧插件缓存可能卡住 adapter 加载
最常被跳过的其实是 testMatch 和 --runInBand 这两个点:一个决定“能不能看见测试”,一个决定“断点能不能停住”。它们不报错,但会让你反复怀疑插件坏了、VSCode 坏了、甚至自己代码写错了。











