216 lines
5.8 KiB
Markdown
216 lines
5.8 KiB
Markdown
---
|
||
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にしていきます
|