5.8 KiB
5.8 KiB
description, argument-hint
| description | argument-hint | |
|---|---|---|
| テストケースを作成する(TDD) |
|
テストケースの作成(テスト駆動開発)
機能仕様書に基づいて、実装前にテストケースを作成します。 TDD(Test-Driven Development)のアプローチに従い、実装のガイドとなるテストを書きます。
追加の指示
$ARGUMENTS
前提条件の確認
テスト作成を開始する前に、以下を確認してください:
1. 前のステップの完了確認
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. 重複実行の防止
// タスク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: テスト環境の確認
まず、プロジェクトのテストフレームワークと規約を確認:
# package.jsonやrequirements.txtを確認
# 既存のテストファイルを参照
# テスト実行コマンドを確認
ステップ2: テスト計画
以下のテストタイプを計画します:
ユニットテスト
- 個々の関数/メソッドのテスト
- モジュールの単独動作検証
- 外部依存をモック化
統合テスト
- モジュール間の連携テスト
- データベース操作のテスト
- API統合のテスト
E2Eテスト(必要な場合)
- ユーザーシナリオの完全な流れ
- UI操作のテスト
ステップ3: テストケースの構造
各テストは AAA パターンに従います:
// JavaScript/TypeScript の例
describe('機能名', () => {
test('should [期待される動作]', () => {
// Arrange: テストデータとモックの準備
const input = {...};
const expected = {...};
// Act: テスト対象を実行
const result = functionUnderTest(input);
// Assert: 結果を検証
expect(result).toEqual(expected);
});
});
# 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: モックとスタブ
外部依存を適切にモック化:
// データベースのモック
const mockDb = {
query: jest.fn().mockResolvedValue([...]),
};
// API呼び出しのモック
jest.mock('./api', () => ({
fetchData: jest.fn().mockResolvedValue({...}),
}));
ステップ6: テストデータ
テストデータを適切に準備:
// テストフィクスチャ
const testData = {
validUser: { id: 1, name: 'Test User' },
invalidUser: { id: -1, name: '' },
};
// ファクトリー関数
function createTestUser(overrides = {}) {
return { id: 1, name: 'Test User', ...overrides };
}
テスト作成のベストプラクティス
- 明確なテスト名: 何をテストしているか一目でわかる
- 独立性: 各テストは他のテストに依存しない
- 再現性: 何度実行しても同じ結果
- 高速: ユニットテストは数ミリ秒で完了
- 可読性: テストコードも本番コード同様に丁寧に書く
ファイル配置
プロジェクトの規約に従って配置:
__tests__/[feature-name].test.jstests/test_[feature_name].py[feature-name]_test.gosrc/[feature-name].spec.ts
次のステップ
テストケースを作成したら(この時点でテストは失敗します - Red)、ユーザーに以下を確認してください:
テストケースを確認してください。
承認いただければ、次のステップ(実装タスクの作成)を自動的に開始します。
承認しますか? (yes/no)
ユーザーが承認した場合: SlashCommandツールを使って /create-tasks を実行してください。
注意:
post-test-checkフックが自動的に実行され、テストの品質と網羅性をチェックします- タスクが作成された後、実装フェーズで各タスクを順次実行し、テストをGreenにしていきます