Mindmapを利用するシナリオ洗い出し。


こんにちは。
先の投稿にはシュード・コードでTCを設計する方法をしめしましたがそれはTDD(Test Driven Development)を狙って作ったものでした。

今度は開発者の観点ではなくて、上流工程のテスト設計をする方法の１つを紹介します。

上流工程なので、一応画面をみながらテスト設計を考えてみましょう。

![c0081530_4f5ace2a9dde6.png](https://qiita-image-store.s3.amazonaws.com/0/55902/9299416a-3c0c-720e-a29b-42d09223aeb0.png "c0081530_4f5ace2a9dde6.png")


画面より考えられるテスト視点は二つです。
1. 環境と状況（Environment or Context)
2. Action


<table>  <tr><th>環境と状況（Environment or Context)</th>
    <th>Action</th>
  </tr>
  <tr>
    <td>上の画面はモバイル・アプリなので、環境また状況は次のように想定しました。 <br>1. ネットワーク切れ、また反応が弱いネットワーク <br>2. 言語環境：日本語、中国語、英語</td>
    <td>対象はログイン画面です。<br>ログイン画面で洗い出されるActionは次のようです。 <br>1. メール・アドレスを入力する（また空欄に残る） <br>2. メール・アドレス欄でメール形式ではない文字を入力する。 <br>3. 未登録メール・アドレスを入力する。 <br>4. 暗証番号を入力する（また空欄に残る） <br>5. 間違い暗証番号を入力する <br>6. 「パスワードをお忘れ方」をクリックする <br>7. 「会員登録」をクリックする。</td>
  </tr>
</table>



今までの整理をマインド・マップでしてみました
ここで注意すべくのは

```
Actionは「Yes」,「No」で分けられるように書く
```

です。こう整理するのが文章を明確にします。


![mindmap1.png](https://qiita-image-store.s3.amazonaws.com/0/55902/4b557781-82c8-da2a-e38f-af21157904ac.png "mindmap1.png")


これから ActionItem間の従属関係を考えてみましょう。

一応

* 「ログイン」ボタンをクリック
* 「パスワードをお忘れ方」をクリック
* 「会員登録」をクリック

の間は従属関係が見えません。２、３番目は下位で小枝がないのでそれ自体がチェック項目になります。

1番目の「ログイン。。。」の下位項目たちを見ましょう。

「メール・アドレス欄で入力」と「メール・アドレス欄でメール形式ではない文字を入力する」を比べると

```
「メール・アドレス欄で入力」：Yes
```
の場合「メール・アドレス欄でメール形式ではない文字を入力する」が成立します。なので、「メール・アドレス欄でメール形式ではない文字を入力する」は「メール・アドレス欄に入力」で従属されてます。

![mindmap2.png](https://qiita-image-store.s3.amazonaws.com/0/55902/1d995235-78d4-6151-143e-345f52ffa1b3.png "mindmap2.png")


「未登録メール・アドレスを入力する」と「メール・アドレス欄でメール形式ではない文字を入力する」の関係も従属関係です。メールアドレスの形式のみ登録されたのかを確認できるからです。

全部整理すればこうなります。

![mindmap3.png](https://qiita-image-store.s3.amazonaws.com/0/55902/bea4457f-1821-dbfa-b51a-14da21c0c800.png "mindmap3.png")


マップの枝より「Yes」を含めているルーツを選んでみましょう。

<table>
  <tr>
    <th></th>
    <th>Path+して「ログイン」ボタンをクリック</th>
  </tr>
  <tr>
    <td>1</td>
    <td>メールアドレス欄で入力→（Yes）→メール・アドレス欄でメール形式ではない文字を入力する→（Yes）</td>
  </tr>
  <tr>
    <td>2</td>
    <td>メールアドレス欄で入力→（Yes）→メール・アドレス欄でメール形式ではない文字を入力する→（No）<br>→未登録メール・アドレスを入力する→（Yes）</td>
  </tr>
  <tr>
    <td>3</td>
    <td>メールアドレス欄で入力→（Yes）→メール・アドレス欄でメール形式ではない文字を入力する→（No）<br>→未登録メール・アドレスを入力する→（No）→暗証番号を入力する→（No）</td>
  </tr>
  <tr>
    <td>4</td>
    <td>メールアドレス欄で入力→（Yes）→メール・アドレス欄でメール形式ではない文字を入力する→（No）<br>→未登録メール・アドレスを入力する→（No）→暗証番号を入力する→（Yes）→間違い暗証番号を入力する<br>→（Yes）</td>
  </tr>
  <tr>
    <td>5</td>
    <td>メールアドレス欄で入力→（Yes）→メール・アドレス欄でメール形式ではない文字を入力する→（No）<br>→未登録メール・アドレスを入力する→（No）→暗証番号を入力する→（Yes）→間違い暗証番号を入力する<br>→（No）</td>
  </tr>
</table>

各ケースを「ログイン１」〜「ログイン５」で名付けましょう。

Action、環境、状況はこれでまとめられます。

<table>
  <tr>
    <td rowspan="3">Action</td>
    <td>ログイン１〜ログイン５</td>
  </tr>
  <tr>
    <td>「パスワードをお忘れ方。。」をクリックする</td>
  </tr>
  <tr>
    <td>「会員登録」をクリックする。</td>
  </tr>
  <tr>
    <td rowspan="3">環境</td>
    <td>言語：日本語</td>
  </tr>
  <tr>
    <td>言語：中国語</td>
  </tr>
  <tr>
    <td>言語：英語</td>
  </tr>
  <tr>
    <td rowspan="3">状況</td>
    <td>ネットワーク：切られる</td>
  </tr>
  <tr>
    <td>ネットワーク：弱い</td>
  </tr>
  <tr>
    <td>ネットワーク：正常</td>
  </tr>
</table>

最後のテストケースはこの３つの組み合わせで洗い出したす。

組み合わせは[PICTMaster](http://sourceforge.jp/projects/pictmaster/releases/)というツールを使いました。

![PICTMaster1.png](https://qiita-image-store.s3.amazonaws.com/0/55902/8bc08cee-1d4b-5ab1-2ad9-1d6181e99dbd.png "PICTMaster1.png")


ここでイシューが一つあります。
組み合わせのオプションの中て <b>Number of Combined Parameter</b>をいくらにすればいいかなんです。それは<b>環境</b>と<b>状況</b>の軽さに従います。もし言語があんまりミッション・クリッチカルじゃない場合はこの値を１ですればいいです。でも、もし言語がクリッチカルな意味がある場合はこの値を２以上にして、網羅性を高める必要はあります。
![PICTMasterSetting.png](https://qiita-image-store.s3.amazonaws.com/0/55902/9339e3c0-3afa-3d19-654c-7eef39923ba2.png "PICTMasterSetting.png")


これはparameter=1の結果です。
![PICTMaster2.png](https://qiita-image-store.s3.amazonaws.com/0/55902/62dbe984-5538-2a1f-12ec-b9442f511b57.png "PICTMaster2.png")

これはparameter=2の結果です。
![PICTMaster3.png](https://qiita-image-store.s3.amazonaws.com/0/55902/d6386949-1cac-da06-358d-60436679cb9b.png "PICTMaster3.png")


僕はParameter=2の方が合理的に見えるのでそれでケースを整理します。
結果を環境をプライマリー・キーで、状況をセカンダリー・キーでソーティングして整理しました。

<table>
  <tr>
    <th></th>
    <th>Action Scenario</th>
  </tr>
  <tr>
    <td>ログイン1</td>
    <td>メールアドレス欄で入力→（Yes）→メール・アドレス欄でメール形式ではない文字を入力する→（Yes）</td>
  </tr>
  <tr>
    <td>ログイン2</td>
    <td>メールアドレス欄で入力→（Yes）→メール・アドレス欄でメール形式ではない文字を入力する→（No）<br>→未登録メール・アドレスを入力する→（Yes）</td>
  </tr>
  <tr>
    <td>ログイン3</td>
    <td>メールアドレス欄で入力→（Yes）→メール・アドレス欄でメール形式ではない文字を入力する→（No）<br>→未登録メール・アドレスを入力する→（No）→暗証番号を入力する→（No）</td>
  </tr>
  <tr>
    <td>ログイン4</td>
    <td>メールアドレス欄で入力→（Yes）→メール・アドレス欄でメール形式ではない文字を入力する→（No）<br>→未登録メール・アドレスを入力する→（No）→暗証番号を入力する→（Yes）→間違い暗証番号を入力する<br>→（Yes）</td>
  </tr>
  <tr>
    <td>ログイン5</td>
    <td>メールアドレス欄で入力→（Yes）→メール・アドレス欄でメール形式ではない文字を入力する→（No）<br>→未登録メール・アドレスを入力する→（No）→暗証番号を入力する→（Yes）→間違い暗証番号を入力する<br>→（No）</td>
  </tr>
</table>

<table>
  <tr>
    <th>No</th>
    <th>Action Scenario</th>
    <th>状況（ネットワーク）</th>
    <th>環境（言語）</th>
  </tr>
  <tr>
    <td>1</td>
    <td>ログイン5</td>
    <td>弱い</td>
    <td>中国語</td>
  </tr>
  <tr>
    <td>2</td>
    <td>ログイン1</td>
    <td>弱い</td>
    <td>中国語</td>
  </tr>
  <tr>
    <td>3</td>
    <td>ログイン3</td>
    <td>切られる</td>
    <td>中国語</td>
  </tr>
  <tr>
    <td>4</td>
    <td>ログイン2</td>
    <td>正常</td>
    <td>中国語</td>
  </tr>
  <tr>
    <td>5</td>
    <td>ログイン4</td>
    <td>正常</td>
    <td>中国語</td>
  </tr>
  <tr>
    <td>6</td>
    <td>ログイン3</td>
    <td>弱い</td>
    <td>英語</td>
  </tr>
  <tr>
    <td>7</td>
    <td>ログイン1</td>
    <td>切られる</td>
    <td>英語</td>
  </tr>
  <tr>
    <td>8</td>
    <td>ログイン2</td>
    <td>切られる</td>
    <td>英語</td>
  </tr>
  <tr>
    <td>9</td>
    <td>ログイン4</td>
    <td>切られる</td>
    <td>英語</td>
  </tr>
  <tr>
    <td>10</td>
    <td>ログイン5</td>
    <td>正常</td>
    <td>英語</td>
  </tr>
  <tr>
    <td>11</td>
    <td>ログイン2</td>
    <td>弱い</td>
    <td>日本語</td>
  </tr>
  <tr>
    <td>12</td>
    <td>ログイン4</td>
    <td>弱い</td>
    <td>日本語</td>
  </tr>
  <tr>
    <td>13</td>
    <td>ログイン5</td>
    <td>切られる</td>
    <td>日本語</td>
  </tr>
  <tr>
    <td>14</td>
    <td>ログイン3</td>
    <td>正常</td>
    <td>日本語</td>
  </tr>
  <tr>
    <td>15</td>
    <td>ログイン1</td>
    <td>正常</td>
    <td>日本語</td>
  </tr>
</table>