关于 vitest
vitest 是面向使用 Vite 项目的开发者的测试技能,涵盖测试编写、配置、Mock、覆盖率、浏览器模式及迁移。内容针对 Vitest 5.x,强调按项目环境选择命令并验证相关改动。
主要功能
- 01指导 Vitest 配置与测试执行
- 02涵盖 Mock、计时器与快照
- 03说明覆盖率和浏览器模式
- 04提供项目、并发池与报告器指引
- 05指导 Jest 与 Vitest 版本迁移
适用场景
- 01为 Vite 项目编写或运行测试
- 02调整 Mock、快照或覆盖率设置
- 03排查浏览器测试或迁移问题
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ dobroslavradosavljevic/ skills --skill vitest安装后在 Claude Code 中输入/vitest确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
agents/openai.yamlreferences/config-cli-api.mdcoverage-browser-projects.mdmigration.mdmocking-snapshots.mdsource-map.mdusage-guide.md详细介绍
Vitest
当工作涉及 Vitest 时使用此技能:编写/运行测试、配置、模拟/快照、覆盖率、浏览器模式、项目/池、报告器,或从 Jest / Vitest 3 / Vitest 4 迁移。
快照:[email protected](2026-10-01)。如果版本不同,请根据 source-map.md 刷新内容。
工作流
- 检查本地 Vitest 环境:
- 包版本:
vitest和版本对齐的@vitest/*(快照版本为 5.0.3)。Node^22.12 || ^24 || >=26。Vite 对等依赖^6.4 || ^7 || ^8(必需;使用 Yarn 时必须显式列出vite)。 - 配置:专用的
vitest.config.*(会完全覆盖vite.config)与 Vite 配置中的test: {}。不会从父目录查找配置。 - 脚本:CI 中优先使用
vitest run;如果项目使用 Vitest,请勿使用bun test(Bun 的运行器),改用bun run test/bunx vitest。 - 环境:
node(默认)与jsdom/happy-dom,以及 Browser Mode 项目。 - 产物:项目根目录下的
.vitest/(将其加入 gitignore)。
- 包版本:
- 日常使用方法请先参阅 usage-guide.md。
- 版本不一致,或任务涉及浏览器/覆盖率/迁移时,请刷新文档。从 source-map.md 开始。
- 按需查阅更深入的资料:
- 配置、CLI、测试 API、环境、设置:config-cli-api.md。
vi模拟、vi.when、计时器、环境变量替身、快照:mocking-snapshots.md。- 覆盖率、浏览器模式、项目、池、报告器、基准测试:coverage-browser-projects.md。
- Jest / Vitest 3 → 4 / 4 → 5:migration.md。
- 优先使用 Vitest 5.x API(默认
extends: true的projects、maxWorkers、浏览器提供程序工厂、作为测试上下文 fixture 的bench、vi.when)。确保@vitest/*包与vitest版本一致。 - 使用最精简且有效的命令进行验证(
vitest run path -t "name"、覆盖率,或浏览器项目)。仅在调整池/隔离/缓存时使用vitest doctor。
核心判断
- Vitest 是由 Vite 驱动、兼容 Jest API 的测试运行器,不是 Bun 内置的
bun test。 - CI / 钩子:始终使用
vitest run(或--run)。普通的vitest会进入监听模式;在非交互环境中会持续运行,除非 CI/非 TTY 环境强制其运行一次。 - 除非设置了
globals: true,否则应从vitest导入。优先显式导入,以便 Agent 更清楚地理解代码。 vi.mock/vi.unmock/vi.hoisted会被提升,且必须位于顶层;嵌套调用会抛出错误。工厂函数不能闭包捕获未提升的局部变量。clearMocks默认值为true(每个测试前清除调用历史,但保留实现)。共享模拟的并发测试可能需要设置clearMocks: false。- 并发测试与快照/断言:使用测试回调中的上下文
expect,不要使用全局expect。 - 始终对
resolves/rejects/toMatchFileSnapshot/expect.poll使用await;未等待的异步断言会导致测试失败。 - 默认池为
forks。原生扩展表现异常时,优先使用它,而非threads。 - 专用的
vitest.config.*会忽略vite.config选项;扩展 Vite 插件/别名时请使用mergeConfig。 - 内联的
test.projects会继承根配置(默认extends: true),并可能共享 Vite 服务器。文件/目录项目不会继承。 - 项目中的覆盖率仅作用于根配置;请显式设置
coverage.include。模式会匹配相对于项目根目录的路径(不支持contains)。 - Browser Mode 不等同于
environment: 'jsdom';请使用browser.enabled和提供程序包。定位器默认采用精确匹配。 bench不是顶层导入项;请在*.bench.*文件中使用{ bench }fixture。- Vite 会转换测试,但不会进行类型检查;请使用可选的
typecheck或项目的tsc单独检查。
验证
优先使用仓库自带的命令。对于有意义的 Vitest 工作,覆盖相关子集:
- 运行
bunx vitest --version,并确认@vitest/*版本一致。 - 运行聚焦的
vitest run <file> -t "<name>"(或使用:line过滤器)。完整名称使用>(-t 'suite > test')。 - 仅在有意更新时使用
-u/ watchu更新快照;检查差异。 - 覆盖率:在阈值或报告有意义时运行
vitest run --coverage。 - Browser 项目:在 UI/组件测试发生变更时,运行无头 chromium 冒烟测试。
- 迁移:确保不再存在
workspace、字符串形式的 browser providers、poolOptions、test(name, fn, options)、嵌套的vi.mock、顶层bench导入、test.sequential或browser.api。
报告运行了哪些检查、哪些未运行,以及仍存在哪些 Vitest 版本假设。
评论
支持 Markdown