<CodeLearn/>
テスト レッスン1

テストの基本

なぜテストを書くのか?テストの種類と基本的な考え方を学ぼう

なぜテストを書くのか?

ソフトウェア開発において、テストは「品質の保証」だけでなく「開発速度の向上」にも直結します。 テストがなければ、コードを変更するたびに手動で全機能を確認する必要があり、 プロジェクトが大きくなるほど確認作業は膨大になります。

テストがない場合

  • 変更のたびに手動で全機能を確認
  • バグが本番環境で初めて発覚
  • リファクタリングが怖くてできない
  • 新メンバーがコードを壊す不安

テストがある場合

  • 変更後すぐに自動で検証できる
  • バグを開発中に発見・修正
  • 安心してコードを改善できる
  • テストが仕様書の役割を果たす
// テストがあると、こんな小さな変更も安心
// 変更前
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が主要なツール