テストはストーリーで追う　〜USDMで要件からテストまで串刺しにする〜

この記事を書いた人
製造業系のソフトウェア開発企業で、7年くらいQA部門であれこれを経験
その後、いろんな製造業の品質保証部門であれこれを経験
数年前、ソフトウェア業界にQAとして舞い戻りアジャイル開発などあれこれを経験

*****
 # この記事は一体何か？
**USDM**という考え方・方法をご存知でしょうか？？
[「要求を仕様化する技術・表現する技術」](https://www.amazon.co.jp/%E6%94%B9%E8%A8%82%E7%AC%AC2%E7%89%88-%E5%85%A5%E9%96%80-%E5%AE%9F%E8%B7%B5-%E8%A6%81%E6%B1%82%E3%82%92%E4%BB%95%E6%A7%98%E5%8C%96%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93%E3%83%BB%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93-%E4%BB%95%E6%A7%98%E3%81%8C%E6%9B%B8%E3%81%91%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B/dp/4774142573/ref=sr_1_1?adgrpid=52029352503&gclid=Cj0KCQjwhY-aBhCUARIsALNIC04kNeOYXxCy0B9-YD3PhF3zSK9Fva1EDBxnIPxTyrBk9CfTkCz2RUUaAlkSEALw_wcB&hvadid=618622314841&hvdev=c&hvlocphy=1009412&hvnetw=g&hvqmt=e&hvrand=3629208016339051629&hvtargid=kwd-333061464209&hydadcr=27270_14598092&jp-ad-ap=0&keywords=%E8%A6%81%E6%B1%82%E3%82%92%E4%BB%95%E6%A7%98%E5%8C%96%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93+%E8%A1%A8%E7%8F%BE%E3%81%99%E3%82%8B%E6%8A%80%E8%A1%93&qid=1665393789&qu=eyJxc2MiOiIxLjMwIiwicXNhIjoiMS4wNyIsInFzcCI6IjEuMTcifQ%3D%3D&sr=8-1)(清水吉男,2010)という本にまとめられているのですが、
この本、実は**ウォーターフォール派生開発**の要件開発〜仕様化の方法として書かれているんです。
しかも2010年に出版されたものとあってアジャイル界隈では全くといっていいほど注目されていません。
製造業系で派生開発中心のQAに育てられた者として、この方法論が
アジャイルの現場でも役に立つかもしれないと思い、簡単にご紹介できればと思います。
USDMに注目すべき理由を述べた後に、USDMについて簡単に説明しています。

 - USDMってどういうものか？？が知りたい方は、記事の真ん中以降、[USDMの紹介](#-USDMの紹介) をご覧ください

# 派生開発とアジャイル開発
そもそも派生開発って何？という方も多いかと思いますので、サクッと。
#### 派生開発
 - 基本的にウォーターフォールで、仕様は文書化され、決して伝言ゲームになりません
 - 既にリリースされている特定の製品の後継版を作る

     - 例えば、スマートフォン。私はXPERIA5ⅱ を使っていますが、これは派生開発で作られたものです。既に市場投入済みXPERIAをベースに変更を加えたものになります
         - ゲーミングスマホにしたい（リフレッシュレートの変更 / 放熱性能の変更...etc,）
         - SONYのデジタル一眼レフα1と同じカメラ性能を持たせたい（シャッターは物理ボタンのみ / ISOやシャッター速度をカスタマイズして撮影できる / ポートレートは瞳をフォーカス...etc,）
         - 前任機種からその他諸々が、とんでもなく凄く変更されていそう

#### アジャイル開発
 - 各イベントで話し合いによるステークホルダ間での合意がなされるため、人により理解が異なるリスクがある（伝言ゲームになるリスク）
 - 短期間にデプロイを繰り返し、デプロイ毎にユーザーストーリーに沿って機能を変更していく
     - ユーザーストーリー自体の変更も辞さない
     - （ここではデプロイ＝市場投入と捉えてください）

 #### つまり、少なくとも以下の点では同じであると言えそうです
 - 要件(ユーザーストーリー)と、機能の結びつきを重視する
 - ｢仕様は変更される｣ことを前提としている

# すべての機能はストーリー実現のためにある
 - **すべての機能はストーリーに紐づいている** はずです
ストーリーとは、V字モデルでいうところの**要件**に該当しそうです。 
だとすれば、機能（UI）単位でテストケースを作ってたら [^1] 変更が大変になるの当たり前ですよね？
 そもそもの**要件としてのストーリー自体がカンタンに変わってしまう**のですから。。。
 アジャイルとはいえ、V字マインドからの脱却は難しく、どうしても小さいV字をクルクル回しているような状況が多いのでは？と思います。
とすると、短期間に以下の手戻りを何度もやり直すことになります。
（めっちゃ大変ですね！！）
    ![逆流するV字モデル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1778163/96c85b75-a7f6-32a4-1974-6066fb8b47b1.png)
     - バグが発見されると修正のための戻りが大きくなります（時間・工数とも）。場合によっては要求事項まで戻ります。これは短いイテレーションにおいて致命的です。

***
 - それでも、仕様が原因のバグって多いですよね。特に要件の再確認まで戻るようなバグが多い。
     - バグだけでなく、プロジェクトとして要件定義で既にコケている場合が多い [^2] 
     - ITプロジェクト実態調査 2018を見ると、以下の問題が大きいようです
         - 満足度：要件定義が不十分だった
         - コスト：追加の開発作業が発生した
         - スケジュール：要件定義が長引いた
…ということらしいです。
            - ならもういっそのこと**ストーリーに紐づいたテストを作れば良いですね！！**
            - テストをパスするように開発できれば、ストーリーを達成できるという事です
            - 「こらもう、人力TDDやで！！」

前置きが長くなりました……
つまり、要求を丁寧に仕様化する方法があれば良さそうです。
……ようやく、要求を仕様化するための**USDM**をご紹介します。

# USDMの紹介
 - **要求**とそれを実現するために必要な**機能**を記載します。
     - 「入力→処理→出力」の振る舞いは**動詞**で表現できます。
         - 例）「共有プリンタの管理者が、迅速に対応しやすくするために、印刷前に用紙やトナーの不足を**検知した**ら管理者や担当者に通知を**送信する**」
             - 直接記載されている動詞：検知する。送信する。
             - **<font color="Red">＜ポイント＞</font>読み取るべき動詞**：管理担当者のアドレスを読み出す。
             - <details><summary>それぞれの動詞に対してどうすれば実現できるのかを考えます（仕様化）</summary>
             
                 - **<font color="Red">＜ポイント＞</font>仕様の範囲**：印刷ジョブを受け付けてから印刷開始までに用紙とトナー不足を検知する
                 - 残量ステータスの入手方法
                 - 用紙やトナー不足の判断基準
                 - メッセージの構成
                 - 送信先の場所（ユーザー情報/ユーザーIDなど）
                     - 送信対象者の入力（担当者は週ごとに手動で変更される）
                 - 通知方法（プッシュ通知/メール送信）
</details>

**＜ポイント＞** 要求のwhoとWhatを「上位要求→下位要求→仕様」へと階層的に具体化していきます
**<font color="Red">＜ポイント＞</font>** 要求に合わせて、**その要求が必要な理由**を記載します（why）
 - 先ほど共有プリンタを例に記載したような方法では、ダラダラと長くなって分かりにくい場合もあるかと思います。
## 以下のような方法で仕様を階層化する
   - 「**時系列分割**」「**構成分割**」「**状態分割**」「**共通分割**」の４つの分割基準
（例としてメールソフトで考えてみます）
<details><summary>時系列分割：要求内の動詞（動詞で表せるもの）を時系列に並べる</summary>

     1. メールボックスからひとつ選択できる
     2. 受信時間の新しい順に表示できる
     3. 表示されたメールを押下すると、本文を表示できる
</details>
<details><summary>構成分割：機能の構成で分ける</summary>

     1.検索ができる
        - 差出人で検索したい
             - メールアドレスで検索できる
             - 表示名で検索できる
        - タイトルのみを検索できる（本文を含まない）
             - 文字列の含む/含まないを選択できる
        - 期間を指定して検索できる
             - 未来の日付は選択できない
             - 日付は「To＝端末の時刻設定日」「From＝端末の時刻設定日－1日」とする
      2.ツールバーで表示方法を変更したい
        - 「重要なメール」のみを表示できる
        - 各メールの本文の先頭30文字のみを表示できる
</details>
<details><summary>状態分割：状態遷移をイメージする</summary>

         - 画面表示中のイベント
             - 新着メールを表示できる
                 - 未読メールのタイトルを太字にする
                 - 未読メールのあるメールボックスの文字を太字にする
            - 本文表示中
                 - 未読メールのタイトルを太字にする
                 - 未読メールのあるメールボックスの文字を太字にする
</details>
<details><summary>共通分割：異なる上位要求に含まれる、共通の要求</summary>

          （ちょうど、状態分割に良い例がありました！）
             - 未読メールのタイトルを太字にする
             - 未読メールのあるメールボックスの文字を太字にする
</details>

コツは、**まず時系列分割を使って**要求を具体化していくことです。
 - 時系列分割だとうまく当てはまらないものが出てきたら、「構成/状態/共通」で分割します。
     - 時系列分割では正常系のルートを抜け漏れなく拾いやすい
     - 「構成分割」「状態分割」「共通分割」では異常系を拾いやすい
４つの分割視点を持つことで、仕様の抜け漏れや食い違いが見つけやすくなります。

## 基本フォーマット
つらつらと文章で書いてきましたが、百聞は一見に如かず、ですね。
こういうイメージです。
![要求の階層化.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1778163/e2bde553-26aa-d844-8fed-debb9ffc7cdd.png)

 - このくらいなら「階層化された要求＝仕様」として充分にレビューできそうです。
 - このくらいの階層に分割できたら、開発とQAでレビューします。
※QAをレビューに入れることで要求からテストまで串刺しにして「テスト容易性」を高めることが期待できます。

 - QAは、この仕様に対して実装結果を確認していきます。以下のメリットが期待できます。
     - 正常系は問題なさそう
     - 分割により異常系も拾えそう（図：MAL01-03-03-001）
     - 仕様変更があっても、仕様に対応するテストケースを修正するだけで済む
         - これが一番大きなメリットかと思います

 - 一応、このやり方のデメリットも記載しておきます。
     - とにかくめんどくさい！！
# まとめ
いかがでしたか？
第一線を退いた感のある仕様化の方法ですが、まだまだ現役として頑張ってほしいところですね！
ですが、アジャイル開発プロジェクト全体で、この方法に取り組むのは正直おススメしません。。。
というわけで以下のような時に、ターゲットとなる機能を絞って実践してみてはいかがでしょうか。
 - 機能の要求（ユーザーストーリー）にじっくり向き合ってみたいとき
 - 要求から仕様、さらにテストケースまでしっかりトレースを取りたいとき


[^1]:[ソフトウェアテストをカイゼンする50のアイデア](https://www.amazon.co.jp/%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E3%82%AB%E3%82%A4%E3%82%BC%E3%83%B3%E3%81%99%E3%82%8B50%E3%81%AE%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A2-Gojko-Adzic/dp/4798176060/ref=sr_1_1?keywords=%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%E3%82%AB%E3%82%A4%E3%82%BC%E3%83%B3%E3%81%99%E3%82%8B50%E3%81%AE%E3%82%A2%E3%82%A4%E3%83%87%E3%82%A2&qid=1665395338&qu=eyJxc2MiOiIwLjM4IiwicXNhIjoiMC4wNyIsInFzcCI6IjAuMTkifQ%3D%3D&s=books&sprefix=%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E3%83%86%E3%82%B9%E3%83%88%E3%82%92%2Cstripbooks%2C171&sr=1-1)（P.84 「どうやって」ではなく、「何を」テストするのか説明しよう）
[^2]:[システム開発プロジェクトの5割が失敗](https://xtech.nikkei.com/atcl/nxt/column/18/00177/022100001/)（日経コンピュータ「ITプロジェクト実態調査 2018」 ,2018）