Vitest 单元测试入门指南

Vitest 是基于 Vite 的现代测试框架,Jest 兼容 API、原生 ESM、watch模式反馈。本文讲解 Vitest 安装配置、编写与运行测试、用例过滤、源码内嵌测试、Mock、钩子、覆盖率与 UI 界面。

最佳实践
测试检测与质量验证插画

本文依据官方文档整理,未执行运行验证或性能基准。代码片段展示局部用法,业务函数、数据和环境需按项目补齐;版本与配置以所引文档为准。

直接回答:Vitest 是构建在 Vite 之上的轻量高速测试框架:原生 ESM 支持、提供watch反馈和大量Jest风格API,但语义并非完全相同——前端(Vite 项目)与 Node 后端都适用,是当前 JavaScript/TypeScript 新项目的首选测试方案之一。

为什么是 Vitest

Vitest复用Vite转换管线,支持按变更重跑。反馈耗时取决于套件与环境;Jest迁移仍需核对mock、快照、计时器、覆盖率及隔离差异,不能只替换导入就假设等价。

安装配置

mkdir vitest-demo && cd vitest-demo
npm init -y
npm install --save-dev vitest

package.json:

{
  "scripts": {
    "test": "vitest run",
    "test:watch": "vitest"
  }
}

Vite 项目零配置复用 vite.config.ts;非 Vite 项目建一个 vitest.config.ts 即可。

第一个测试

sum.test.js:

import { describe, it, expect } from "vitest";
import { sum } from "./sum";

describe("sum", () => {
  it("1 + 2 等于 3", () => {
    expect(sum(1, 2)).toBe(3);
  });
});

一个常见区别:默认不注入全局 API,需要显式 import(也可以在配置里开 globals: true 完全对齐 Jest 习惯)。

运行与过滤

vitest run              # 单次(CI)
vitest                  # watch 模式
vitest run sum          # 按文件名过滤
vitest run -t "等于 3"  # 按用例名过滤

it.only / describe.only 临时聚焦,it.skip 跳过,it.todo 登记待写用例。

源码内嵌测试

Vitest 支持把测试写在源码文件里(Rust 风格):

// sum.js
export function sum(a, b) {
  return a + b;
}

if (import.meta.vitest) {
  const { it, expect } = import.meta.vitest;
  it("sum", () => {
    expect(sum(1, 2)).toBe(3);
  });
}

需在Vitest配置设置 test.includeSource(如 ['src/**/*.js'])才能收集;生产Vite构建还需 define: { 'import.meta.vitest': 'undefined' } 并启用树摇,才能消除相关分支,不能假设自动剔除。适合小型工具库;业务项目仍建议独立测试目录。

Mock

API 与 Jest 风格相近,具体mock提升与模块行为仍应查迁移说明:

import { vi } from "vitest";

vi.mock("./api");                        // 模块 Mock
const fn = vi.fn().mockReturnValue(42);  // Mock 函数
const spy = vi.spyOn(service, "fetch");  // 间谍
vi.useFakeTimers();                      // 假定时器
vi.setSystemTime(new Date("2026-01-01")); // 冻结时间

钩子

import { beforeAll, beforeEach, afterEach, afterAll, vi } from 'vitest';

beforeAll(() => { /* 套件前 */ });
beforeEach(() => { /* 每条前 */ });
afterEach(() => {
  vi.restoreAllMocks();
  vi.useRealTimers();
});
afterAll(() => { /* 套件后 */ });

覆盖率

npm install --save-dev @vitest/coverage-v8
vitest run --coverage

输出语句/分支/函数/行四维报告,HTML 报告可逐行查看未覆盖代码。

Vitest UI

npm install --save-dev @vitest/ui
vitest --ui

浏览器里查看用例树、实时重跑、检查控制台输出与模块依赖图——大套件导航体验极佳。

常见问题(FAQ)

Q:Vitest 能完全替代 Jest 吗?
A:可迁移许多场景,但功能兼容与运行速度需评估。少数依赖 Jest 特有生态(如某些 snapshot 序列化插件)的项目需要评估;Vite项目可优先评估,也需结合既有工具链选择。

Q:非 Vite 项目用 Vitest 划算吗?
A:划算。Vitest 独立可用,自带转换管线,Node 后端项目用它跑 TS 测试同样顺滑。

Q:测试里 import 的 CSS/图片怎么处理?
A:资源处理受环境(Node、jsdom、浏览器模式)及配置影响;按具体报错和所用Vitest主版本核对配置,不要照搬其他版本的server.deps或Jest transformer。

官方参考

资料核对日期:2026-09-29。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台