Vitest の基本 API:describe・it・test の使い方

JavaScript開発においてテストは品質を保つために欠かせない要素ですが、初心者の方にとってはどこから始めればよいのか迷いがちですね。
そこで今回は、モダンなテストフレームワークであるVitestの基本的なAPI、describe・it・testの使い方について詳しく解説いたします。これらの3つの関数の違いや使い分けを理解することで、読みやすく保守しやすいテストコードが書けるようになるでしょう。
背景
Vitestとは何か
Vitestは、Viteエコシステムの一部として開発された高速なテストフレームワークです。従来のJestと互換性を持ちながら、ES Modulesネイティブサポートや、Viteの高速なHot Module Replacement(HMR)を活用した開発体験の向上を実現しています。
TypeScriptやJSXの処理も追加設定なしで動作し、モダンなJavaScript開発において理想的なテスト環境を提供してくれますね。
なぜテストが重要なのか
テストを書く理由は主に3つあります。
まず、品質の向上です。コードが期待通りに動作することを自動的に検証でき、バグの発見と修正を早期に行えます。
次に、安心してのリファクタリングが可能になります。既存の機能を壊していないことをテストで確認できるため、コードの改善を恐れることなく実行できるでしょう。
最後に、ドキュメント効果があります。テストコードは使用例として機能し、他の開発者がコードの動作を理解する助けとなりますね。
課題
テスト初心者が直面する問題
テストを書いたことがない開発者の皆さんが最初に直面するのが、「どのAPIを使えばよいのかわからない」という問題です。
VitestやJestにはdescribe、it、testという似たような関数が存在し、どれを使えばよいのか、どのように使い分けるべきなのか判断に迷ってしまいます。
API理解の難しさ
これらの関数は一見すると同じような機能に見えますが、実際にはそれぞれ異なる目的と役割を持っています。
適切な使い分けができないと、テストコードが読みにくくなったり、保守性が低下したりする可能性があるのです。また、チーム開発においては統一されたテスト記述スタイルが重要になってきますね。
解決策
describe関数の基本
describe関数は、関連するテストをグループ化するために使用します。テストスイートを作成し、テストの構造を明確にする役割を果たします。
javascriptdescribe('計算機能のテスト', () => {
  // 関連するテストをここにまとめる
});
この関数は第1引数にグループの説明文、第2引数にテストケースを含む関数を受け取ります。
describeを使うことで、コンソール出力時にテスト結果が階層的に表示され、どの機能のテストが成功・失敗したかが一目でわかるようになりますね。
it関数の基本
it関数は個別のテストケースを定義するために使用します。BDD(Behavior Driven Development)スタイルのテスト記述に適しており、自然言語のような読みやすさを提供します。
javascriptit('2つの数値を正しく足し算する', () => {
  // テストの実装
});
itという名前は「それは〜すべきである(it should...)」という英語の表現から来ており、テストケースの説明文を自然な文章として読めるように設計されています。
第1引数にはテスト対象の振る舞いを説明する文字列、第2引数にはテスト実装を含む関数を渡します。
test関数の基本
test関数はit関数と機能的には全く同じですが、よりシンプルで直接的な表現を好む場合に使用します。
javascripttest('足し算が正しく動作する', () => {
  // テストの実装(itと同じ)
});
testは関数名そのものが意図を表しており、テストであることが明確です。技術的な詳細に集中したい場合や、シンプルな表現を好むチームで採用されることが多いですね。
3つのAPIの使い分け
これら3つのAPIの使い分けは以下の通りです。
| API | 用途 | 特徴 | 
|---|---|---|
| describe | テストグループ化 | 階層構造を作成、複数のテストをまとめる | 
| it | 個別テスト(BDDスタイル) | 自然言語的な表現、振る舞いを重視 | 
| test | 個別テスト(シンプル) | 直接的な表現、技術的な詳細を重視 | 
チーム内で統一したスタイルを選択することが重要です。一般的には、BDDスタイルを採用する場合はdescribe + itの組み合わせ、よりシンプルにしたい場合はdescribe + testの組み合わせが推奨されますね。
具体例
シンプルな関数のテスト例
まずは基本的な計算関数をテストしてみましょう。
javascript// テスト対象の関数
function add(a, b) {
  return a + b;
}
function multiply(a, b) {
  return a * b;
}
この関数に対する最もシンプルなテストは以下のようになります。
javascriptimport { test, expect } from 'vitest';
test('add関数が正しく動作する', () => {
  const result = add(2, 3);
  expect(result).toBe(5);
});
test('multiply関数が正しく動作する', () => {
  const result = multiply(4, 5);
  expect(result).toBe(20);
});
各テストケースは独立しており、他のテストに影響を与えません。テストの説明文は日本語で書くことで、チーム内での理解を深めることができますね。
複数のテストケースをdescribeでグループ化
関連するテストが増えてきたら、describeを使ってグループ化します。
javascriptimport { describe, it, expect } from 'vitest';
describe('計算関数のテスト', () => {
  describe('add関数', () => {
    it('正の数同士の加算ができる', () => {
      expect(add(2, 3)).toBe(5);
    });
    it('負の数を含む加算ができる', () => {
      expect(add(-1, 3)).toBe(2);
    });
    it('0を含む加算ができる', () => {
      expect(add(0, 5)).toBe(5);
    });
  });
  describe('multiply関数', () => {
    it('正の数同士の乗算ができる', () => {
      expect(multiply(3, 4)).toBe(12);
    });
    it('0を含む乗算で0になる', () => {
      expect(multiply(5, 0)).toBe(0);
    });
  });
});
このような階層構造にすることで、テスト結果の出力が整理され、どの機能のどの部分でエラーが発生したかが明確になります。
it・testの実践的な使い方
同じテストでも、チームの方針によって記述スタイルが変わります。以下は同じテストを異なるスタイルで書いた例です。
BDDスタイル(itを使用):
javascriptdescribe('ユーザー認証', () => {
  it('正しいパスワードでログインできる', () => {
    const user = { email: 'test@example.com', password: 'password123' };
    const result = authenticateUser(user);
    expect(result.success).toBe(true);
  });
  it('間違ったパスワードでログインできない', () => {
    const user = { email: 'test@example.com', password: 'wrongpassword' };
    const result = authenticateUser(user);
    expect(result.success).toBe(false);
  });
});
シンプルスタイル(testを使用):
javascriptdescribe('ユーザー認証', () => {
  test('正しいパスワードの認証テスト', () => {
    const user = { email: 'test@example.com', password: 'password123' };
    const result = authenticateUser(user);
    expect(result.success).toBe(true);
  });
  test('間違ったパスワードの認証テスト', () => {
    const user = { email: 'test@example.com', password: 'wrongpassword' };
    const result = authenticateUser(user);
    expect(result.success).toBe(false);
  });
});
どちらのスタイルでも同じ結果が得られますが、チーム内で統一することで可読性と保守性を向上させることができますね。
まとめ
今回は、Vitestの基本APIであるdescribe・it・testの使い方について詳しく解説いたしました。
これらの関数は以下のような役割を持っています:
- describe:関連するテストをグループ化し、階層構造を作る
- it:BDDスタイルで個別のテストケースを記述する
- test:シンプルに個別のテストケースを記述する
適切な使い分けにより、読みやすく保守しやすいテストコードが書けるようになります。最初は小さなテストから始めて、徐々に複雑なテストケースに挑戦していくことをお勧めいたします。
テストは開発プロセスの重要な一部であり、習得することで品質の高いアプリケーション開発が可能になるでしょう。
関連リンク
 article article- Vitest モジュールモック技術の基礎と応用:`vi.mock` / `vi.spyOn` を極める
 article article- Vitest フレーク検知技術の運用:`--retry` / シード固定 / ランダム順序で堅牢化
 article article- Vitest テストアーキテクチャ技術:Unit / Integration / Contract の三層設計ガイド
 article article- Vitest `vi` API 技術チートシート:`mock` / `fn` / `spyOn` / `advanceTimersByTime` 一覧
 article article- Vitest × jsdom / happy-dom 技術セットアップ:最小構成と落とし穴
 article article- 5 分で導入!Vite × Vitest 型付きユニットテスト環境の最短手順
 article article- 【2025 年 10 月 29 日発表】VS Code、Copilot が仕様作成を支援する「Plan モード」とは?
 article article- Zustand × useTransition 概説:並列レンダリング時代に安全な更新を設計する
 article article- Haystack とは?RAG 検索 × 生成 AI を実務投入するための完全入門【2025 年版】
 article article- WordPress × Bedrock/Composer 入門:プラグイン管理をコード化する
 article article- Zod で「never に推論される」問題の原因と対処:`narrowing` と `as const`
 article article- WebSocket 活用事例:金融トレーディング板情報の超低遅延配信アーキテクチャ
 blog blog- iPhone 17シリーズの発表!全モデルiPhone 16から進化したポイントを見やすく整理
 blog blog- Googleストアから訂正案内!Pixel 10ポイント有効期限「1年」表示は誤りだった
 blog blog- 【2025年8月】Googleストア「ストアポイント」は1年表記はミス?2年ルールとの整合性を検証
 blog blog- Googleストアの注文キャンセルはなぜ起きる?Pixel 10購入前に知るべき注意点
 blog blog- Pixcel 10シリーズの発表!全モデル Pixcel 9 から進化したポイントを見やすく整理
 blog blog- フロントエンドエンジニアの成長戦略:コーチングで最速スキルアップする方法
 review review- 今の自分に満足していますか?『持たざる者の逆襲 まだ何者でもない君へ』溝口勇児
 review review- ついに語られた業界の裏側!『フジテレビの正体』堀江貴文が描くテレビ局の本当の姿
 review review- 愛する勇気を持てば人生が変わる!『幸せになる勇気』岸見一郎・古賀史健のアドラー実践編で真の幸福を手に入れる
 review review- 週末を変えれば年収も変わる!『世界の一流は「休日」に何をしているのか』越川慎司の一流週末メソッド
 review review- 新しい自分に会いに行こう!『自分の変え方』村岡大樹の認知科学コーチングで人生リセット
 review review- 科学革命から AI 時代へ!『サピエンス全史 下巻』ユヴァル・ノア・ハラリが予見する人類の未来