Vitest Test API 完全指南:test/it 定义、修饰符、参数化与 Fixtures 实战
AI 技能人工智能【免费下载链接】skillsAnthony Fus curated collection of agent skills.项目地址https://gitcode.com/gh_mirrors/skills11/skills点击查看免费下载导读本文以 Vitest 5.x 为核心系统讲解test/it测试定义函数及其全部修饰符skip、only、todo、fails、concurrent、测试选项timeout、retry、tags、参数化测试test.each/test.for、Test Context 与自定义 Fixturesbuilder 模式的完整用法。内容基于本仓库 skills/vitest/references/core-test-api.md 展开并结合 features-context、features-test-tags、features-benchmarking 等配套文档深入解读 v4/v5 的 API 变化帮助读者写出结构清晰、可维护、可并发的 Vitest 测试套件。1. 基本用法test与it别名Vitest 提供与 Jest 兼容的测试定义 API。最基础的形式是从vitest包导入test传入测试名称与回调函数import { expect, test } from vitest test(adds numbers, () { expect(1 1).toBe(2) }) // 别名it import { it } from vitest it(works the same, () { expect(true).toBe(true) })it与test完全等价可混用。若测试文件配置了globals: true参见 core-config则无需导入即可直接使用test/it、expect等全局 API。函数名作为测试名如果将函数直接作为第一个参数传入Vitest 会使用该函数的名称作为测试名见 core-test-api.md 的 Key Pointstest(async () { // 函数名会被用作测试名 })无函数体的测试自动成为 todo当test()只给名字、不传回调时该测试会被标记为todo状态不运行、在报告中显示。2. 异步测试回调与 Promise 都会被自动 awaitVitest 原生支持async函数与返回 Promise 的回调无需手动调用donetest(async test, async () { const result await fetchData() expect(result).toBeDefined() }) // 返回 Promise 也会被自动等待 test(returns promise, () { return fetchData().then(result { expect(result).toBeDefined() }) })两种写法行为一致Vitest 会等待测试函数返回的 Promise 完成后再判定结果。3. 测试选项超时与重试每个测试可以附加执行选项。选项必须作为第二个参数传入——注意 v4 中第三个参数形式的 options 对象已被移除但紧随其后的尾随超时毫秒数仍然允许// Timeout默认5000ms test(slow test, async () { // ... }, 10_000) // 或者使用 options 对象 test(with options, { timeout: 10_000, retry: 2 }, async () { // ... })timeout该测试的超时毫秒数覆盖配置中的testTimeout默认 5000ms。retry失败后的重试次数覆盖配置中的retry。选项支持嵌套在describe中由父级继承在describe上设置的选项如timeout、retry、concurrent、tags会被其内部所有测试继承详见 core-describe。4. 测试修饰符Modifierstest对象上挂载了一系列修饰符方法用于控制测试的运行状态且可以链式组合。4.1 跳过测试test.skip/test.skipIf/test.runIftest.skip(skipped test, () { // 不会运行 }) // 条件跳过 / 条件运行 test.skipIf(process.env.CI)(not in CI, () {}) test.runIf(process.env.CI)(only in CI, () {}) // 通过上下文动态跳过 test(dynamic skip, ({ skip }) { skip(someCondition, reason) // ... })skipIf(condition)条件为真时跳过。runIf(condition)条件为真时才运行与skipIf语义互补。动态跳过从 Test Context 解构skip(condition?, message?)可在测试体内部根据运行时条件决定是否跳过跳过后测试显示为skipped状态并附带原因。4.2 聚焦测试test.onlytest.only(only this runs, () { // 文件中的其他测试会被跳过 })only用于调试时只跑指定测试。在 CI 环境中如果存在test.onlyVitest 会直接抛出错误除非在配置中显式开启// vitest.config.ts defineConfig({ test: { allowOnly: true, // 允许在 CI 中使用 .only }, })建议 CI 保持allowOnly关闭用失败来强制开发者移除误提交的.only。describe.only同理详见 features-filtering。4.3 待办测试test.todotest.todo(implement later) test.todo(with body, () { // 不会运行但会在报告中显示 })todo用于占位记录待实现的测试不执行函数体但在报告中可见相当于“未来的测试清单”。4.4 预期失败test.failstest.fails(expected to fail, () { expect(1).toBe(2) // 断言失败但测试通过 })fails表示“该测试预期失败”如果函数体抛错如断言失败测试反而通过如果函数体意外地没有抛错测试失败。适合标记已知缺陷、待修复的行为。4.5 并发测试test.concurrent// 并行运行 test.concurrent(test 1, async ({ expect }) { // 并发测试请使用 context.expect expect(await fetch1()).toBe(result) }) test.concurrent(test 2, async ({ expect }) { expect(await fetch2()).toBe(result) })注意两点并发测试中必须使用从 context 解构的expect即回调第一个参数中的{ expect }而不是顶层导入的expect。因为并发测试共享文件作用域context 绑定的expect才能保证断言与快照归属到正确的测试。concurrent只对真正 await 异步操作I/O、定时器的测试有加速效果纯同步测试仍会阻塞线程详见 features-concurrency。还可以用describe.concurrent让整个套件内的测试都并行见 core-describe或通过配置sequence.concurrent: true让所有测试默认并发。4.6 退出并发{ concurrent: false }test.sequential在 v5 中被移除。需要让某个测试退出继承来的并发或全局并发配置时使用选项形式test(must run alone, { concurrent: false }, async () {})典型场景describe.concurrent套件中有一个依赖共享状态的测试需要单独串行执行。describe.sequential同样已移除套件用describe(..., { concurrent: false }, ...)代替详见 features-concurrency。5. 参数化测试test.each与test.for参数化测试让同一组断言跑遍多组输入数据避免重复样板代码。5.1test.each数组、对象与模板字面量test.each([ [1, 1, 2], [1, 2, 3], [2, 1, 3], ])(add(%i, %i) %i, (a, b, expected) { expect(a b).toBe(expected) }) // 对象形式 test.each([ { a: 1, b: 1, expected: 2 }, { a: 1, b: 2, expected: 3 }, ])(add($a, $b) $expected, ({ a, b, expected }) { expect(a b).toBe(expected) }) // 模板字面量形式tagged template test.each a | b | expected ${1} | ${1} | ${2} ${1} | ${2} | ${3} (add($a, $b) $expected, ({ a, b, expected }) { expect(a b).toBe(expected) })三种形式分别对应数组解构、对象属性、以及标签模板字面量的行内表格数据按团队偏好选用。5.2test.for推荐优先使用test.for是比.each更推荐的形式——它不会展开spread数组回调的第二个参数直接是 TestContexttest.for([ [1, 1, 2], [1, 2, 3], ])(add(%i, %i) %i, ([a, b, expected], { expect }) { // 第二个参数是 TestContext expect(a b).toBe(expected) })v5 标题格式化变化标题使用pretty-format格式化通过$占位符插值的字符串不再加引号case $id会显示为case a1而不是case a1。插值值的长度受taskTitleValueFormatTruncate限制默认截断长度为 40。6. Test Context测试回调的第一参数每个测试回调的第一个参数都提供一组上下文工具test(with context, ({ expect, skip, task, signal, annotate }) { console.log(task.name) // 测试元数据 skip(someCondition, reason) // 动态跳过 expect(1).toBe(1) // 绑定到本测试的 expect })内置上下文属性一览详见 features-context属性说明task测试元数据name、file 等只读expect绑定到当前测试的expect并发测试的断言与快照必须用它skip(condition?, message?)动态跳过测试signal3.2AbortSignal在超时 / 取消 / bail 时触发 abortannotate(message, type?, attachment?)3.2附加报告器显示的注释onTestFinished(fn)/onTestFailed(fn)测试级清理 / 失败处理器benchv5基准测试 fixture仅在*.bench.ts文件中可用6.1signal在超时/取消时中止请求3.2// signal 在超时/取消/bail 时会被 abort test(aborts on timeout, async ({ signal }) { await fetch(/resource, { signal }) }, 2000)把signal传给fetch或其他支持AbortSignal的 API可以在测试超时或被取消时自动中止底层网络请求避免悬挂资源。6.2annotate给报告附加说明3.2test(annotated, async ({ annotate }) { await annotate(see issue #123, issues) })annotate附加的注释会由报告器展示可用于关联 issue、附上调试信息或说明测试意图。7. 自定义 Fixturesbuilder 模式4.1 推荐当多个测试需要共享初始化逻辑数据库连接、服务器实例等时用test.extend定义自定义 fixture。推荐使用 builder 模式因为类型可以自动推断并通过onCleanup完成清理import { test as base } from vitest const test base .extend(db, async ({}, { onCleanup }) { const db await createDb() onCleanup(() db.close()) // 在测试/作用域结束后运行 return db }) test(query, async ({ db }) { const users await db.query(SELECT * FROM users) expect(users).toBeDefined() })关键设计点.extend(name, options?, fixture)自动推断类型fixture 函数第一个参数可解构此前已定义的 fixtures第二个参数提供onCleanup。onCleanup每个 fixture 只能调用一次需要清理多个资源时应拆分为多个 fixture。Fixtures 是懒加载的只有被测试解构使用时才会初始化务必解构{ db }而不是访问context.db。作用域scope默认test每个测试一次可以用{ scope: file }每文件一次、{ scope: worker }每 worker 进程一次用于昂贵共享资源。只有test作用域的 fixture 能访问内置 contexttask、expect等。fixture 选项{ auto: true }表示每个测试自动运行{ injected: true }表示可通过项目配置provide覆盖。test.override4.1在某个 suite 及其子级中替换 fixture 值取代已废弃的test.scoped不能引入新 fixture 或修改scope/auto。Playwright 兼容的对象语法使用use()回调但类型需手动声明。更完整的 fixture 作用域表格、对象语法、injected fixtures 与test.override示例参见 features-context。8. 重试配置单值或高级对象重试不仅可通过 CLI--retry n全局指定也可以在单个测试上精细化配置test(flaky test, { retry: 3 }, async () { // 失败后最多重试 3 次 }) // 高级重试选项 test(with delay, { retry: { count: 3, delay: 1000, condition: /timeout/i, // 仅在匹配 timeout 类错误时重试 }, }, async () {})高级retry对象包含count最大重试次数delay每次重试前的延迟毫秒数condition可传正则或函数仅当错误满足条件时才重试例如只对timeout类错误重试避免掩盖真正的业务断言失败。CLI 层面还可配合 v5 的--repeats n把每个测试重复运行 n 次来排查偶现flaky问题见 core-cli。9. 测试标签 Tags4.1Tags 用于给跨文件的测试类别打标签从而按语义筛选运行并为某类测试统一应用共享选项timeout、retry。标签必须先在配置中声明然后应用到测试上4.1test(database test, { tags: [db, slow] }, async () {}) // 用标签表达式运行 // vitest --tagsFilter db !flaky声明与筛选的完整规则详见 features-test-tags必须声明未在配置中声明的标签会抛错除非strictTags: false。每个标签可携带timeout、retry、description、priority等选项应用到所有标记了它的测试。继承测试标签继承自父级describe文件顶部 JSDocmodule-tag会应用到文件内所有测试。冲突解决多个标签设置了同一选项时priority数值小者优先先于数组顺序测试自身选项始终胜出。筛选语法vitest --tagsFilter db !flaky、(unit || e2e) !slow、api/*通配符支持/||/!/()分组优先级notandor。多个--tagsFilter参数按 AND 组合。vitest --list-tags列出已声明标签。类型安全可通过declare module vitest { interface TestTags { ... } }增强标签名字面量类型。10. 基准测试 Benchmarksv5 重大变化v5 中bench不再是顶层导入而是作为 test-context fixture 在test()内部使用且文件必须匹配benchmark.include默认如**/*.bench.ts// 文件名需匹配 benchmark.include例如 *.bench.ts test(sort, async ({ bench }) { await bench(Array.sort, () [3, 1, 2].sort()).run() })bench()负责注册.run()负责执行并返回结果可通过断言结果如result.throughput.mean验证性能阈值。运行方式vitest bench只跑基准benchmark: { enabled: true }可与普通测试并存。迁移要点v5 移除了bench.skip/only/todo改用外层test.skip/only/todobenchmark.reporters、--compare、--outputJson等已移除改用--reporterjson --outputFile详见 features-benchmarking。11. Key Points 速查以下是本指南的核心结论也是 v4/v5 兼容性检查清单选项作为第二个参数传入v4 起第三个参数形式的 options 对象已移除尾随的 timeout 数字仍然允许。无函数体的测试自动标记为todo。test.only在 CI 中抛错除非配置allowOnly: true。并发测试与快照请使用 context 的expecttest.concurrent回调第一参数解构。函数名用作测试名第一个参数传函数时取其函数名。test.sequential已在 v5 移除用{ concurrent: false }退出继承或全局并发。test.fails用于预期失败的断言test.todo用于占位待办。参数化优先用test.for不解构数组、第二参数即 TestContexttest.each支持数组/对象/模板字面量三种形式。自定义 fixture 优先 builder 模式.extend类型自动推断、onCleanup清理fixtures 懒加载仅在被解构时初始化。Tags 必须先声明后使用CLI 筛选用--tagsFilter不是--tags。v5 中bench是 test-context fixture不再是顶层导入。延伸阅读本仓库的 Vitest skill 还包含以下配套参考文档可与本文结合使用Test Context 与 Fixtures 完整指南fixture 作用域、test.override、Playwright 兼容对象语法、injected fixturesTest Tags 定义与筛选语法配置声明、module-tag、TestRunner.matchesTags运行时检查测试过滤与运行控制-t、--changed、--related、include/exclude并发与并行执行describe.concurrent、maxConcurrency、pool 配置、sharding基准测试 Benchmarkingbench.compare、baseline 存储回放、自定义 providerVitest 配置详解testTimeout、retry、allowOnly、sequence.concurrent等全局默认值CLI 命令行参考--tagsFilter、--retry、--repeats、vitest bench、vitest list等Describe APIdescribe.skipIf/runIf/only/todo/concurrent、套件选项继承赞分享AI 技能人工智能【免费下载链接】skillsAnthony Fus curated collection of agent skills.项目地址https://gitcode.com/gh_mirrors/skills11/skills点击查看免费下载相关推荐Supabase 仓库实战Vitest Test API 深度解析——从 test/it 定义到参数化与上下文Supabase 仓库实战Vitest Test API 深度解析——从 test/it 定义到参数化与上下文 本文基于 Supabase 仓库中的 Vite后端前端数据库CUPP开源密码画像字典生成器CUPP开源密码画像字典生成器 CUPP 是一款面向渗透测试者的开源密码画像字典生成工具。给出目标的名字、生日和宠物名它直接产出一份可投喂给破解工具的密码词渗透测试网络安全CLIJest Expect API 完全指南内置匹配器、修饰符与自定义扩展实战Jest Expect API 完全指南内置匹配器、修饰符与自定义扩展实战 编写测试时我们几乎总需要校验某个值是否满足特定条件Jest 的 expect测试质量保障代码覆盖率开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

为什么新增一种形状必须等到大版本:blobatar 的 Generation 冻结映射机制

为什么新增一种形状必须等到大版本:blobatar 的 Generation 冻结映射机制

【免费下载链接】blobatar 项目地址: https://gitcode.com/gh_mirrors/bl/blobatar 点击查看 免费下载 blobatar 是一个确定性的几何头像生成库:任何字符串都渲染成同一个稳定头像,但这里藏着一个反直觉的约束——新增一种形状,必…

2026/10/11 15:27:05 阅读更多 →
Fuel 机制详解:SpaceWasm 如何实现可中断、可恢复的 WebAssembly 有界执行

Fuel 机制详解:SpaceWasm 如何实现可中断、可恢复的 WebAssembly 有界执行

【免费下载链接】spacewasm A flight-compliant WebAssembly interpreter. 项目地址: https://gitcode.com/gh_mirrors/sp/spacewasm 点击查看 免费下载 SpaceWasm 是 NASA JPL 开发的航天级 WebAssembly 解释器,其 Fuel 机制(燃料机制&…

2026/10/11 15:27:05 阅读更多 →
pslab-artwork 贴纸与包装盒设计解析:开源硬件品牌周边的制作与定制技巧

pslab-artwork 贴纸与包装盒设计解析:开源硬件品牌周边的制作与定制技巧

【免费下载链接】pslab-artwork Pocket Science Lab Artwork https://pslab.io 项目地址: https://gitcode.com/gh_mirrors/ps/pslab-artwork 点击查看 免费下载 在 pslab-artwork 仓库中,PSLab 把 Pocket Science Lab 这款开源硬件的贴纸、包装盒、Log…

2026/10/11 15:27:05 阅读更多 →

最新新闻

答辩PPT模板高效填充指南:从占位符到完整演示的避坑与调优

答辩PPT模板高效填充指南:从占位符到完整演示的避坑与调优

简介:面向福州大学本科生及研究生毕业答辩场景的论文答辩PPT模板,围绕绪论、研究过程、作品展示、总结四大模块组织内容;其中绪论部分梳理选题背景、国内外研究现状与选题意义,研究过程部分细化理论基础、研究思路、研究方法、关键…

2026/10/11 16:18:34 阅读更多 →
戴尔笔记本Linux风扇控制实战:i8kfanGUI安装配置与调优指南

戴尔笔记本Linux风扇控制实战:i8kfanGUI安装配置与调优指南

简介:I8kfanGUI戴尔风扇控制软件面向戴尔品牌台式机与笔记本用户,提供图形化的硬件温度监控和风扇转速调节方案,可在游戏、视频渲染等高负载场景下自动或手动控制散热,解决因过热导致的性能下降与噪声困扰。资源包共52个文件&…

2026/10/11 16:18:33 阅读更多 →
Android女性生理健康APP源码解析:周期预测与状态记录实现

Android女性生理健康APP源码解析:周期预测与状态记录实现

简介:面向女性健康管理场景的安卓完整源码项目,整合生理周期记录、生理期状态跟踪、基于历史日期预测下一次经期、结合记录给出针对性生理建议等功能,同时支持录入身高体重计算身体质量指数。压缩包共134个文件,整体约2.27MB&…

2026/10/11 16:18:33 阅读更多 →
Java SE 17 OCP认证备考:拆解1Z0-829考试底层逻辑与高频陷阱

Java SE 17 OCP认证备考:拆解1Z0-829考试底层逻辑与高频陷阱

简介:本资源是面向Java开发者与备考人员的OCP Java SE 17认证(Exam 1Z0-829)权威实战练习资料,由资深Java教育专家Jeanne Boyarsky与Scott Selikoff联合编写,专为突破考试难点、强化真题应试能力而设计。全书覆盖Java …

2026/10/11 16:18:33 阅读更多 →
Sherlock工业视觉平台:拖拽式流水线与产线级标定实战

Sherlock工业视觉平台:拖拽式流水线与产线级标定实战

简介:本资源是一份面向自动化检测工程师、机器视觉初学者及工业现场技术人员的Sherlock机器视觉软件入门教学课件,聚焦于零代码图形化开发场景下的核心功能实践与界面操作逻辑。课件系统讲解了Landmark位置标定、Calibration刻度校准、Search区域搜索及C…

2026/10/11 16:18:33 阅读更多 →
航空订票系统UML建模实战:类图、时序图与状态图协同设计

航空订票系统UML建模实战:类图、时序图与状态图协同设计

简介:本资源是一份面向软件工程专业学生与UML初学者的航空订票系统完整UML建模设计文档,聚焦系统需求分析与可视化建模实践,解决课程设计、课程实训及毕业设计中建模规范性与模块完整性难题。文档以Word格式(.docx)单文…

2026/10/11 16:17:33 阅读更多 →

日新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/11 0:00:27 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →