当前位置: 首页 > ds >正文

Vitest 测试框架完全指南 – 极速单元测试解决方案

简介

Vitest 是一个由 Vite 驱动的单元测试框架,专为现代前端项目设计。它提供了极快的测试执行速度、原生 ESM 支持、TypeScript 开箱即用等特性。

主要特性

  • ⚡️ 极快的测试执行速度
  • 🔧 与 Vite 配置完全兼容
  • 📦 原生 ESM 支持
  • 🎯 TypeScript 开箱即用
  • 🖥️ 美观的 UI 界面
  • 🧪 丰富的测试 API

安装

使用 npm

npm install -D vitest

使用 yarn

yarn add -D vitest

使用 pnpm

pnpm add -D vitest

基本配置

package.json 配置

{"scripts": {"test": "vitest","test:ui": "vitest --ui","test:run": "vitest run","coverage": "vitest run --coverage"}
}

vitest.config.ts 配置

import { defineConfig } from "vitest/config";export default defineConfig({test: {globals: true,environment: "jsdom",setupFiles: ["./src/test/setup.ts"],},
});

编写测试

基本测试结构

import { describe, it, expect } from "vitest";describe("数学运算", () => {it("应该正确相加两个数字", () => {expect(1 + 2).toBe(3);});it("应该正确处理负数", () => {expect(-1 + 1).toBe(0);});
});

测试生命周期钩子

import {describe,it,beforeAll,afterAll,beforeEach,afterEach,
} from "vitest";describe("用户管理", () => {beforeAll(() => {// 在所有测试前执行一次console.log("开始用户管理测试");});beforeEach(() => {// 在每个测试前执行// 设置测试数据});afterEach(() => {// 在每个测试后执行// 清理测试数据});afterAll(() => {// 在所有测试后执行一次console.log("用户管理测试完成");});it("应该创建新用户", () => {// 测试逻辑});
});

异步测试

import { describe, it, expect } from "vitest";describe("异步操作", () => {it("应该处理 Promise", async () => {const result = await Promise.resolve("success");expect(result).toBe("success");});it("应该处理回调函数", (done) => {setTimeout(() => {expect(true).toBe(true);done();}, 100);});
});

测试运行器

命令行选项

# 运行所有测试
vitest# 运行测试并监听文件变化
vitest --watch# 运行特定测试文件
vitest src/components/Button.test.ts# 运行匹配模式的测试
vitest --run -t "用户"# 并行运行测试
vitest --threads

测试分组和过滤

describe.skip("跳过的测试组", () => {it("这个测试不会运行", () => {expect(true).toBe(false);});
});describe.only("只运行这个组", () => {it("这个测试会运行", () => {expect(true).toBe(true);});
});it.skip("跳过单个测试", () => {expect(true).toBe(false);
});it.only("只运行这个测试", () => {expect(true).toBe(true);
});

模拟和存根

函数模拟

import { describe, it, expect, vi } from "vitest";describe("函数模拟", () => {it("应该模拟函数调用", () => {const mockFn = vi.fn();mockFn("hello");expect(mockFn).toHaveBeenCalled();expect(mockFn).toHaveBeenCalledWith("hello");expect(mockFn).toHaveBeenCalledTimes(1);});it("应该模拟函数返回值", () => {const mockFn = vi.fn().mockReturnValue("mocked");expect(mockFn()).toBe("mocked");});
});

模块模拟

import { describe, it, expect, vi } from "vitest";// 模拟整个模块
vi.mock("./utils", () => ({add: vi.fn().mockReturnValue(10),multiply: vi.fn().mockReturnValue(20),
}));// 模拟部分模块
vi.mock("./api", async () => {const actual = await vi.importActual("./api");return {...actual,fetchUser: vi.fn().mockResolvedValue({ id: 1, name: "Test" }),};
});

覆盖率

安装覆盖率工具

npm install -D @vitest/coverage-v8

配置覆盖率

// vitest.config.ts
export default defineConfig({test: {coverage: {provider: "v8",reporter: ["text", "json", "html"],exclude: ["node_modules/", "src/test/", "**/*.d.ts"],},},
});

运行覆盖率测试

# 生成覆盖率报告
vitest run --coverage# 检查覆盖率阈值
vitest run --coverage --coverage.threshold.lines=80

UI 界面

安装 UI 界面

npm install -D @vitest/ui

启动 UI 界面

vitest --ui

UI 界面提供:

  • 实时测试结果
  • 测试覆盖率可视化
  • 测试执行时间分析
  • 交互式调试

配置选项

常用配置

import { defineConfig } from "vitest/config";export default defineConfig({test: {// 全局变量globals: true,// 测试环境environment: "jsdom",// 设置文件setupFiles: ["./src/test/setup.ts"],// 包含的文件include: ["src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}"],// 排除的文件exclude: ["node_modules", "dist", ".idea", ".git", ".cache"],// 超时时间testTimeout: 5000,// 钩子超时时间hookTimeout: 10000,// 并行运行threads: true,// 最大并发数maxConcurrency: 5,},
});

最佳实践

测试文件命名

  • 使用 .test.ts 或 .spec.ts 后缀
  • 保持与源文件相同的目录结构

测试数据管理

// 使用工厂函数创建测试数据
const createUser = (overrides = {}) => ({id: 1,name: "Test User",email: "test@example.com",...overrides,
});it("应该显示用户信息", () => {const user = createUser({ name: "John" });// 测试逻辑
});

清理和重置

import { describe, it, beforeEach, afterEach, vi } from "vitest";describe("API 测试", () => {beforeEach(() => {// 设置测试环境});afterEach(() => {// 清理模拟vi.clearAllMocks();vi.resetAllMocks();});
});

性能优化

  • 使用 vi.isolateModules() 隔离模块
  • 合理使用 beforeAll 和 afterAll
  • 避免在测试中创建不必要的对象

 Vitest 测试框架完全指南 - 极速单元测试解决方案 - 高质量源码分享平台-免费下载各类网站源码与模板及前沿技术分享

http://www.xdnf.cn/news/18568.html

相关文章:

  • C++ 常见的排序算法详解
  • AI 产业落地:从 “实验室神话” 到 “车间烟火气” 的跨越
  • Spring Cloud Netflix学习笔记06-Zuul
  • 机器学习中的集成算法与 k 均值聚类算法概述
  • uniapp跨域怎么解决
  • Go 并发编程-channel
  • 详解开源关键信息提取方案PP-ChatOCRv4的设计与实现
  • AI客服系统架构与实现:大模型、知识库与多轮对话的最佳实践
  • Android为ijkplayer设置音频发音类型usage
  • 【C2000常见问题】JTAG仿真器类型和JTAG Debug定位方法
  • 机器学习核心算法笔记:集成学习与聚类算法
  • springboot人事管理系统源码和论文
  • c#语言的学习【02,函数重载】
  • GPT5 / 深度研究功能 无法触发
  • 网络流量分析——基础知识(二)(Tcpdump 基础知识)
  • HTTP/2 性能提升的核心原因
  • 笔记本电脑Windows+Ubuntu 双系统,Ubuntu无法挂载Windows的硬盘 报错问题解决
  • nginx-重定向-正则表达式-路由匹配优先级
  • 最新react,vue 解决无法使用js触发点击,解决方案
  • SamOutVXP: 轻量级高效语言模型
  • 通信工程学习:什么是Camera Calibration相机标定
  • WaitForSingleObject函数详解
  • python测试开发django-1.开始hello world!
  • 机器学习--聚类算法、集成算法
  • 集中式负载均衡 vs. 分布式负载均衡
  • 银河麒麟V10防火墙下访问NFS共享:端口开放全攻略
  • WindowsAPI|每天了解几个winAPI接口之网络配置相关文档Iphlpapi.h详细分析七
  • uniapp实现分页,效果如图
  • C++——C++重点知识点复习2(详细复习模板,继承)
  • 大模型部署