Initial commit
This commit is contained in:
215
commands/create-tests.md
Normal file
215
commands/create-tests.md
Normal file
@@ -0,0 +1,215 @@
|
||||
---
|
||||
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にしていきます
|
||||
Reference in New Issue
Block a user