Files
gh-allex-znews-cc-workflow-…/commands/create-tests.md
2025-11-29 17:52:09 +08:00

216 lines
5.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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にしていきます