Vite 原生的单元测试框架,由 Vite 团队维护。复用 vite 的转换管道与配置,TS/JSX/ESM 开箱即用无需 babel;API 兼容 Jest(describe/it/expect/mock 可直接迁移),是 Vite 项目的事实标准测试方案。当前主线为 4.x(4.0:Browser Mode 转正 + 视觉回归测试 + 全新 UI;4.1:支持 Vite 8、复用项目已安装的 vite、Test Tags 按标签分组过滤)。

核心命令

vitest              # 开发环境默认进入 watch 模式(有 tty 时)
vitest run          # 单次执行后退出,CI 标准用法
vitest watch        # 强制 watch 模式(等同开发环境默认行为)
vitest dev          # watch 模式的别名
vitest bench        # 运行基准测试(Tinybench 驱动,*.bench.ts)
vitest init         # 初始化配置(生成 vitest.config.ts、装依赖)
vitest list         # 不执行,只列出匹配到的测试(--filesOnly 仅列文件)
vitest related      # 只跑与指定源文件相关的测试(配合 git diff 做精准回归)
vitest start        # 启动调试服务(--inspect-brk 挂接 Node inspector)

位置参数是文件名过滤器(支持多模式、glob),例如 vitest run src/utils 只跑路径匹配的文件。

常用选项

-t, --testNamePattern <pattern>   # 按测试名过滤(正则),4.0 新增
--coverage                        # 覆盖率(v8 默认 / istanbul 可选)
--ui                              # 打开 Web UI(4.0 全新界面:树状视图/慢测试热图/快照预览)
--browser                         # Browser Mode,真实浏览器中跑组件测试(4.0 转正)
--environment <env>               # node(默认)/ jsdom / happy-dom
--reporter <name>                 # verbose/dot/json/junit/html 等
--pool <pool>                     # 并发池:forks(默认)/ threads / vmForks / vmThreads
--shard <i/n>                     # 分片执行,如 --shard 1/3,CI 多机分摊
--bail <n>                        # 失败 n 个即停,默认 0 不中断
--changed [ref]                   # 只跑受 git 变更影响的测试(可给分支/commit)
--sequence.shuffle                # 打乱执行顺序,暴露用例间依赖
--update                          # 更新快照(慎用,CI 里禁用)

watch 模式交互键

watch 运行时终端支持快捷键:a 重跑全部、f 只跑失败过的、t 按测试名过滤、p 按文件名过滤、u 更新快照、q 退出。CI 环境无 tty 时自动退化为单次执行。

配置文件

vitest.config.ts 优先于 vite.config.ts(两者都存在时用前者):

import { defineConfig } from 'vitest/config'
 
export default defineConfig({
  test: {
    environment: 'jsdom',
    globals: true,           // describe/it/expect 免 import
    coverage: { provider: 'v8', reporter: ['text', 'html'] },
    include: ['src/**/*.{test,spec}.?(c|m)[jt]s?(x)'],
    projects: ['packages/*'], // monorepo 多项目(原 workspace)
  },
})

实用组合

# 只跑本次 git 改动相关的测试
vitest related $(git diff --name-only HEAD)
 
# CI 单次执行 + 覆盖率 + junit 产物
vitest run --coverage --reporter=junit --outputFile=report.xml
 
# 调试单个文件
vitest start --inspect-brk --no-file-parallelism src/foo.test.ts

与同类工具对比

  • vs Jest:无 babel 转换开销、启动快、原生 ESM/TS;Jest 生态(snapshot/expect API)基本兼容
  • vs README 内置 bun test:bun 更快但生态与报告能力弱,vitest 的 UI/coverage/browser mode 更完整