テストの基本
なぜテストを書くのか?テストの種類と基本的な考え方を学ぼう
なぜテストを書くのか?
ソフトウェア開発において、テストは「品質の保証」だけでなく「開発速度の向上」にも直結します。 テストがなければ、コードを変更するたびに手動で全機能を確認する必要があり、 プロジェクトが大きくなるほど確認作業は膨大になります。
テストがない場合
- 変更のたびに手動で全機能を確認
- バグが本番環境で初めて発覚
- リファクタリングが怖くてできない
- 新メンバーがコードを壊す不安
テストがある場合
- 変更後すぐに自動で検証できる
- バグを開発中に発見・修正
- 安心してコードを改善できる
- テストが仕様書の役割を果たす
// テストがあると、こんな小さな変更も安心
// 変更前
function add(a, b) {
return a + b;
}
// 変更後(最適化のつもりが...)
function add(a, b) {
return a - b; // バグ!
}
// テストが即座にキャッチ!
// ✗ add(2, 3) → Expected: 5, Received: -1テストの種類
テストは対象の範囲によって大きく3つに分類されます。 それぞれ異なる目的と特徴を持っています。
1. ユニットテスト(単体テスト)
個々の関数やモジュールを単独でテストします。最も小さな単位のテストで、 実行が高速で数も多くなります。
例: add(2, 3) が 5 を返すか2. 統合テスト(インテグレーションテスト)
複数のモジュールやコンポーネントを組み合わせた動作をテストします。 APIエンドポイントやReactコンポーネントの結合テストが該当します。
例: フォーム送信でAPIが正しく呼ばれるか3. E2Eテスト(エンドツーエンドテスト)
実際のブラウザを使って、ユーザーの操作フロー全体をテストします。 最もユーザーに近い視点でのテストですが、実行に時間がかかります。
例: ログイン → 商品選択 → 購入完了の一連の流れテストピラミッド
テストピラミッドは、各テストの理想的な比率を示す概念です。 下層(ユニットテスト)を多く、上層(E2Eテスト)を少なく書くのが基本方針です。
/\
/ \ E2Eテスト(少数)
/ E2E\ → 遅い、高コスト、高信頼度
/------\
/ \ 統合テスト(中程度)
/ 統合テスト\ → 中速、中コスト
/------------\
/ \ ユニットテスト(大量)
/ ユニットテスト \ → 高速、低コスト
------------------
速度: ユニット > 統合 > E2E
コスト: ユニット < 統合 < E2E
信頼度: ユニット < 統合 < E2Eユニットテストは実行が速くコストが低いため大量に書きます。 E2Eテストは信頼度が高いですが遅くて壊れやすいため、重要なユーザーフローに絞ります。 この比率を守ることで、テストスイート全体のバランスが保たれます。
TDD(テスト駆動開発)
TDD(Test-Driven Development)は「テストを先に書いてから実装する」開発手法です。 Red → Green → Refactor の3ステップを繰り返します。
1. Red(失敗)
まずテストを書く。実装がないので当然テストは失敗する。
2. Green(成功)
テストが通る最小限のコードを書く。きれいさは気にしない。
3. Refactor(改善)
テストが通ることを確認しながら、コードをきれいにする。
// ステップ1: Red - まずテストを書く
test("fizzbuzz: 3の倍数でFizzを返す", () => {
expect(fizzbuzz(3)).toBe("Fizz");
expect(fizzbuzz(6)).toBe("Fizz");
});
// ステップ2: Green - テストが通る最小限の実装
function fizzbuzz(n) {
if (n % 3 === 0) return "Fizz";
return String(n);
}
// ステップ3: Refactor - コードを改善
// → 次のテストケース(5の倍数でBuzz)を追加して繰り返す主要なテスティングツール
JavaScript/TypeScriptのエコシステムには、多くのテスティングツールがあります。 目的に応じて適切なツールを選びましょう。
Jest
Facebookが開発した最も人気のあるテストフレームワーク。 テストランナー、アサーション、モック機能がオールインワンで揃っています。 Reactプロジェクトではデファクトスタンダードです。
Vitest
Viteベースの高速テストフレームワーク。JestのAPIと互換性があり、 ESMのネイティブサポートやTypeScriptの設定不要な対応が特徴です。 新しいプロジェクトでは第一選択肢になりつつあります。
Testing Library
UIコンポーネントをユーザー視点でテストするライブラリ。 「ユーザーが見るもの・操作するもの」に焦点を当てたテストを書けます。 React、Vue、Angularなど様々なフレームワークに対応。
Playwright
Microsoftが開発したE2Eテストフレームワーク。 Chromium、Firefox、WebKitの3つのブラウザエンジンに対応し、 高速で安定したブラウザテストを実現します。
# テストツールのインストール例
# Jest
npm install -D jest @types/jest ts-jest
# Vitest
npm install -D vitest
# Testing Library (React)
npm install -D @testing-library/react @testing-library/jest-dom
# Playwright
npm install -D @playwright/test
npx playwright install確認クイズ
1 / 3テストピラミッドで最も多く書くべきテストはどれ?
まとめ
- テストはバグの早期発見、安全なリファクタリング、仕様の文書化に役立つ
- テストは大きく3種類:ユニットテスト、統合テスト、E2Eテスト
- テストピラミッドに従い、ユニットテストを多く、E2Eテストを少なく書く
- TDDは「テストを先に書く」開発手法で、Red → Green → Refactorを繰り返す
- Jest、Vitest、Testing Library、Playwrightが主要なツール