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:シンプルに個別のテストケースを記述する
適切な使い分けにより、読みやすく保守しやすいテストコードが書けるようになります。最初は小さなテストから始めて、徐々に複雑なテストケースに挑戦していくことをお勧めいたします。
テストは開発プロセスの重要な一部であり、習得することで品質の高いアプリケーション開発が可能になるでしょう。
関連リンク
著書
article2026年1月3日TypeScriptとVitestでテストを運用する 導入から高速化まで活用手順
article2025年12月28日VitestとTypeScriptで型安全テストをセットアップする手順
articleVitest 大規模 CI の最適化技術:テストシャーディング × キャッシュヒット最大化
articleVitest テストデータ設計技術:Factory / Builder / Fixture の責務分離と再利用
articleVitest モック技術比較:MSW / `vi.mock` / 手動スタブ — API テストの最適解はどれ?
articleVitest フレーク検知技術の運用:`--retry` / シード固定 / ランダム順序で堅牢化
articleClaude Code と Codex を並列で動かしたときの動き: 同じファイルでも書き換えは消えない
articleClaude Code の Stop フックで、終わる前にテストを走らせる手順: 失敗が残ったまま終わらない
articleClaude Code と Codex のスキルの置き場所の動き: .claude/skills と .agents/skills は互いに読まない
articleClaude Code の /security-review で変更を点検する手順: origin/HEAD がないと止まる
articleClaude Code と Codex のスキルを入れる前に中身を確かめる手順: security-audit で見る5か所
articleCloudflare の security-audit スキルを Claude Code と Codex で比較: 3つとも見つけ、進め方に差
