ユーザーストーリーとユースケースは、どちらも利用者の目的からシステムへの要求を捉える。 ただし、ユーザーストーリーは価値のある開発単位について会話を始めるために使い、ユースケースは一つの目的を達成するまでにシステムと外部の登場人物がどう相互作用するかを理解するために使う。
ユーザーストーリーが残すもの
ユーザーストーリーは、誰が、何を望み、なぜそれに価値があるのかを短く残す。 短い文だけで要求を完成させる文書ではなく、詳細を関係者との会話や受け入れ条件によって確かめるための札である。 開発順序を決めたり、小さく実装して反応を得たりできる単位へ分割する。
口座の利用者として、営業時間外でも現金を引き出したい。
必要なときに現金を使えるようにするためだ。
この文からは、利用者と価値は分かる。 しかし、暗証番号が間違っていた場合や残高が不足した場合にシステムがどう応答するかまでは決まらない。
ユースケースが残すもの
ユースケースは、特定の登場人物が一つの目的を達成するためにシステムを使う、複数の筋書きをまとめる。 正常に完了する基本の流れに加えて、条件分岐、失敗、目的を断念する場合を記述できる。 事前条件や完了時の状態を含めることもあるが、画面や実装方法を指定することが目的ではない。
目的:現金を引き出す
主な流れ:
1. 利用者がカードを入れ、暗証番号を入力する。
2. システムが本人確認を行う。
3. 利用者が金額を指定する。
4. システムが残高と限度額を確認し、現金を払い出す。
代替の流れ:
2a. 暗証番号が一致しなければ、システムは再入力を求める。
4a. 残高が不足していれば、システムは払い出さず理由を示す。
シナリオと受け入れ条件の位置づけ
ユースケースにおけるシナリオは、開始条件から目的の達成または断念までをたどる一つの経路である。 上の「現金を払い出す」が基本シナリオ、「残高不足で払い出さない」が代替シナリオに当たる。 一つのユースケースは、同じ目的に関係する複数のシナリオを束ねる。
ユーザーストーリーには、実装を受け入れられる条件を示す受け入れ条件を添える。 たとえば「残高を超える金額は引き出せない」は受け入れ条件であり、満たすべき業務規則を表している。 受け入れ条件は条件の集合なので、それ自体が実行可能なテストであるとは限らない。
受け入れテストは、受け入れ条件を具体的な入力と結果に置き換えて確かめる。 一つの受け入れ条件を、境界値や利用者の状態が異なる複数のテストで確かめることもある。
受け入れ条件:残高を超える金額は引き出せない。
受け入れテスト:
前提:口座残高が10,000円である。
操作:利用者が15,000円を引き出そうとする。
結果:現金を払い出さず、残高不足を伝える。
振る舞い駆動開発で「シナリオ」と呼ぶものは、このような具体例を前提、操作、結果で表した受け入れテストであることが多い。 同じシナリオという語でも、ユースケースでは目的達成までの一経路を指し、受け入れテストでは一つの規則を確かめる具体例を指すため、範囲が異なる。
flowchart LR
UC[ユースケース<br/>一つの目的] --> UCS[複数のシナリオ<br/>目的までの経路]
UCS -->|提供単位に分ける| US[ユーザーストーリー<br/>価値のある増分]
US --> AC[受け入れ条件<br/>満たすべき条件]
AC --> AT[受け入れテスト<br/>条件を確かめる具体例]
UCS -. 発見の材料 .-> AC
この関係は、必ず左から順番に文書を作る工程を意味しない。 会話の中で受け入れテストの具体例から未発見の代替シナリオに気づいたり、ユースケースの代替シナリオから新しいユーザーストーリーを切り出したりできる。
詳細さだけの違いではない
同じ「現金を引き出す」という目的を扱っても、両者の関係は一対一とは限らない。 一つのユースケースを、本人確認、引き出し、利用通知など複数のユーザーストーリーに分けて段階的に提供することがある。 反対に、短いユースケース概要と詳しいユーザーストーリーを比べれば、文章量だけでは区別できない。
選択の基準は必要な成果物である。 価値、優先順位、実装可能な増分について会話したいならユーザーストーリーを使う。 目的の開始から終了までの振る舞いと例外を漏れにくくしたいならユースケースを使う。 両方が必要なら、ユースケースで全体の流れを捉え、その流れを提供順にユーザーストーリーへ分割できる。
https://agilealliance.org/glossary/user-stories/
https://www.ivarjacobson.com/publications/use-case-foundation
https://agilealliance.org/glossary/given-when-then/