Svelte

SvelteKit でのコンポーネントテストに最適な Vitest の導入と設定方法

ⓘ本ページはプロモーションが含まれています

スポンサードリンク

Vitest を SvelteKit に導入するメリットとインストール手順

SvelteKit でコンポーネント単位のテストを書き始めるなら、まずは Vitest を選択します。
本セクションでは、Vitest が Vite と同じビルド基盤を共有している点や Jest ライクな API が提供されていることが、開発者にとってどのような利点になるかを解説し、実際のインストール手順をご紹介します。

Vitest の高速性とシンプルさ

Vitest は Vite のインクリメンタルビルド機構と ES モジュールのネイティブ実行をそのまま活用するため、テストプロセスの起動が数百ミリ秒程度で完了します(公式ベンチマーク参照)。この高速性に加えて、describe / it / expect といった Jest 互換 API が標準装備されているので、既存のテスト知識をそのまま移行できます。

npm/pnpm を使ったインストール手順

以下のコマンドで開発依存として必要なパッケージを一括インストールし、package.json にテスト用スクリプトを追加すれば設定は完了です。

package.json に次のスクリプトを追記します。

これだけでローカルでも CI 環境でも同一コマンドでテスト実行・カバレッジ取得が可能になります。


SvelteKit プロジェクトへの Vitest 設定

この章では、Vite の設定ファイル (vite.config.ts) とテスト専用の設定ファイル (vitest.config.ts) の役割を明確にしながら、SvelteKit 固有のエイリアスや SSR 環境がテストに与える影響について解説します。

Vite の設定ファイル vite.config.ts

vite.config.tsビルド全体 に関わる設定を記述する場所です。プラグインの登録、エイリアス、環境変数の定義などを行い、Vitest はこの設定を自動的に継承します。

  • ポイントenvironment やテスト固有のオプションはここには記述しません。
  • 注意点:SSR 用に Node の組み込みモジュール (fs, path) をインポートしている場合、テスト実行時にモックが必要になることがあります。

テスト専用設定ファイル vitest.config.ts

vitest.config.tsVitest 固有 のオプションをまとめる場所です。Vite の設定は自動継承されますが、テストランナー固有の挙動(カバレッジやテスト対象ファイルのパターンなど)はここで指定します。

  • ポイントinclude パターンはプロジェクトの言語に合わせて統一します(ここでは TypeScript のみ)。
  • 役割の違いvite.config.ts がビルド全体を司るのに対し、vitest.config.ts はテスト実行時の挙動だけを制御する点をご留意ください。

@testing-library/svelte の基本 API と実装例

Testing Library 系は「ユーザーが実際に画面上で操作する姿」を再現することを第一理念としています。ここでは、Svelte コンポーネントテストで頻出する render, getBy* / queryBy*, fireEvent の使い方を具体例とともに紹介します。

render でコンポーネントを仮想 DOM にマウント

render は対象コンポーネントを JSDOM 上に展開し、テストコードから操作できるユーティリティオブジェクトを返します。第2引数は props の他に slotscontext も渡せます。

getBy / queryBy 系クエリの選び方

テストが失敗したときに原因がすぐ分かるよう、役割 (role) やテキスト を優先して取得します。getBy* は要素が見つからないと例外をスローし、queryBy*null を返すため「存在しないこと」を検証する際に便利です。

クエリ 用途
getByRole('button', { name: /increment/i }) アクセシビリティ属性を基準にボタン取得 expect(getByRole('button')).toBeEnabled();
getByText('Loading…') テキストが必ず存在するケース await waitFor(() => expect(getByText('Done')).toBeInTheDocument());
queryByTestId('error-msg') 要素が 存在しない ことを確認 expect(queryByTestId('error-msg')).not.toBeInTheDocument();

fireEvent でユーザー操作をシミュレート

fireEvent は DOM イベントを手動で発火させ、コンポーネント内部のハンドラが正しく動作するかを検証します。非同期処理が絡む場合は await を付け、必要に応じて waitForfindBy* 系で結果を待ちます。


Svelte 固有機能のテスト実例

Svelte の特徴である props、カスタムイベント、slot、store はユニットテストでも必ず網羅すべき要素です。以下に TypeScript だけを対象とした最小限のコード例と期待するアサーションを書き出します。

props の受け渡し検証

カスタムイベントの捕捉

slot のテスト

store のリアクティブ更新検証


高度なテストパターン・カバレッジ取得・CI への組み込み

実務プロジェクトでは非同期ロジックや CI 環境での自動テストが必須です。ここでは Promise/async の扱い方、waitForfindBy* 系のベストプラクティス、カバレッジ設定と GitHub Actions への組み込み例を示します。

非同期コンポーネントのテスト

waitFor と findBy* の使い分け

  • waitFor は手動で待機条件を記述したいときに使用。
  • findBy* 系は「要素が出現するまで待つ」ケースのデフォルト実装として便利です。

カバレッジレポートと GitHub Actions のサンプル workflow

  • pnpm install のキャッシュにより CI が高速化します。
  • カバレッジしきい値は vitest.config.ts で設定しているため、基準未達の場合はジョブが失敗します。

Vitest と Playwright の役割分担

テスト種別 主な目的 Vitest が得意とする領域
ユニット / コンポーネント ロジック・UI の正確性を高速に検証 モックが容易、JSDOM で瞬時に実行
E2E (Playwright) アプリ全体のフローやブラウザ差異を確認 実ブラウザでのレンダリング、ネットワーク遅延シミュレーション

CI 上では npm run test:all を実行し、コンポーネントテストが失敗した段階で E2E がスキップされるように設定できます(GitHub Actions の continue-on-error オプション参照)。

JSDOM の制限とデバッグ手法

  • CSS カスタムプロパティ は JSDOM では取得できません。スタイルロジックは Playwright に委譲するか、ユニットテストから除外してください。
  • SSR フラグ が期待通りに評価されない場合は vitest.config.tsdefine オプションで明示的にフラグを設定します(例: __SVELTEKIT_SSR__: true)。

デバッグが必要なときは以下のコマンドで Node デバッガを起動できます。

また、テストコード内に console.logdebugger; を埋め込むだけでも実行時にブレークポイントが取得可能です。


まとめ

  • Vitest の選択理由:Vite と同一基盤を利用する高速起動と、Jest ライクな API により SvelteKit 開発フローへの適合性が高い。
  • 設定のシンプルさvite.config.ts がビルド全体、vitest.config.ts がテスト専用オプションを担う構造で、SSR・エイリアス・環境変数をそのまま利用できる。
  • Testing Library で実装感の高いテストrender, getBy* / queryBy*, fireEvent を組み合わせればユーザー視点に近いテストが簡潔に書ける。
  • Svelte 固有機能も網羅:props、カスタムイベント、slot、store のテスト例を参考にすれば、実務で必要となるケースはほぼカバーできる。
  • 高度なパターンと CI 連携:非同期処理のベストプラクティス、カバレッジ取得、GitHub Actions への自動化、Playwright との役割分担まで一通り揃えておけば、品質保証が自動化された開発フローを実現できる。

上記手順とベストプラクティスをプロジェクトに組み込むことで、Svelte コンポーネントのテストは高速かつ信頼性の高いものとなり、開発効率とコード品質の双方が向上します。

スポンサードリンク

-Svelte