その他
    ホームエンジニアAI開発で試した、AI(ChatGPT Codex)によるテスト作成の進め方
    AIによる自動テスト作成

    開発で試した、AI(ChatGPT Codex)によるテスト作成の進め方

    この記事で書くこと

    機能開発をしたときに、テスト仕様書をもとにCodexでRSpecを作る方法を試しました。
    結論としては、以下の3点で効果がありました。

    • 仕様書と同じ順序でテストが並ぶため、レビューしやすい
    • 開発者の観点に偏りにくく、抜け漏れを見つけやすい
    • テストのたたき台作成が速く、実装に集中しやすい

    背景

    実務では、テスト仕様書を作る人とRSpecを書く人が分かれることがあります。
    このとき、RSpecが「実装者の頭の中の想定」中心になり、仕様書との対応が見えづらくなることがありました。

    もちろんそれ自体が悪いわけではありませんが、レビュー時に次が難しくなります。

    • 仕様書のどの項目をカバーしているか
    • 抜けている観点がないか
    • テストの実行順が仕様書と対応しているか

    そこで今回は、仕様書をそのまま入力にして、CodexにRSpecの骨組みを作らせる方式を試しました。

    準備: 仕様書はMarkdownで置く

    通常はExcelで管理することが多いですが、AIに渡す前提ならMarkdownのほうが扱いやすいです。
    今回はリポジトリ内に、影響範囲とテスト項目をまとめたMarkdownを作成しました。

    # 影響範囲
    ## admin管理画面
    ### 基本設定
    #### コメントグループ設定
    ##### 一覧
    - レビュー要約の有無をテーブル表示
    ##### 新規・編集
    - レビュー要約の有無を設定可能
    〜省略〜
    ## バッチ
    ### コメント要約依頼・実行: Job名A.関数名
    - ProductCode毎に要約を行う
    〜省略〜
    
    # テスト項目
    ## バッチ
    #### コメント要約依頼・実行: Job名A.関数
    - ロック制御
      - 前提条件: lockディレクトリが存在
        - 確認事項
          - [ ] TTL内はジョブがスキップされる
          - [ ] TTL超過の場合はロック削除後に再実行される
    - 対象なし
      - 前提条件: Tableが存在しない
        - 確認事項
          - [ ] 何も処理されず終了する
    - 要約対象処理(batch正常系)
      - 前提条件: TableA/TableB/TableC/TableDが存在している
        - 確認事項
          - [ ] updated_comments?がtrueの場合のみ要約が実行される
          - [ ] payloadに公開状態(publish)のコメントのみ含まれる
          - [ ] summary.statusがpending→processingに更新される
          - [ ] 処理完了後にTable名が削除される

    実際にCodexへ渡した指示

    以下のように、シンプルに依頼しました。

    • この仕様書の「影響範囲」と「テスト項目」を元にRSpecを作成してください
    • テストケースの順序は仕様書と同じにしてください
    • 仕様書との対応が分かるよう、見出しコメントは日本語で付けてください

    生成されたRSpecのイメージ

    describe '#perform' do
      # ロック制御: lock取得失敗 > ロック(TTL内)
      it 'lockのTTL内なら処理をスキップする' do
        # 省略
      end
    
      # ロック制御: lock取得失敗 > ロック(TTL超過)
      it 'lockのTTL超過ならロックを削除して続行する' do
        # 省略
      end
    
      # 対象なし: SummaryTargetが存在しない
      it 'SummaryTargetが無ければ何もせず終了する' do
        # 省略
      end
    
      # 要約対象処理: バッチ正常系
      it 'payloadを生成してLambdaを呼び、Targetを削除する' do
        # 省略
      end
    end

    使ってみて感じた注意点

    • 生成物はそのまま採用せず、内容をしっかり確認し、必要に応じて修正する
    • 1回で完璧を狙わず、仕様書→生成→差分修正の2〜3往復で仕上げる

    まとめ

    大量機能を一気に作る場面では運用設計が必要ですが、機能単位であればかなり実用的でした。
    特に、仕様書とテストコードの対応が明確になるため、レビュー効率と安心感が上がります。

    「仕様書はあるが、RSpec化の時間が重い」という場面では、まず小さい機能から試す価値があると思います。

    榎本 力也(エノモト リキヤ)
    デジタルマーケティング・オファリング学部 SaaS グループ
    AdvantageSearch、VoiceLog、PushTracker、BranchPop、コンパス・キューエー等、SaaSグループ全ての開発を取りまとめています。
    最近はAI関係の開発などを中心に行っています。