Agently/Skill Store/テストコード生成スキル
💻

テストコード生成スキル

対象コードに対して高品質なテストコードを生成するスキル。

codingby agently-team

テストコード生成スキル


概要

対象コードに対して高品質なテストコードを生成するスキル。

AAA パターンに従い、正常系・異常系・境界値を網羅する。


発動条件

「テスト書いて」「テストコード」「ユニットテスト」「テスト追加」に関する依頼を受けたとき。


テスト設計原則


AAA パターン(必須)

```

// Arrange — 前提条件を準備

// Act — テスト対象を実行

// Assert — 結果を検証

```

各テストケースを必ずこの3段階で構成する。空行で区切ると可読性が上がる。


テストの性質(FIRST原則)

  • **Fast**: 1テスト100ms以内(外部APIはモック)
  • **Isolated**: テスト間の依存なし(共有状態を避ける)
  • **Repeatable**: 何度実行しても同じ結果
  • **Self-validating**: Pass/Fail が自動判定
  • **Timely**: 実装と同時に書く

  • フレームワーク自動検出

    既存の設定ファイルから使用フレームワークを特定する:


    | ファイル | フレームワーク |

    |---------|---------------|

    | `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要素配列


    テストケース生成テンプレート

    対象関数に対して最低限以下を考える:

  • 最も一般的な使い方(ハッピーパス)
  • 引数が空 / null / undefined の場合
  • 引数が想定外の型の場合
  • 戻り値が配列なら: 0件, 1件, 複数件
  • 数値なら: 0, 負数, 小数, 非常に大きい値
  • 文字列なら: 空文字, 1文字, マルチバイト, 特殊文字
  • 非同期なら: 成功, 失敗, タイムアウト

  • テスト命名規則

    テスト名は「何が」「どういう条件で」「どうなるか」を記述する:


    ```typescript

    // Good

    it('空文字を渡すとバリデーションエラーを返す')

    it('既存ユーザーのメールアドレスで登録するとConflictErrorをスローする')

    it('配列が空のとき空配列を返す')


    // Bad

    it('test1')

    it('正常系')

    it('エラー')

    ```


    モック方針


    モック対象(モックすべきもの)

  • 外部API呼び出し
  • データベースアクセス
  • ファイルシステム操作
  • 現在時刻(`Date.now()`)
  • 乱数(`Math.random()`)

  • モック非対象(モックしないもの)

  • テスト対象関数自体
  • 純粋な計算ロジック
  • 単純なデータ変換

  • モック実装例(Jest/Vitest)

    ```typescript

    // 外部モジュールのモック

    vi.mock('./api', () => ({

    fetchUser: vi.fn().mockResolvedValue({ id: 1, name: 'Test' })

    }))


    // 最小限のモック — 必要なプロパティだけ

    const mockUser = { id: 1, name: 'Test' } as User

    ```


    カバレッジ指針

  • 新規コード: 行カバレッジ 80% 以上を目標
  • ビジネスロジック: 分岐カバレッジ 100% を目指す
  • UI コンポーネント: ユーザー操作のシナリオを優先
  • ユーティリティ関数: 全パターン網羅

  • describe / it の構造

    ```typescript

    describe('関数名 or クラス名', () => {

    describe('正常系', () => {

    it('代表的な入力で期待結果を返す', () => { ... })

    })


    describe('異常系', () => {

    it('nullを渡すとエラーをスローする', () => { ... })

    })


    describe('境界値', () => {

    it('空配列を渡すと空配列を返す', () => { ... })

    })

    })

    ```


    出力フォーマット

    1. **テスト方針**(何をテストするか、モック戦略)

    2. **テストコード**(実行可能な完全なコード)

    3. **カバレッジ概要**(どのパスをカバーしているか)

    4. **追加テスト候補**(時間があれば書くべきテスト)