vitest について
Vitest は Vite プロジェクト向けのテストフレームワークです。フロントエンドや TypeScript のテストに使え、Jest 互換 API、ネイティブ ESM、ブラウザモード、並列実行に対応します。
主な機能
- 01Jest 互換のテスト API
- 02ネイティブ ESM 対応
- 03関数とタイマーのモック
- 04ブラウザモードのテスト
- 05ウォッチモードと並列実行
- 06カバレッジとレポート出力
活用シーン
- 01Vite アプリのテスト
- 02TypeScript コードのテスト
- 03実ブラウザでのコンポーネントテスト
- 04Jest テストの移行
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ itechmeat/ llm-code --skill vitestインストール後、Claude Code で/vitestを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api.mdbrowser.mdcli.mdconfig.mdexpect.mdmocking.md詳細
Vitest
Vite を基盤とする次世代テストフレームワークです。
クイックナビゲーション
- テスト API - test、describe、フック
- Expect API - マッチャーとアサーション
- モック - vi.fn、vi.mock、フェイクタイマー
- 設定 - vitest.config.ts のオプション
- CLI - コマンドラインリファレンス
- ブラウザモード - 実ブラウザでのテスト
使用する場面
- Vite ベースのアプリケーションのテスト(設定を共有)
- ネイティブ ESM をサポートする Jest 互換 API が必要な場合
- 実ブラウザでのコンポーネントテスト
- HMR に対応した高速なウォッチモード
- 追加設定なしでの TypeScript テスト
- テストの並列実行
インストール
インストール:npm install -D vitest。Node.js >=22 と、v5 では Vite >=6.4 が必要です。
リリースの主な変更点(5.0.0)
- 要件: Node.js >=22 と Vite >=6.4 が必要です。
@vitest/runnerがインライン化され(パッケージは公開されなくなりました)、expectもインライン化されたため、古いエントリポイントは削除されました。 - モック/タイマーの動作: 各テストの前にモックがデフォルトでクリアされるようになり、フェイクタイマーの有無にかかわらず
Temporalをモックできるようになりました。 - API の置き換え: テスト/スイートの
sequentialオプションは削除され、concurrentに置き換えられました。ブラウザプロバイダーのwebdriverioは削除されました。toHaveTextContentは厳密な動作になり、代替としてtoMatchTextContentが用意されました。関数が時間内に解決しない場合、expect.pollは失敗します。 - 新しいデフォルト/出力:
attachmentsDirのデフォルトが.vitest-attachments/から.vitest/attachments/に変更され、blob/json/junit/html レポーターの出力先のデフォルトが.vitestになりました。また、createReportAPI と.vitestレポートディレクトリの規約が導入されました。 - プロジェクト: インラインプロジェクトはデフォルトでルート設定を拡張し、ネストされたプロジェクトがサポートされます。異なるプロジェクトは 1 つの Vite サーバーを共有し、設定ファイルは親ディレクトリから検索されなくなりました(親ディレクトリの設定は適用されません)。
- ブラウザ: ロケーター文字列はロケーターオブジェクトに置き換えられ、
locators.exactがデフォルトで有効になりました。また、screenshotDirectory設定でtoMatchScreenshotの出力先を制御できます。 - その他: ベンチマークの公開 API が、プラグイン可能なプロバイダー API を備えた形に書き換えられました。
-pは--projectの短縮形です。-tの区切り文字に>が使われます。カバレッジのthresholds.perFileでオブジェクトを指定できるようになり、TypeScript のビルドモードとvitest listの静的解析がサポートされました。
リリースの主な変更点(4.1.0 → 4.1.6)
- 新しい制御フローフック:
aroundEachとaroundAll。 - テストメタデータが拡張され、タグと
metaが追加され、test.extendの型推論も改善されました。 - CLI に
--detect-async-leaks、より多彩な--updateモード、vitest listの静的なテスト収集が追加されました。 - ブラウザモードで Playwright の永続コンテキスト、
userEvent.wheel、強化されたトレース/成果物処理がサポートされました。 - モック/タイマーに、破棄可能な
doMock()、mockThrow/mockThrowOnce、setTickModeが追加されました。 4.1.4では、実験的な ARIA スナップショット、JSON レポーター用のfilterMetaが追加され、assertionが実験的な公開フィールドとして公開されました。4.1.5では、カバレッジのinstrumenterがサポートされ、大きなスナップショットや HTML 出力に関するレポーター/UI の動作が改善されました。4.1.6では、ブラウザのスクリーンショットパス解決が厳密になり、並行テストのスケジューリングにおけるsequence.concurrentの処理が修正されました。
クイックスタート
// sum.js
export function sum(a, b) {
return a + b;
}
// sum.test.js
import { expect, test } from "vitest";
import { sum } from "./sum.js";
test("adds 1 + 2 to equal 3", () => {
expect(sum(1, 2)).toBe(3);
});
// package.json
{
"scripts": {
"test": "vitest",
"test:run": "vitest run",
"coverage": "vitest run --coverage"
}
}
設定
// vitest.config.ts (recommended)
import { defineConfig } from "vitest/config";
export default defineConfig({
test: {
globals: true, // Enable global test APIs
environment: "jsdom", // Browser-like environment
include: ["**/*.{test,spec}.{js,ts,jsx,tsx}"],
coverage: {
provider: "v8",
reporter: ["text", "html"],
},
},
});
または、Vite の設定を拡張します。
// vite.config.ts
/// <reference types="vitest/config" />
import { defineConfig } from "vite";
export default defineConfig({
test: {
// test options
},
});
テストファイルの命名
デフォルトでは、テストファイル名に .test. または .spec. を含める必要があります。
sum.test.jssum.spec.ts__tests__/sum.js
主なコマンド
# Watch mode (default)
vitest
# Single run
vitest run
# With coverage
vitest run --coverage
# Filter by file/test name
vitest sum
vitest -t "should add"
# UI mode
vitest --ui
# Browser tests
vitest --browser.enabled
よく使われるパターン
基本的なテスト
import { describe, it, expect, beforeEach } from "vitest";
describe("Calculator", () => {
let calc: Calculator;
beforeEach(() => {
calc = new Calculator();
});
it("adds numbers", () => {
expect(calc.add(1, 2)).toBe(3);
});
it("throws on invalid input", () => {
expect(() => calc.add("a", 1)).toThrow();
});
});
モック
import { vi, expect, test } from "vitest";
import { fetchUser } from "./api";
vi.mock("./api", () => ({
fetchUser: vi.fn(),
}));
test("uses mocked API", async () => {
vi.mocked(fetchUser).mockResolvedValue({ name: "John" });
const user = await fetchUser(1);
expect(fetchUser).toHaveBeenCalledWith(1);
expect(user.name).toBe("John");
});
スナップショットテスト
import { expect, test } from "vitest";
test("matches snapshot", () => {
const result = generateConfig();
expect(result).toMatchSnapshot();
});
// Inline snapshot (auto-updates)
test("inline snapshot", () => {
expect({ foo: "bar" }).toMatchInlineSnapshot();
});
非同期テスト
import { expect, test } from "vitest";
test("async/await", async () => {
const result = await fetchData();
expect(result).toBeDefined();
});
test("resolves", async () => {
await expect(Promise.resolve("ok")).resolves.toBe("ok");
});
test("rejects", async () => {
await expect(Promise.reject(new Error())).rejects.toThrow();
});
フェイクタイマー
import { vi, expect, test, beforeEach, afterEach } from "vitest";
beforeEach(() => {
vi.useFakeTimers();
});
afterEach(() => {
vi.useRealTimers();
});
test("advances time", () => {
const callback = vi.fn();
setTimeout(callback, 1000);
vi.advanceTimersByTime(1000);
expect(callback).toHaveBeenCalled();
});
Jest からの移行
ほとんどの Jest コードは、最小限の変更で動作します。
- import { jest } from '@jest/globals'
+ import { vi } from 'vitest'
- jest.fn()
+ vi.fn()
- jest.mock('./module')
+ vi.mock('./module')
- jest.useFakeTimers()
+ vi.useFakeTimers()
主な違い:
jestの代わりにviを使用します- グローバルはデフォルトで有効ではありません(
globals: trueを追加してください) vi.mockはホイストされます(ホイストされないモックにはvi.doMockを使用してください)jest.requireActualはありません(vi.importActualを使用してください)
環境の選択
// vitest.config.ts
{
test: {
environment: 'jsdom', // or 'happy-dom', 'node', 'edge-runtime'
}
}
// Per-file (docblock at top)
/** @vitest-environment jsdom */
TypeScript
// tsconfig.json
{
"compilerOptions": {
"types": ["vitest/globals"]
}
}
参考資料
詳細なドキュメントについては、references/ ディレクトリを参照してください。
- テスト API とフック
- すべての expect マッチャー
- 関数とモジュールのモック
- 設定オプション
- CLI コマンド
- ブラウザモードのテスト
リンク
コメント
Markdown 対応