より良いコードとより良いテストを生み出す PRD の書き方

Yunhao Jiao
より良いコードとより良いテストを生み出す PRD の書き方 カバー

プロダクト要件定義書(PRD)は興味深い形で復権を果たしています。長年にわたり、PRD は主にウォーターフォール開発と結びついていました——アジャイルが置き換えるはずだった、重厚な事前ドキュメントの象徴として。ところが AI コーディングツールが登場したことで、PRD は再び不可欠な存在となりました。

その理由はこうです。AI コーディングエージェントは、与えられたコンテキストの質以上のものは生み出せません。曖昧なプロンプトからは曖昧なコードしか生まれません。具体的な要件定義書からは、具体的で検証可能なコードが生まれます。そして TestSprite のようなアジェンティックテストプラットフォームを利用するチームにとって、PRD はテスト生成の文字どおりの源泉となります。

このガイドでは、AI ネイティブな開発において効果的な PRD とはどのようなものかを解説します——AI が生成するコードの品質を高めると同時に、自動テストのカバレッジも向上させる PRD のあり方について説明します。

AI コーディングツール時代に PRD がより重要になる理由

従来の開発では、開発者が要件を読み込み、メンタルモデルを構築し、コーディング中に無数の細かな判断を下します。要件に生じたギャップは、開発者の経験と判断によって埋められます。

AI コーディングエージェントがギャップを埋める方法は異なります。それは統計的な蓋然性によるものです。要件が曖昧な場合、AI はトレーニングパターンに基づいて最も可能性の高い解釈を選びます。その解釈が意図と一致することもありますが、多くの場合は一致せず——しかもその齟齬は、本番環境で問題が発生するまで気づきにくいのです。

AI が生成するコードの品質は、入力の明確さに正比例します。これは憶測ではありません——詳細な PRD を用いた AI コーディングセッションは、曖昧なプロンプトを用いたセッションと比べて、より正確な実装が得られ、意図のズレが少ないことが、多くのチームから一貫して報告されています。

特に TestSprite においては、PRD がテスト生成の信頼できる唯一の情報源となります。詳細な PRD からは、正しい動作を検証するテストケースが生成されます。曖昧な PRD からは、AI が推測した動作を検証するテストケースしか生成されません。実際のバグを検出できるのは、前者だけです。

AI ネイティブな PRD の効果的な構成

1. 機能サマリー(2〜3 文)

何を構築するのか、そしてその理由を明確かつ簡潔に記述します。これは、以降のすべての判断を支えるコンテキストとなります。

悪い例:チェックアウトフローを構築する。

良い例:ログイン済みユーザーがカートを確認し、配送先・請求先情報を入力し、割引コードを適用して、Stripe 経由で購入を完了できる、マルチステップのチェックアウトフローを構築する。このフローはモバイルで動作し、決済失敗時にも適切に対処する必要がある。

2. 受け入れ基準付きのユーザーストーリー

各ユーザーストーリーには、「完了」を定義する具体的かつテスト可能な条件である受け入れ基準を明示します。

各受け入れ基準がテストケースになります。曖昧な受け入れ基準からは曖昧なテストしか生まれません。具体的な基準からは、具体的で意味のあるテストが生まれます。

3. エッジケースとエラー状態

ほとんどの PRD——そして AI が生成するコードの多く——が不十分になりやすいのがここです。特定の動作を引き起こすケースを明示的に列挙してください。

  • 入力が空の場合はどうなるか?
  • 境界値の入力(最大長、最小値)の場合はどうなるか?
  • 必要なサービスが利用不可の場合はどうなるか?
  • 並行操作が発生した場合はどうなるか(最後の 1 点を 2 人のユーザーが同時に購入しようとした場合など)?
  • 不正アクセスが試みられた場合はどうなるか?

チェックアウトフローの例:

  • チェックアウト中にブラウザを閉じた場合:カートは保持され、セッションを再開できる
  • 決済が失敗した場合:ユーザーに具体的なエラーが表示され、カートはクリアされず、再試行できる
  • チェックアウト中に商品が在庫切れになった場合:決済処理前にユーザーへ通知される
  • 決済送信中にネットワークが切断された場合:二重請求は発生せず、ユーザーに適切なエラーが表示される

4. 不変条件(交渉不可のルール)

不変条件とは、実装の詳細にかかわらず常に真でなければならないルールです。これらを明示してください。

  • 未認証のユーザーが他のユーザーの注文履歴を閲覧できてはならない
  • 決済処理は冪等でなければならない(再試行時に二重請求が発生しないこと)
  • カートの合計金額は常に、商品価格の合計から割引額を引いた値と一致しなければならない
  • 在庫切れの商品は購入できてはならない

不変条件は、テスト生成における PRD の中で最も重要なコンテンツです。TestSprite は不変条件の違反をクリティカルな障害として扱い、それぞれを検証するための専用テストを生成します。

5. スコープ外

構築しないものを明示してください。これにより、AIコーディングエージェントが意図しない機能を実装することを防ぎ、まだ存在しないフローに対するテスト生成を防ぎます。

今回のリリースのスコープ外:ゲストチェックアウト、分割払い、国際配送、サブスクリプション購入。

6. 依存関係とインテグレーションポイント

この機能が関わる外部システムと、インテグレーションの契約内容を列挙してください:

  • 決済処理用Stripe API(カード情報収集にStripe.jsを使用)
  • 注文確認メール用SendGrid
  • 在庫確認用の内部インベントリサービス
  • セッション検証用Auth0

これにより、AIコーディングエージェントに必要なインテグレーションのコンテキストが提供され、TestSpriteが各インテグレーションポイントのAPIコントラクトテストを生成するための情報が得られます。

AIネイティブチームのためのPRDテンプレート

得られる成果

この構成で作成されたPRDをCursorセッションの前に用意することで、3つのメリットが生まれます:

  1. AIが生成するコードの品質向上。コーディングエージェントは、空白をもっともらしいパターンで埋めるのではなく、具体的な要件に基づいて実装できます。
  2. 要件に基づくテストカバレッジ。TestSpriteは受け入れ基準、エッジケース、不変条件から直接テストを生成します。すべての受け入れ基準がテストになり、すべての不変条件が検証されます。
  3. 共有コンテキスト。何か問題が発生したとき、PRDがあるべき動作の信頼できる情報源となります。意図した動作が明示的に文書化されているため、デバッグと修正が迅速になります。

必要な投資は、各コーディングセッション前の20〜30分の構造化された思考です。その見返りとして、AIコーディングエージェントからの出力が測定可能なほど向上し、テスト作成の追加工数なしに意味のあるテストカバレッジが得られます。

TestSpriteでPRDを自動テストに変換する →