テスト作成
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.json、jest.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
> 以下のケースを含むテストを作成してください:
- 正常系: 有効なメールアドレスでの登録
- 異常系: 不正なメールアドレス、空文字
- 境界値: 最大文字数ちょうど、最大文字数 + 12. 既存のテストスタイルに合わせる
bash
> 既存のテストファイルのスタイルに合わせて書いてくださいプロジェクトの規約に準拠
Claude Code は既存のテストファイルを参考にして、プロジェクトで使われているテストの書き方(アサーションスタイル、モックの方法、ファイル構造など)に合わせてくれます。
3. カバレッジの目標を設定する
bash
> テストカバレッジが 80% 以上になるようにテストを追加してください
> 現在カバレッジが低い関数を優先的にテストしてくださいテストを書くタイミング
テスト駆動開発(TDD)も可能
Claude Code では、コードを書く前にテストを先に書く「テスト駆動開発」も実践できます。
bash
> まず仕様に基づいてテストを書いてから、
そのテストをパスするようにコードを実装してくださいまとめ
| ステップ | やること | ポイント |
|---|---|---|
| 1. 発見 | テストされていないコードを見つける | カバレッジレポートを活用 |
| 2. 生成 | テストを自動生成する | 正常系・異常系・境界値を指定 |
| 3. 確認 | テストを実行して検証 | すべてパスすることを確認 |
次は、コードの変更をチームに共有する プルリクエスト作成 を学びましょう。