T-CREATOR

Vitest のインストール&初期設定完全ガイド

Vitest のインストール&初期設定完全ガイド

フロントエンド開発において、テストは品質の高いアプリケーションを構築する上で欠かせない要素です。最近注目を集めているVitestは、高速で使いやすいテストフレームワークとして多くの開発者に選ばれています。

本記事では、Vitestの魅力から実際のインストール手順、設定方法まで、初心者の方でも安心して導入できるよう、わかりやすく解説いたします。「テストってよくわからない」という方も、この記事を読めばVitestを活用したテスト環境を構築できるようになるでしょう。

背景

従来のテストツールの課題

これまでJavaScriptのテスト環境といえば、JestやMochaといったツールが主流でした。しかし、これらのツールにはいくつかの課題がありました。

まず、設定の複雑さが挙げられます。特にJestは多機能である反面、初期設定が煩雑で、TypeScriptやESModulesとの組み合わせでは追加の設定が必要でした。また、実行速度の問題もあり、大きなプロジェクトでは数分間テストの実行を待つこともありました。

さらに、モジュール解決の問題もありました。Node.jsベースの従来ツールは、ブラウザ環境での動作と微妙な違いがあり、時として予期しない結果を招くことがありました。

Vitestが登場した経緯

これらの課題を解決するため、Viteエコシステムの一環としてVitestが開発されました。Viteの高速なビルド機能とESModulesネイティブサポートを活用し、より現代的なテスト体験を提供することを目指したのです。

Anthony Fu氏を中心とした開発チームは、「開発者体験を最優先に」という理念のもと、シンプルで高速なテストフレームワークの実現に取り組みました。その結果、2021年12月にVitestがリリースされ、瞬く間に人気を博しました。

Viteとの関係性

VitestはViteの設定をそのまま活用できるため、すでにViteを使用しているプロジェクトでは追加設定がほとんど不要です。これにより、開発環境とテスト環境の設定が統一され、メンテナンスの負担が大幅に軽減されます。

また、ViteのHMR(Hot Module Replacement)機能を活用したWatch Modeにより、ファイル変更時の再実行が非常に高速になっています。

課題

既存テストツールの設定の複雑さ

従来のテストツールでは、以下のような設定が必要でした:

  • Babel や TypeScript のトランスパイル設定
  • モジュール解決のためのカスタム設定
  • ESModules と CommonJS の混在対応
  • ブラウザ環境のシミュレーション設定

これらの設定は初心者には難しく、プロジェクトセットアップの大きな障壁となっていました。

実行速度の問題

大規模なプロジェクトでは、テストの実行に数分かかることも珍しくありませんでした。これにより、開発者のフィードバックループが遅くなり、開発効率の低下を招いていたのです。

特に、ファイル変更時の再実行が遅いことは、TDD(Test Driven Development)を実践する上で大きな問題でした。

TypeScriptサポートの不完全さ

従来ツールでのTypeScriptサポートは、追加の設定や変換処理が必要で、型チェックとテスト実行のタイミングがずれることもありました。また、最新のTypeScript機能への対応が遅れがちでした。

解決策

Vitestの特徴と利点

Vitestは前述の課題を以下の方法で解決しています。

ゼロ設定での開始
Viteプロジェクトであれば、追加設定なしでテストを開始できます。従来必要だった複雑な設定ファイルは不要です。

高速な実行速度
ESModulesネイティブサポートとViteの高速ビルド機能により、テスト実行が劇的に高速化されました。大きなプロジェクトでも数秒での実行が可能です。

優れた開発体験
Watch Modeでは、ファイル変更時に関連するテストのみを再実行し、リアルタイムでフィードバックを提供します。

簡単な設定での高速テスト実行

Vitestの設定は非常にシンプルです。多くの場合、package.jsonにスクリプトを追加するだけで開始できます。

json{
  "scripts": {
    "test": "vitest"
  }
}

この一行で、基本的なテスト環境が整います。

Viteとの統合によるメリット

Viteとの統合により、以下のメリットが得られます:

  • 統一された設定: 開発環境とテスト環境で同じ設定を使用
  • プラグインの共有: Viteプラグインがテスト環境でも動作
  • 型安全性: TypeScriptの型チェックがシームレスに統合

具体例

環境の準備

Vitestを導入する前に、開発環境を確認しましょう。

必要な環境

項目バージョン備考
Node.js14.18+LTS版の使用を推奨
npm/yarn最新版パッケージマネージャー
Vite2.0+既存プロジェクトの場合

Node.jsのバージョンを確認するには、ターミナルで以下のコマンドを実行します。

bashnode --version

バージョンが14.18未満の場合は、Node.js公式サイトから最新のLTS版をダウンロードしてインストールしてください。

Vitestのインストール手順

新規プロジェクトの場合

新規でViteプロジェクトを作成する場合は、以下のコマンドを実行します。

bashyarn create vite my-project --template vanilla-ts
cd my-project
yarn install

次に、Vitestをインストールします。

bashyarn add -D vitest

既存のViteプロジェクトの場合

すでにViteを使用しているプロジェクトでは、Vitestのインストールのみで完了です。

bashyarn add -D vitest

Viteを使用していないプロジェクトの場合

Viteを使用していないプロジェクトでも、Vitestは利用可能です。ただし、追加の設定が必要になる場合があります。

bashyarn add -D vitest

基本設定ファイルの作成

package.jsonの設定

package.jsonのscriptsセクションにテスト実行コマンドを追加します。

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

各コマンドの説明は以下の通りです:

  • test: Watch Modeでテストを実行(ファイル変更を監視)
  • test:run: 一度だけテスト実行(CI環境で使用)
  • test:ui: ブラウザでテスト結果を確認できるUI付きで実行

基本的な設定ファイル

より詳細な設定が必要な場合は、vite.config.tsまたはvitest.config.tsを作成します。

typescriptimport { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    // グローバル設定を有効化
    globals: true,
    // テスト環境をjsdomに設定
    environment: 'jsdom',
    // セットアップファイルを指定
    setupFiles: './src/test-setup.ts'
  }
})

この設定により、以下の機能が有効になります:

  • describeitexpectがimportなしで使用可能
  • DOM操作のテストが可能
  • テスト実行前の共通設定を読み込み

セットアップファイルの作成

テスト実行前の共通設定を行うため、セットアップファイルを作成します。

typescript// src/test-setup.ts
import { expect, afterEach } from 'vitest'
import { cleanup } from '@testing-library/react'
import * as matchers from '@testing-library/jest-dom/matchers'

// カスタムマッチャーを追加
expect.extend(matchers)

// 各テスト後にクリーンアップ
afterEach(() => {
  cleanup()
})

初回テストの実行

簡単なテストファイルの作成

まず、基本的なテストファイルを作成してみましょう。

typescript// src/utils.ts
export function add(a: number, b: number): number {
  return a + b
}

export function multiply(a: number, b: number): number {
  return a * b
}

このユーティリティ関数に対するテストを作成します。

typescript// src/utils.test.ts
import { describe, it, expect } from 'vitest'
import { add, multiply } from './utils'

describe('数値計算のテスト', () => {
  it('足し算が正しく動作する', () => {
    expect(add(2, 3)).toBe(5)
    expect(add(-1, 1)).toBe(0)
    expect(add(0, 0)).toBe(0)
  })

  it('掛け算が正しく動作する', () => {
    expect(multiply(3, 4)).toBe(12)
    expect(multiply(-2, 3)).toBe(-6)
    expect(multiply(0, 5)).toBe(0)
  })
})

テストの実行

作成したテストを実行してみましょう。

bashyarn test

正常に動作すると、以下のような出力が表示されます:

scsssrc/utils.test.ts (2)
  ✓ 数値計算のテスト (2)
    ✓ 足し算が正しく動作する
    ✓ 掛け算が正しく動作する

Test Files  1 passed (1)
Tests  2 passed (2)
Start at 10:30:15
Duration  234ms

Watch Modeの確認

Watch Modeが動作しているか確認するため、テストファイルを編集してみましょう。

typescript// src/utils.test.ts に新しいテストを追加
it('除算が正しく動作する', () => {
  expect(divide(10, 2)).toBe(5)
  expect(divide(7, 2)).toBe(3.5)
})

ファイルを保存すると、自動的にテストが再実行されることが確認できます。

設定オプションの詳細説明

基本的な設定オプション

Vitestの主要な設定オプションを詳しく見ていきましょう。

typescript// vitest.config.ts
import { defineConfig } from 'vitest/config'

export default defineConfig({
  test: {
    // テストファイルのパターン
    include: ['**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'],
    
    // 除外するファイルのパターン
    exclude: ['node_modules', 'dist', '.idea', '.git', '.cache'],
    
    // タイムアウト設定(ミリ秒)
    testTimeout: 10000,
    
    // レポーターの設定
    reporter: ['verbose', 'html'],
    
    // カバレッジの設定
    coverage: {
      provider: 'v8',
      reporter: ['text', 'html'],
      exclude: ['**/*.config.*', '**/node_modules/**']
    }
  }
})

環境固有の設定

異なるテスト環境での設定例です。

typescript// ブラウザ環境のテスト用
export default defineConfig({
  test: {
    environment: 'jsdom',
    globals: true,
    setupFiles: ['./src/test-setup.ts']
  }
})
typescript// Node.js環境のテスト用
export default defineConfig({
  test: {
    environment: 'node',
    globals: true
  }
})

モック設定

外部ライブラリのモックを設定する方法です。

typescript// vitest.config.ts
export default defineConfig({
  test: {
    globals: true,
    environment: 'jsdom',
    deps: {
      // 外部ライブラリのモック設定
      inline: ['@testing-library/jest-dom']
    }
  }
})

パフォーマンス最適化の設定

大きなプロジェクトでのパフォーマンス最適化設定です。

typescriptexport default defineConfig({
  test: {
    // 並列実行の設定
    pool: 'threads',
    poolOptions: {
      threads: {
        maxThreads: 4,
        minThreads: 1
      }
    },
    
    // ファイルの並列実行
    fileParallelism: false,
    
    // インラインスナップショットの制限
    maxConcurrency: 5
  }
})

まとめ

Vitestは現代的なJavaScriptテストフレームワークとして、従来ツールの課題を見事に解決してくれます。特に高速な実行速度とシンプルな設定は、開発効率を大幅に向上させてくれるでしょう。

この記事で紹介した手順に従えば、初心者の方でも安心してVitestを導入できます。まずは小さなテストから始めて、徐々にテストカバレッジを向上させていってください。

導入完了後の次のステップ

  1. モックとスタブの活用: 外部APIや複雑な依存関係のテスト方法を学習
  2. UI コンポーネントのテスト: ReactやVueコンポーネントのテスト手法を習得
  3. E2Eテストとの組み合わせ: PlaywrightやCypressとの連携方法を検討
  4. CI/CDパイプラインへの統合: GitHub ActionsやJenkinsでの自動テスト実行を設定

テストは一度書けば終わりではありません。継続的にメンテナンスし、プロダクトの成長とともに拡充していくことが重要です。Vitestの優れた開発体験を活用して、品質の高いアプリケーションを構築していきましょう。

関連リンク