テストコード生成スキル
概要
対象コードに対して高品質なテストコードを生成するスキル。
AAA パターンに従い、正常系・異常系・境界値を網羅する。
発動条件
「テスト書いて」「テストコード」「ユニットテスト」「テスト追加」に関する依頼を受けたとき。
テスト設計原則
AAA パターン(必須)
```
// Arrange — 前提条件を準備
// Act — テスト対象を実行
// Assert — 結果を検証
```
各テストケースを必ずこの3段階で構成する。空行で区切ると可読性が上がる。
テストの性質(FIRST原則)
フレームワーク自動検出
既存の設定ファイルから使用フレームワークを特定する:
| ファイル | フレームワーク |
|---------|---------------|
| `jest.config.*` / `package.json` の jest | Jest |
| `vitest.config.*` | Vitest |
| `pytest.ini` / `pyproject.toml` [tool.pytest] | pytest |
| `*.test.go` | Go testing |
| `*.spec.ts` が既にある場合 | 拡張子パターンに従う |
既存テストがあれば、そのスタイル(import方式、アサーション、命名)に合わせる。
テストケース設計
必須カテゴリ
1. **正常系**: 代表的な入力で期待通りの結果が返ること
2. **異常系**: 不正入力、null/undefined、空文字、型違い
3. **境界値**: 0, 1, -1, 最大値, 最小値, 空配列, 1要素配列
テストケース生成テンプレート
対象関数に対して最低限以下を考える:
テスト命名規則
テスト名は「何が」「どういう条件で」「どうなるか」を記述する:
```typescript
// Good
it('空文字を渡すとバリデーションエラーを返す')
it('既存ユーザーのメールアドレスで登録するとConflictErrorをスローする')
it('配列が空のとき空配列を返す')
// Bad
it('test1')
it('正常系')
it('エラー')
```
モック方針
モック対象(モックすべきもの)
モック非対象(モックしないもの)
モック実装例(Jest/Vitest)
```typescript
// 外部モジュールのモック
vi.mock('./api', () => ({
fetchUser: vi.fn().mockResolvedValue({ id: 1, name: 'Test' })
}))
// 最小限のモック — 必要なプロパティだけ
const mockUser = { id: 1, name: 'Test' } as User
```
カバレッジ指針
describe / it の構造
```typescript
describe('関数名 or クラス名', () => {
describe('正常系', () => {
it('代表的な入力で期待結果を返す', () => { ... })
})
describe('異常系', () => {
it('nullを渡すとエラーをスローする', () => { ... })
})
describe('境界値', () => {
it('空配列を渡すと空配列を返す', () => { ... })
})
})
```
出力フォーマット
1. **テスト方針**(何をテストするか、モック戦略)
2. **テストコード**(実行可能な完全なコード)
3. **カバレッジ概要**(どのパスをカバーしているか)
4. **追加テスト候補**(時間があれば書くべきテスト)