第13章 Vitest 命令行界面(CLI)详解
第13章 命令行界面
命令
vitest
在当前目录启动 Vitest。在开发环境中会自动进入 watch 模式,在 CI(或非交互终端)中会自动进入运行模式。你可以传入一个额外参数作为测试文件的过滤器。例如:
```bash vitest foobar ```
这将仅运行路径中包含 `foobar` 的测试文件。该过滤器仅检查是否包含,不支持正则表达式或通配符模式(除非你的终端在 Vitest 接收过滤器之前已对其进行了处理)。
从 Vitest 3 开始,你还可以通过文件名和行号指定测试:
```bash $ vitest basic/foo.test.ts:10 ```
注意:Vitest 要求提供完整的文件名才能使用此功能。路径可以是相对于当前工作目录的,也可以是绝对路径。
```bash $ vitest basic/foo.js:10 # ✅ $ vitest ./basic/foo.js:10 # ✅ $ vitest /users/project/basic/foo.js:10 # ✅ $ vitest foo:10 # ❌ $ vitest ./basic/foo:10 # ❌ ```
目前 Vitest 也不支持范围指定:
```bash $ vitest basic/foo.test.ts:10, basic/foo.test.ts:25 # ✅ $ vitest basic/foo.test.ts:10-25 # ❌ ```
vitest run
执行单次运行,不启用 watch 模式。
vitest watch
运行所有测试套件,但监控文件变更并在变更时重新运行测试。等同于不带参数调用 `vitest`。在 CI 或标准输入不是 TTY(非交互环境)时,会回退到 `vitest run`。
vitest dev
`vitest watch` 的别名。
vitest related
仅运行覆盖指定源文件列表的测试。支持静态导入(例如 `import('./index.js')` 或 `import index from './index.js'`),但不支持动态导入(例如 `import(filepath)`)。所有文件路径都应相对于根目录。
与 `lint-staged` 或 CI 设置配合使用非常有用。
```bash vitest related /src/index.ts /src/hello-world.js ```
提示:不要忘记 Vitest 默认启用 watch 模式。如果你正在使用像 `lint-staged` 这样的工具,也应该传递 `--run` 选项,以便命令能正常退出。
`.lintstagedrc.js`:
```js export default { '*.{js,ts}': 'vitest related --run', } ```
vitest bench
仅运行基准测试,这些测试用于比较性能结果。
vitest init
`vitest init
```bash vitest init browser ```
vitest list
`vitest list` 命令继承所有 Vitest 选项以打印所有匹配的测试列表。此命令会忽略 `reporters` 选项。默认情况下,它会打印所有匹配文件过滤器和名称模式的测试名称:
```shell vitest list filename.spec.ts -t="some-test" ```
输出示例:
```txt describe > some-test describe > some-test > test 1 describe > some-test > test 2 ```
你可以传递 `--json` 标志以 JSON 格式打印测试或将其保存到单独的文件中:
```bash vitest list filename.spec.ts -t="some-test" --json=./file.json ```
如果 `--json` 标志未接收值,它会将 JSON 输出到标准输出。
你还可以传递 `--filesOnly` 标志以仅打印测试文件:
```bash vitest list --filesOnly ```
输出示例:
```txt tests/test1.test.ts tests/test2.test.ts ```
从 Vitest 5 开始,`vitest list` 通过静态解析测试文件而不是运行它们来收集测试。传递 `--no-static-parse` 可以改为运行文件。Vitest 以有限的并发度解析测试文件,默认值为 `os.availableParallelism()`。你可以通过 `--static-parse-concurrency` 选项更改此值。
vitest doctor
`vitest doctor` 通过在不同的替代配置下运行测试套件来衡量其速度提升幅度。候选配置基于当前配置进行选择:
```bash vitest doctor ```
结果(每次最少运行 3 次):
``` baseline (pool: forks · isolate: true) 4.08s pool: 'threads' 3.64s (-11%) pool: 'vmThreads' 1.33s (-67%) isolate: false 1.28s (-69%)
Recommendation: pool: 'vmThreads' (-67%)
// vitest.config.ts import { defineConfig } from 'vitest/config'
export default defineConfig({ test: { pool: 'vmThreads', // measured -67% on this suite }, }) ```
`isolate: false` 候选配置会额外通过两次随机打乱文件顺序的运行进行验证:如果任何测试依赖于隔离性,该候选配置将被报告为失败而不是推荐。当几个候选配置的速度与最快者接近时,`doctor` 优先选择保持每个文件隔离的配置。
`Doctor` 还会在获胜配置的基础上探测较低的 `maxWorkers` 值:由于每个 worker 都将转换请求通过单个主线程 Vite 服务器转发,因此超过一定数量后,更多的 worker 会使运行变慢而不是变快。从当前 worker 数量的一半开始,`doctor` 会不断减半,只要套件至少快 5%,并将获胜值包含在建议中。
运行 DOM 或自定义环境的套件会在两个 `vm` 池下测量:`vmThreads` 和 `vmForks`:它们通过在每个 worker 中保持一个环境来摊销环境创建成本,同时每个文件仍然获得一个新的 VM 上下文。`vmForks` 使用子进程而不是 worker 线程:每个子进程拥有自己的堆和垃圾回收器,因此根据套件的不同,任何池都可能更快,而 `vmForks` 是那些无法在 worker 线程中运行的套件的 `vm` 选项。
运行 `jsdom` 的项目还会在安装了该包的情况下测量 `environment: 'happy-dom'`。此替换按项目应用;使用其他环境的项目保留其原有环境。`happy-dom` 的 DOM 实现与 `jsdom` 不同,因此依赖于布局或导航的测试在采用此替换前应进行验证。当 `fs` 模块缓存关闭时,`doctor` 会在一次非计时的预热运行(用于填充缓存)之后测量 `fsModuleCache: true`,因此报告的时间是重复运行所付出的代价。
每个测量都运行完整的套件,包括浏览器项目:`isolate: false` 也会影响浏览器模式。那些无法影响浏览器项目的候选配置(`pool`、`environment`、`fs` 模块缓存)仅基于 Node 端项目选择。
失败的候选配置会报告其错误的摘录。如果套件在当前配置下失败,`doctor` 会中止并显示错误:它需要一个通过的基线来进行比较。
较短的套件会被测量多次并报告最佳时间,因此比较反映的是热稳态。`Doctor` 运行完整套件几次,因此花费的时间是正常运行时间的倍数。有关每个候选配置背后的权衡,请参阅“性能优化”。
即使没有候选配置进行比较,`Doctor` 也会测量并报告基线。`vm` 池上的配置还会与 `isolate: false` 的 `pool: 'threads'` 进行比较,后者也重用 worker,但共享文件间的模块状态;已经处于一个 `vm` 池上的配置仍会在另一个 `vm` 池下测量。
Shell 自动补全
Vitest 提供由 `@bomb.sh/tab` 支持的对命令、选项和选项值的 shell 自动补全。
设置
若要永久在 zsh 中设置,将此添加到你的 `~/.zshrc`:
```bash # Add to ~/.zshrc for permanent autocompletions (same can be done for other shells) source <(vitest complete zsh) ```
包管理器集成
`@bomb.sh/tab` 与包管理器集成。直接运行 `vitest` 时自动补全有效:
```npm
npm vitest
对于包管理器的自动补全,你应单独安装 `tab` 的包管理器补全。
选项
提示:Vitest 支持 CLI 参数的驼峰命名和短横线命名。例如,`--passWithNoTests` 和 `--pass-with-no-tests` 都有效(`--no-color` 和 `--inspect-brk` 是例外)。
Vitest 还支持不同的值指定方式:`--reporter dot` 和 `--reporter=dot` 都是有效的。
如果选项支持值数组,你需要多次传递该选项:
`vitest --reporter=dot --reporter=default`
布尔选项可以用 `no-` 前缀取反。将值指定为 `false` 也有效:
`vitest --no-api` `vitest --api=false`
root
CLI: `-r`, `--root
config
CLI: `-c`, `--config
update
CLI: `-u`, `--update [type]` Config: `update` 更新快照(接受布尔值、"new"、"all" 或 "none")
watch
CLI: `-w`, `--watch` Config: `watch` 启用 watch 模式
testNamePattern
CLI: `-t`, `--testNamePattern
dir
CLI: `--dir
ui
CLI: `--ui` 启用 UI
open
Config: `open` 自动打开 UI(默认:`!process.env.CI`)
api.port
CLI: `--api.port [port]` 指定服务器端口。注意如果端口已被占用,Vite 会自动尝试下一个可用端口,因此这可能不是服务器最终监听的实际端口。如果设置为 `true`,将为 51204
api.host
CLI: `--api.host [host]` 指定服务器应监听的 IP 地址。将此设置为 `0.0.0.0` 或 `true` 以监听所有地址,包括 LAN 和公共地址
api.strictPort
CLI: `--api.strictPort` 设置为 `true` 以在端口已被占用时退出,而不是自动尝试下一个可用端口
api.allowExec
CLI: `--api.allowExec` Config: `api.allowExec` 允许 API 执行代码。(在不可信环境中启用此选项时请小心)
api.allowWrite
CLI: `--api.allowWrite` Config: `api.allowWrite` 允许 API 编辑文件。(在不可信环境中启用此选项时请小心)
silent
CLI: `--silent [value]` Config: `silent` 静默来自测试的控制台输出。使用 `'passed-only'` 仅查看失败测试的日志。
hideSkippedTests
CLI: `--hideSkippedTests` 隐藏跳过测试的日志
reporters
CLI: `--reporter
outputFile
CLI: `--outputFile
coverage.provider
CLI: `--coverage.provider
coverage.enabled
CLI: `--coverage.enabled` Config: `coverage.enabled` 启用覆盖率收集。可以使用 `--coverage` CLI 选项覆盖(默认:`false`)
coverage.include
CLI: `--coverage.include
coverage.exclude
CLI: `--coverage.exclude
coverage.clean
CLI: `--coverage.clean` Config: `coverage.clean` 在运行测试前清除覆盖率结果(默认:`true`)
coverage.cleanOnRerun
CLI: `--coverage.cleanOnRerun` Config: `coverage.cleanOnRerun` 在 watch 重新运行时清除覆盖率报告(默认:`true`)
coverage.reportsDirectory
CLI: `--coverage.reportsDirectory
coverage.reporter
CLI: `--coverage.reporter
coverage.reportOnFailure
CLI: `--coverage.reportOnFailure` Config: `coverage.reportOnFailure` 即使测试失败也生成覆盖率报告(默认:`false`)
coverage.allowExternal
CLI: `--coverage.allowExternal` Config: `coverage.allowExternal` 收集项目根目录外文件的覆盖率(默认:`false`)
coverage.skipFull
CLI: `--coverage.skipFull` Config: `coverage.skipFull` 不显示 100% 语句、分支和函数覆盖的文件(默认:`false`)
coverage.thresholds.100
CLI: `--coverage.thresholds.100` Config: `coverage.thresholds.100` 将所有覆盖率阈值设置为 100 的快捷方式(默认:`false`)
coverage.thresholds.perFile
CLI: `--coverage.thresholds.perFile
coverage.thresholds.autoUpdate
CLI: `--coverage.thresholds.autoUpdate
coverage.thresholds.lines
CLI: `--coverage.thresholds.lines
coverage.thresholds.functions
CLI: `--coverage.thresholds.functions
coverage.thresholds.branches
CLI: `--coverage.thresholds.branches
coverage.thresholds.statements
CLI: `--coverage.thresholds.statements
coverage.ignoreClassMethods
CLI: `--coverage.ignoreClassMethods
coverage.processingConcurrency
CLI: `--coverage.processingConcurrency
coverage.customProviderModule
CLI: `--coverage.customProviderModule
coverage.watermarks.statements
CLI: `--coverage.watermarks.statements
coverage.watermarks.lines
CLI: `--coverage.watermarks.lines
coverage.watermarks.branches
CLI: `--coverage.watermarks.branches
coverage.watermarks.functions
CLI: `--coverage.watermarks.functions
coverage.changed
CLI: `--coverage.changed
coverage.excludeAfterRemap
CLI: `--coverage.excludeAfterRemap` Config: `coverage.excludeAfterRemap` 在覆盖率映射回原始源后再次应用排除。(默认:`false`)
coverage.htmlDir
CLI: `--coverage.htmlDir
coverage.autoAttachSubprocess
CLI: `--coverage.autoAttachSubprocess` Config: `coverage.autoAttachSubprocess` 跟踪测试运行期间生成的 `node:child_process` 和 `node:worker_threads` 的覆盖率。仅由 v8 提供程序支持。(默认:`false`)
mode
CLI: `--mode
isolate
CLI: `--isolate` Config: `isolate` 隔离运行每个测试文件。要禁用隔离,请使用 `--no-isolate`(默认:`true`)
globals
CLI: `--globals` Config: `globals` 全局注入 API
injectCjsGlobals
CLI: `--injectCjsGlobals` Config: `injectCjsGlobals` 将 CommonJS 变量(`module`, `exports`, `require`, `__filename`, `__dirname`)注入到每个测试模块中。要禁用,请使用 `--no-inject-cjs-globals`(默认:`true`)
dom
CLI: `--dom` 使用 happy-dom 模拟浏览器 API
browser.enabled
CLI: `--browser.enabled` Config: `browser.enabled` 在浏览器中运行测试。等同于 `--browser.enabled`(默认:`false`)
browser.name
CLI: `--browser.name
browser.headless
CLI: `--browser.headless` Config: `browser.headless` 以无头模式运行浏览器(即不打开 GUI(图形用户界面))。如果你在 CI 中运行 Vitest,它将默认启用(默认:`process.env.CI`)
browser.ui
CLI: `--browser.ui` Config: `browser.ui` 运行测试时显示 Vitest UI(默认:`!process.env.CI`)
browser.detailsPanelPosition
CLI: `--browser.detailsPanelPosition
browser.connectTimeout
CLI: `--browser.connectTimeout
browser.dependencySourcemaps
CLI: `--browser.dependencySourcemaps` Config: `browser.dependencySourcemaps` 在无头运行中向浏览器提供依赖项的源映射,用于 devtools 调试 `node_modules`。报告的测试错误无论如何都会进行源映射。如果你不步入依赖代码,可以使用 `--browser.dependencySourcemaps=false` 来加速测试运行(默认:`true`)
browser.trackUnhandledErrors
CLI: `--browser.trackUnhandledErrors` Config: `browser.trackUnhandledErrors` 控制 Vitest 是否捕获未捕获的异常以便报告(默认:`true`)
browser.trace
CLI: `--browser.trace
browser.traceView.enabled
CLI: `--browser.traceView.enabled` Config: `browser.traceView.enabled` 为浏览器测试启用 Vitest 追踪视图收集(默认:`false`)
browser.traceView.recordCanvas
CLI: `--browser.traceView.recordCanvas` Config: `browser.traceView.recordCanvas` 在追踪视图快照中捕获 canvas 像素(默认:`false`)
browser.traceView.inlineImages
CLI: `--browser.traceView.inlineImages` Config: `browser.traceView.inlineImages` 在追踪视图快照中内联加载的图像像素(默认:`false`)
browser.locators.exact
CLI: `--browser.locators.exact` Config: `browser.locators.exact` 定位器是否默认精确匹配文本(默认:`true`)
pool
CLI: `--pool
execArgv
CLI: `--execArgv
vmMemoryLimit
CLI: `--vmMemoryLimit
fileParallelism
Config: `fileParallelism` 所有测试文件是否并行运行。使用 `--no-file-parallelism` 禁用(默认:`true`)
maxWorkers
CLI: `--maxWorkers
environment
CLI: `--environment
passWithNoTests
CLI: `--passWithNoTests` Config: `passWithNoTests` 当未找到测试时通过
logHeapUsage
CLI: `--logHeapUsage` Config: `logHeapUsage` 在 node 中运行每个测试时显示堆大小
detectAsyncLeaks
CLI: `--detectAsyncLeaks` Config: `detectAsyncLeaks` 检测从测试文件泄漏的异步资源(默认:`false`)
allowOnly
CLI: `--allowOnly` Config: `allowOnly` 允许标记为 `only` 的测试和套件(默认:`!process.env.CI`)
dangerouslyIgnoreUnhandledErrors
CLI: `--dangerouslyIgnoreUnhandledErrors` Config: `dangerouslyIgnoreUnhandledErrors` 忽略发生的任何未处理的错误
changed
CLI: `--changed [since]` Config: `changed` 运行受变更文件影响的测试(默认:`false`)
sequence.shuffle.files
CLI: `--sequence.shuffle.files` Config: `sequence.shuffle.files` 以随机顺序运行文件。启用此选项后,长运行测试不会提前开始。(默认:`false`)
sequence.shuffle.tests
CLI: `--sequence.shuffle.tests` Config: `sequence.shuffle.tests` 以随机顺序运行测试(默认:`false`)
sequence.concurrent
CLI: `--sequence.concurrent` Config: `sequence.concurrent` 让测试并行运行(默认:`false`)
sequence.seed
CLI: `--sequence.seed
sequence.hooks
CLI: `--sequence.hooks
sequence.setupFiles
CLI: `--sequence.setupFiles
inspect
CLI: `--inspect [[host:]port]` 启用 Node.js 检查器(默认:`127.0.0.1:9229`)
inspectBrk
CLI: `--inspectBrk [[host:]port]` 启用 Node.js 检查器并在测试开始前中断
testTimeout
CLI: `--testTimeout
hookTimeout
CLI: `--hookTimeout
bail
CLI: `--bail
retry.count
CLI: `--retry.count
retry.delay
CLI: `--retry.delay
retry.condition
CLI: `--retry.condition
repeats
CLI: `--repeats
diff.aAnnotation
CLI: `--diff.aAnnotation
diff.aIndicator
CLI: `--diff.aIndicator
diff.bAnnotation
CLI: `--diff.bAnnotation
diff.bIndicator
CLI: `--diff.bIndicator
diff.commonIndicator
CLI: `--diff.commonIndicator
diff.contextLines
CLI: `--diff.contextLines
diff.emptyFirstOrLastLinePlaceholder
CLI: `--diff.emptyFirstOrLastLinePlaceholder
diff.expand
CLI: `--diff.expand` Config: `diff.expand` 展开所有通用行(默认:`false`)
diff.includeChangeCounts
CLI: `--diff.includeChangeCounts` Config: `diff.includeChangeCounts` 在差异输出中包含比较计数(默认:`false`)
diff.omitAnnotationLines
CLI: `--diff.omitAnnotationLines` Config: `diff.omitAnnotationLines` 从输出中省略注释行(默认:`false`)
diff.printBasicPrototype
CLI: `--diff.printBasicPrototype` Config: `diff.printBasicPrototype` 打印基本原型 `Object` 和 `Array`(默认:`false`)
diff.maxDepth
CLI: `--diff.maxDepth
diff.truncateThreshold
CLI: `--diff.truncateThreshold
diff.truncateAnnotation
CLI: `--diff.truncateAnnotation
exclude
CLI: `--exclude
expandSnapshotDiff
CLI: `--expandSnapshotDiff` Config: `expandSnapshotDiff` 快照失败时显示完整差异
disableConsoleIntercept
CLI: `--disableConsoleIntercept` Config: `disableConsoleIntercept` 禁用控制台日志的自动拦截(默认:`false`)
typecheck.enabled
CLI: `--typecheck.enabled` Config: `typecheck.enabled` 与测试一起启用类型检查(默认:`false`)
typecheck.only
CLI: `--typecheck.only` Config: `typecheck.only` 仅运行类型检查测试。这会自动启用类型检查(默认:`false`)
typecheck.checker
CLI: `--typecheck.checker
typecheck.allowJs
CLI: `--typecheck.allowJs` Config: `typecheck.allowJs` 允许对 JavaScript 文件进行类型检查。默认从 `tsconfig.json` 获取值
typecheck.ignoreSourceErrors
CLI: `--typecheck.ignoreSourceErrors` Config: `typecheck.ignoreSourceErrors` 忽略源文件中的类型错误
typecheck.build
CLI: `--typecheck.build` Config: `typecheck.build` 使用 TypeScript 构建模式
typecheck.tsconfig
CLI: `--typecheck.tsconfig
typecheck.spawnTimeout
CLI: `--typecheck.spawnTimeout
project
CLI: `-p`, `--project
slowTestThreshold
CLI: `--slowTestThreshold
teardownTimeout
CLI: `--teardownTimeout
cache
CLI: `--cache` Config: `cache` 存储测试结果以优先运行失败和更长的测试文件(默认:`true`)
maxConcurrency
CLI: `--maxConcurrency
fsModuleCache
CLI: `--fsModuleCache` Config: `fsModuleCache` 在文件系统上缓存转换后的模块并在重新运行之间重用它们(默认:`true`)
fsModuleCachePath
CLI: `--fsModuleCachePath
expect.requireAssertions
CLI: `--expect.requireAssertions` Config: `expect.requireAssertions` 要求所有测试至少有一个断言
expect.poll.interval
CLI: `--expect.poll.interval
expect.poll.timeout
CLI: `--expect.poll.timeout
printConsoleTrace
CLI: `--printConsoleTrace` Config: `printConsoleTrace` 始终打印控制台堆栈跟踪
includeTaskLocation
CLI: `--includeTaskLocation` Config: `includeTaskLocation` 在 `location` 属性中收集测试和套件的位置
attachmentsDir
CLI: `--attachmentsDir
run
CLI: `--run` 禁用 watch 模式
color
CLI: `--no-color` 从控制台输出中移除颜色
clearScreen
CLI: `--clearScreen` 在 watch 模式下重新运行测试时清除终端屏幕(默认:`true`)
configLoader
CLI: `--configLoader
standalone
CLI: `--standalone` 启动 Vitest 但不运行测试。测试仅在变更时运行。如果启用了浏览器模式,UI 将自动打开。当传递 CLI 文件过滤器时,此选项将被忽略。(默认:`false`)
listTags
CLI: `--listTags [type]` 列出所有可用标签而不是运行测试。`--list-tags=json` 将以 JSON 格式输出标签,除非没有标签。
clearCache
CLI: `--clearCache` 删除所有 Vitest 缓存,包括 `fsModuleCache`,而不运行任何测试。这将降低后续测试运行的性能。
tagsFilter
CLI: `--tagsFilter
strictTags
CLI: `--strictTags` Config: `strictTags` 如果测试具有未在配置中定义的标签,Vitest 是否抛出错误。(默认:`true`)
sharedViteServer
CLI: `--sharedViteServer` Config: `sharedViteServer` 让未修改 Vite 配置的 inline 项目复用声明它们的配置的 Vite 服务器。(默认:`true`)
experimental.importDurations.print
CLI: `--experimental.importDurations.print
experimental.importDurations.limit
CLI: `--experimental.importDurations.limit
experimental.importDurations.failOnDanger
CLI: `--experimental.importDurations.failOnDanger` Config: `experimental.importDurations.failOnDanger` 如果任何导入超过危险阈值,使测试运行失败(默认:`false`)。
experimental.importDurations.thresholds.warn
CLI: `--