Skip to content

テスト作成

Claude Code を使って、テストされていないコードを見つけ出し、テストを自動生成する方法を学びます。

なぜテストが必要なのか

テストは、コードが正しく動作することを 自動的に確認する仕組み です。

テストがないと...
  コードを変更 → 動くかどうか不安 → 手動で確認 → 見落としてバグ発生

テストがあると...
  コードを変更 → テスト実行 → 問題があれば即座に検出 → 安心してリリース

Claude Code はテスト作成が得意

Claude Code はコードの構造を理解し、適切なテストケースを自動生成できます。テストフレームワークの設定やアサーションの書き方も、プロジェクトに合わせて調整してくれます。

テスト作成の基本フロー

Step 1: テストされていないコードを見つける

bash
# テストカバレッジを確認
> このプロジェクトのテストカバレッジを確認してください。
  テストされていないファイルや関数を教えてください。

# 特定のディレクトリのテスト状況を確認
> src/utils/ のテストカバレッジはどうなっていますか?

Claude はプロジェクト構造を分析し、以下を報告してくれます。

確認項目内容
テストファイルの有無対応するテストファイルが存在するか
カバレッジの概要テストでカバーされている機能の割合
未テストの関数テストが書かれていない関数の一覧
テストの品質既存テストがエッジケースをカバーしているか

Step 2: テストを自動生成する

bash
# 特定のファイルのテストを生成
> src/utils/validators.ts のユニットテストを作成してください

# テストフレームワークを指定する場合
> Jest を使って src/services/userService.ts のテストを書いてください

# エッジケースも含めるよう指示
> 正常系、異常系、境界値のテストケースも含めてください

テストフレームワークの自動検出

Claude Code はプロジェクトの設定ファイル(package.jsonjest.config.js など)を読み取り、使用しているテストフレームワークを自動的に検出します。特に指定しなくても、適切なフレームワークでテストを生成してくれます。

Step 3: テストを実行して確認する

bash
# テストの実行を依頼
> 作成したテストを実行して、すべてパスするか確認してください

# 失敗したテストの修正
> テストが 2 件失敗しています。修正してください。

実践例

例 1: ユーティリティ関数のテスト

bash
> src/utils/formatDate.ts のテストを作成してください

Claude が生成するテストの例:

typescript
import { describe, it, expect } from 'vitest';
import { formatDate, parseDate, isValidDate } from './formatDate';

describe('formatDate', () => {
  it('日付を YYYY-MM-DD 形式にフォーマットする', () => {
    const date = new Date('2025-03-15');
    expect(formatDate(date)).toBe('2025-03-15');
  });

  it('null が渡された場合は空文字を返す', () => {
    expect(formatDate(null)).toBe('');
  });

  it('不正な日付が渡された場合はエラーをスローする', () => {
    expect(() => formatDate(new Date('invalid'))).toThrow();
  });
});

describe('parseDate', () => {
  it('YYYY-MM-DD 形式の文字列を Date に変換する', () => {
    const result = parseDate('2025-03-15');
    expect(result.getFullYear()).toBe(2025);
    expect(result.getMonth()).toBe(2); // 0-indexed
    expect(result.getDate()).toBe(15);
  });
});

例 2: API サービスのテスト

bash
> src/services/userService.ts のテストを作成してください。
  外部 API の呼び出しはモックしてください。
typescript
import { describe, it, expect, vi } from 'vitest';
import { UserService } from './userService';

// API クライアントのモック
vi.mock('./apiClient', () => ({
  get: vi.fn(),
  post: vi.fn(),
}));

describe('UserService', () => {
  it('ユーザー一覧を取得する', async () => {
    const mockUsers = [
      { id: 1, name: 'Taro' },
      { id: 2, name: 'Hanako' },
    ];
    vi.mocked(apiClient.get).mockResolvedValue({ data: mockUsers });

    const users = await UserService.getAll();
    expect(users).toHaveLength(2);
    expect(users[0].name).toBe('Taro');
  });

  it('ユーザーが見つからない場合は空配列を返す', async () => {
    vi.mocked(apiClient.get).mockResolvedValue({ data: [] });

    const users = await UserService.getAll();
    expect(users).toHaveLength(0);
  });
});

例 3: コンポーネントのテスト

bash
> src/components/LoginForm.tsx のテストを作成してください。
  ユーザー操作(入力、クリック)のテストも含めてください。
テストの種類

Claude Code は以下の種類のテストを作成できます。

  • ユニットテスト - 個々の関数やクラスの動作を確認
  • 結合テスト - 複数のモジュールが連携して動作するか確認
  • コンポーネントテスト - UI コンポーネントの表示や操作を確認
  • スナップショットテスト - UI の出力が予期せず変更されていないか確認

テスト作成のコツ

1. 正常系・異常系・境界値を指定する

bash
> 以下のケースを含むテストを作成してください:
  - 正常系: 有効なメールアドレスでの登録
  - 異常系: 不正なメールアドレス、空文字
  - 境界値: 最大文字数ちょうど、最大文字数 + 1

2. 既存のテストスタイルに合わせる

bash
> 既存のテストファイルのスタイルに合わせて書いてください

プロジェクトの規約に準拠

Claude Code は既存のテストファイルを参考にして、プロジェクトで使われているテストの書き方(アサーションスタイル、モックの方法、ファイル構造など)に合わせてくれます。

3. カバレッジの目標を設定する

bash
> テストカバレッジが 80% 以上になるようにテストを追加してください

> 現在カバレッジが低い関数を優先的にテストしてください

テストを書くタイミング

テスト駆動開発(TDD)も可能

Claude Code では、コードを書く前にテストを先に書く「テスト駆動開発」も実践できます。

bash
> まず仕様に基づいてテストを書いてから、
  そのテストをパスするようにコードを実装してください

まとめ

ステップやることポイント
1. 発見テストされていないコードを見つけるカバレッジレポートを活用
2. 生成テストを自動生成する正常系・異常系・境界値を指定
3. 確認テストを実行して検証すべてパスすることを確認

次は、コードの変更をチームに共有する プルリクエスト作成 を学びましょう。

Anthropic公式ドキュメントを基に作成