run test按钮灰掉是因为vitest未启动,必须同时满足:项目根目录存在vitest.config.ts(哪怕export default {})、本地安装vitest(npm install --save-dev vitest),且vscode已启用testing api;测试文件识别依赖testmatch配置,断点生效需禁用并行或改用forks单进程池。

Run Test按钮灰掉?先确认vitest.config.ts和本地安装
VSCode里点“Run Test”没反应、按钮灰掉,不是插件没装全,而是Vitest根本没启动。两个硬性条件缺一不可:vitest.config.ts必须存在项目根目录(哪怕只写export default {};),且vitest必须本地安装:npm install --save-dev vitest。全局安装npm install -g vitest完全无效——VSCode测试适配器压根看不到它。
还要检查VSCode是否启用了Testing API:按Ctrl+Shift+P → 输入Testing: Enable Testing → 回车确认。这一步漏了,所有后续配置都白搭。
测试文件不识别?别猜路径,盯死testMatch配置
Vitest Test Explorer插件不自己扫描文件,它只读vitest.config.ts里的testMatch字段。默认只匹配**/*.test.{ts,js}和**/*.spec.{ts,js},如果你把测试放在src/__tests__/Button.test.ts,它就直接忽略。
- 显式配
testMatch: ['**/__tests__/**/*.test.ts'],路径用/或\都行,Vitest内部已normalize - 别混用
include和testMatch:testMatch是第一道门(哪些文件算测试),include是第二道(从已认定的测试里再过滤) - 改完配置后,VSCode不会自动重载——关掉测试侧边栏,再点左侧试管图标重开;或
Ctrl+Shift+P→Vitest: Restart Server
断点不生效?并行是最大干扰项,必须关掉
Vitest默认用worker并行跑测试,而VSCode调试器只能attach到主进程。不断掉并行,断点大概率跳过或完全不触发。
验证方式很简单:终端手动运行vitest --no-file-parallelism --test-timeout=0,看能否停在it()内部。VSCode内置的“Debug Test”按钮经常没传这个参数,优先用JavaScript Debug Terminal(终端右上角下拉选它)执行命令。
如果测试里有顶层JSX或defineComponent,但没配@vitejs/plugin-vue或@vitejs/plugin-react,会直接报ReferenceError,连断点入口都进不去。
想真并发又保断点?换pool策略,别硬扛file-parallelism
追求“极速并发测试”和“稳定断点捕获”本身是矛盾目标。真要兼顾,得绕开--no-file-parallelism这种粗暴方案,改用pool: 'forks'配合singleFork: true:
import { defineConfig } from 'vitest/config'export default defineConfig({ test: { pool: 'forks', poolOptions: { forks: { singleFork: true } } }})
这样既保留进程隔离(防内存污染),又让所有测试共享单个进程,调试器能稳定attach。注意autoAttachChildProcesses: true必须写进launch.json,否则子进程断点照样失效。











