パターン網羅テストで漏れを少なくするために

## はじめに
某IT企業所属、長谷川と申します。

現場でテストケースの作成依頼をして、レビューをする際、
「あれ？このパターンは？」
といった指摘をすることがままあります。
指摘する際に
「こうしたらどうか」
と提案している内容をつらつらと書こうと思います。

#### パターン網羅テストとは
「網羅」という意味（「その分野や範囲のあらゆる物事を余すことなく・残らず・すべて取り込むこと、および、取り込んでいるさま」を意味する表現である。「網羅する」または「網羅的」の形で用いられることが多い。※weblioより抜粋）が表す通り、パターンをすべてテストするものです。
この考え方自体はエンジニアに限らずいろんな面で通用すると思います。

#### 漏れを少なくするためにテストケース作成者に提案していること
「マトリクスを作ってはどうか？」
です。当たり前、と思われる方も居るかもしれませんが、案外作られていないことが多いです。

マトリクスのメリットとしては見る側がぱっと見で分かりやすいことと、
作る側が多少なりとも業務上、運用上の制約を知ることが出来ることです。

例えば、「項目Aは半角数字のみ、かつ、2桁のみを許可する」という仕様があったとき、
項目Aのテストパターンは下記のような形になります。※長くなるので途中までにします。

<table>
 <tr>
  <td rowspan=2>No.</td>
  <td colspan=3>文字種</td>
  <td colspan=2>全角/半角</td>
  <td colspan=4>桁数</td>
 </tr>
 <tr>
  <td>数字</td>
  <td>英字</td>
  <td>記号</td>
  <td>全角</td>
  <td>半角</td>
  <td>0（未入力）</td>
  <td>1</td>
  <td>2</td>
  <td>3以上</td>
 </tr>
 <tr>
  <td>1</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
 </tr>
 <tr>
  <td>2</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
 </tr>
 <tr>
  <td>3</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
 </tr>
 <tr>
  <td>4</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
 </tr>
 <tr>
  <td>5</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
 </tr>
 <tr>
  <td>6</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
 </tr>
 <tr>
  <td>7</td>
  <td>〇</td>
  <td>〇</td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
 </tr>
 <tr>
  <td>8</td>
  <td>〇</td>
  <td>〇</td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
 </tr>
</table>

上記のように、マトリクスでは成功するもの失敗するもの問わず、組合せを列挙します。
全パターンを列挙するのは大変ですが、やり切ります。（パターン漏れが原因で障害を起こすよりはマシです）
とはいえ、不要なパターンもあるはずなので、この後に「業務上や運用上起こりえない」ケースや「他のパターンと同じ」ケースを削っていきます。

例えば、No.7のケースは数字英字混在のため、1桁はあり得ないので削ります。
全角のケースは1桁の場合も2桁の場合も結果は同じため、1パターンとしても良いでしょう。
他にはWeb上の入力項目そのものに数値以外が入力出来ないように入力制限をかけているのであれば、英字や記号のパターンは削ることができます。

<table>
 <tr>
  <td rowspan=2>No.</td>
  <td colspan=3>文字種</td>
  <td colspan=2>全角/半角</td>
  <td colspan=4>桁数</td>
 </tr>
 <tr>
  <td>数字</td>
  <td>英字</td>
  <td>記号</td>
  <td>全角</td>
  <td>半角</td>
  <td>0（未入力）</td>
  <td>1</td>
  <td>2</td>
  <td>3以上</td>
 </tr>
 <tr>
  <td>1</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
 </tr>
 <tr>
  <td>2</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
 </tr>
 <tr>
  <td>3</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
 </tr>
 <tr>
  <td>4</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
 </tr>
 <tr>
  <td>5</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
 </tr>
 <tr>
  <td>6</td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
  <td></td>
  <td></td>
  <td></td>
  <td>〇</td>
 </tr>
 <tr bgColor=silver>
  <td><strike>7</strike></td>
  <td><strike>〇</strike></td>
  <td><strike>〇</strike></td>
  <td></td>
  <td><strike>〇</strike></td>
  <td></td>
  <td></td>
  <td><strike>〇</strike></td>
  <td></td>
  <td></td>
 </tr>
 <tr bgColor=silver>
  <td><strike>8</strike></td>
  <td><strike>〇</strike></td>
  <td><strike>〇</strike></td>
  <td></td>
  <td><strike>〇</strike></td>
  <td></td>
  <td></td>
  <td></td>
  <td><strike>〇</strike></td>
  <td></td>
 </tr>
</table>

:::note warn
削る際に大事なのは実際に無くしてしまうのではなく、グレーアウトや取り消し線などで「パターンを挙げたけどテストは不要」とわかるようにします。
残しておくことで、テストパターンを確認する人は「あ、可能性のある点は検討したんだな」ということがわかります。
今回のマトリクスの場合、仕様上、文字種類は「数字」しか出てきていませんが、入力の可能性として「英字」「記号」も入力パターンとして挙げています。
:::


## まとめ
マトリクスを使用することで見る側もわかりやすく、作成者側の検討内容も伝わります。
また、作成開始のタイミングで観点（今回は文字種、全角/半角、桁数）をすり合わせておけば手戻りも防げます。
「なんかパターン漏れが多いかも？？」と感じたらぜひマトリクスでの見える化を試してみてください。

以上。長谷川でした。