--- description: テストケースを作成する(TDD) argument-hint: [追加の指示(オプション)] --- # テストケースの作成(テスト駆動開発) 機能仕様書に基づいて、実装前にテストケースを作成します。 TDD(Test-Driven Development)のアプローチに従い、実装のガイドとなるテストを書きます。 ## 追加の指示 $ARGUMENTS ## 前提条件の確認 テスト作成を開始する前に、以下を確認してください: ### 1. 前のステップの完了確認 ```javascript const fs = require('fs'); const tasksFile = '.tasks.json'; if (!fs.existsSync(tasksFile)) { console.log('❌ タスクファイルが見つかりません'); console.log('\n先に要件整理を実行してください:'); console.log(' /new-feature [機能の説明]'); process.exit(1); } const data = JSON.parse(fs.readFileSync(tasksFile, 'utf-8')); // タスクID 2 (ドキュメント作成) が完了しているか確認 const docTask = data.tasks.find(t => t.id === 2); if (!docTask || docTask.status !== 'completed') { console.log('❌ ドキュメント作成が完了していません'); console.log('\n先にドキュメントを作成してください:'); console.log(' /create-docs'); console.log('\nまたは、ワークフローを再開:'); console.log(' /resume'); process.exit(1); } ``` ### 2. 重複実行の防止 ```javascript // タスクID 3 (テスト作成) の状態を確認 const testTask = data.tasks.find(t => t.id === 3); if (testTask && testTask.status === 'completed') { console.log('⚠️ テストは既に作成されています'); console.log('\nテストファイルを確認してください。'); console.log('次のステップに進む場合:'); console.log(' /resume'); process.exit(0); } ``` ## テスト作成の指針 前提条件を満たしていることを確認したら、`test-writer` エージェントを使って、包括的なテストスイートを作成してください。 ### ステップ1: テスト環境の確認 まず、プロジェクトのテストフレームワークと規約を確認: ```bash # package.jsonやrequirements.txtを確認 # 既存のテストファイルを参照 # テスト実行コマンドを確認 ``` ### ステップ2: テスト計画 以下のテストタイプを計画します: #### ユニットテスト - 個々の関数/メソッドのテスト - モジュールの単独動作検証 - 外部依存をモック化 #### 統合テスト - モジュール間の連携テスト - データベース操作のテスト - API統合のテスト #### E2Eテスト(必要な場合) - ユーザーシナリオの完全な流れ - UI操作のテスト ### ステップ3: テストケースの構造 各テストは AAA パターンに従います: ```javascript // JavaScript/TypeScript の例 describe('機能名', () => { test('should [期待される動作]', () => { // Arrange: テストデータとモックの準備 const input = {...}; const expected = {...}; // Act: テスト対象を実行 const result = functionUnderTest(input); // Assert: 結果を検証 expect(result).toEqual(expected); }); }); ``` ```python # Python の例 def test_機能名_should_期待される動作(): # Arrange input_data = {...} expected = {...} # Act result = function_under_test(input_data) # Assert assert result == expected ``` ### ステップ4: テストカバレッジ 以下の観点を網羅してください: #### 正常系 - 典型的な入力パターン - 期待される出力の検証 #### 異常系 - 不正な入力 - エラーハンドリング - 例外処理 #### 境界値 - 最小値/最大値 - 空の値(null, undefined, empty string, etc.) - ゼロ除算など #### エッジケース - 特殊文字 - 大量データ - 同時実行 ### ステップ5: モックとスタブ 外部依存を適切にモック化: ```javascript // データベースのモック const mockDb = { query: jest.fn().mockResolvedValue([...]), }; // API呼び出しのモック jest.mock('./api', () => ({ fetchData: jest.fn().mockResolvedValue({...}), })); ``` ### ステップ6: テストデータ テストデータを適切に準備: ```javascript // テストフィクスチャ const testData = { validUser: { id: 1, name: 'Test User' }, invalidUser: { id: -1, name: '' }, }; // ファクトリー関数 function createTestUser(overrides = {}) { return { id: 1, name: 'Test User', ...overrides }; } ``` ## テスト作成のベストプラクティス 1. **明確なテスト名**: 何をテストしているか一目でわかる 2. **独立性**: 各テストは他のテストに依存しない 3. **再現性**: 何度実行しても同じ結果 4. **高速**: ユニットテストは数ミリ秒で完了 5. **可読性**: テストコードも本番コード同様に丁寧に書く ## ファイル配置 プロジェクトの規約に従って配置: - `__tests__/[feature-name].test.js` - `tests/test_[feature_name].py` - `[feature-name]_test.go` - `src/[feature-name].spec.ts` ## 次のステップ テストケースを作成したら(この時点でテストは失敗します - Red)、ユーザーに以下を確認してください: ``` テストケースを確認してください。 承認いただければ、次のステップ(実装タスクの作成)を自動的に開始します。 承認しますか? (yes/no) ``` **ユーザーが承認した場合**: SlashCommandツールを使って `/create-tasks` を実行してください。 **注意**: - `post-test-check` フックが自動的に実行され、テストの品質と網羅性をチェックします - タスクが作成された後、実装フェーズで各タスクを順次実行し、テストをGreenにしていきます