Initial commit

This commit is contained in:
Zhongwei Li
2025-11-29 17:52:09 +08:00
commit 863b553c2a
20 changed files with 4544 additions and 0 deletions

215
commands/create-tests.md Normal file
View File

@@ -0,0 +1,215 @@
---
description: テストケースを作成するTDD
argument-hint: [追加の指示(オプション)]
---
# テストケースの作成(テスト駆動開発)
機能仕様書に基づいて、実装前にテストケースを作成します。
TDDTest-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にしていきます