ALL Pair生成、手作業 vs PictMaster vs GIHOZ

#概要
ALL Pair法によるテストデータの生成を、手作業と[PictMaster](https://ja.osdn.net/projects/pictmaster/)と[GIHOZ](https://gihoz.com/login?redirect=%2Frepositories)で実施、比較してみる。
#お題
ラーメンのメニュー

|因子|パラメータ1|パラメータ2|パラメータ3|パラメータ4|パラメータ5|
|:---|:---:|:---:|:---:|:---:|:---:|
|スープ|醤油|味噌|塩|豚骨醤油|魚貝系|
|麺固さ|固目|柔らかめ|普通||
|背脂|多め|少なめ|||
|チャーシュー|肉厚|普通||
|ネギ|多め|少なめ|||

#生成してみる
###手作業
水準数の多い因子からペアリングするのが旨くいきます。
同時に、水準数の少ない因子もペアリングします。
![allPair009.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/10409bea-933f-bf8e-1852-5ab139387390.png)
醤油と味噌に対しても麺固さを3通りペアリングしている様子です。
同時に、背脂とチャーシューとネギについてもペアリングをしています。
このようにALL Pair法では、どこかで2つの因子が組み合わされていればOKとしています。
スープと麺固さとをペアリングしている最中に、背脂とチャーシューとネギについては、ALL Pairでペアリングが済みました。
次は、残りのスープと麺固さについてペアリングをしていきます。
2021/11/30 修正
一旦、残りのスープと麺固さのペアリングを全て済ませます。
済ませてから、背脂　チャーシュー　ネギのペアリング済みのテーブルとALL Pairになったか確認しながら
ドッキングします。
![allPair013.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/ac111da4-3830-198d-3a25-be6a64a0bbc4.png)
~~~塩と豚骨醤油についても、同様にペアリングをしています。この時、背脂とチャーシューとネギについては、既にペアリング済みのものをそのまま流用しています。これで、スープあるいは麺固さに対して、背脂あるいはチャーシューあるいはネギとも一度はペアリングできます。~~~
ということは、ALL Pair法による生成は、水準数の多い因子が支配的だということです。
ここまで生成したものを、スープと麺固さでソートして、ダマが無いか確認します。
![allPair014.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/6b603c3a-4cf1-29c2-c71c-b6cce2bc2303.png)
ネギに対してALL Pairのペアリングできていないので、背脂とチャーシューとネギのテーブルずらしをしておきます。
![allPair015.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/98e6aa30-2633-cdad-f533-837359940620.png)
空いているところに、背脂とチャーシューとネギのテーブルをはめ込みます。
![allPair016.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/d3e9570d-1022-0369-962c-b90ca3b44461.png)
スープと背脂とチャーシューとネギについては、ALL Pairできたので、このテーブルを麺固さでソートして、麺固さについてもALL Pairでペアリングできているかを確認します。
![allPair017.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/39b3f49d-31be-d238-d930-ca1e408bcdf1.png)
できていそうですね。
15件のテストデータになりました。
ALL Pair使わない場合、各因子の水準数のかけ算になりますので、
5✕3✕2✕2✕2 で、120件ということになります。120件のテストのところを15件で済ませるという技法になります。
###PictMasterを使った場合
手作業で生成できるのは、簡単な練習問題程度のテストですが、実際のテストでは、もっと多くの因子や水準数を扱うことが多いです。ALL Pairする様子を観察したかったので、手作業の場合を事例としてあげましたが、手作業で行なうのはお薦めしません。これから紹介するPictMasterやGIHOZで用意されているPairwise法を利用することを推奨します。
![pictmaster001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/b6e1af95-1444-b673-a85c-2d6b34d873ca.png)
PictMasterは、Excelマクロで動作するツールです。パラメータと値を入力して、実行ボタン押すだけです。
###GIHOZを使った場合
![gihoz001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/5e5784b9-cfe4-3bd4-6dbd-25a904be78e3.png)
こちらはブラウザから利用できるツールで、やはり表形式でパラメータと値を入力して、（画面下の方の）テストケースを生成ボタン押しだけです。
手作業でチマチマやっていたのは、なんだったんだ　という感じ。
#生成されたテストデータの比較
生成されたテスト件数は、どの方法でも同じ15件になりました。
並べ替えて比較してみましょう。
###手作業とPictMaster
2021/11/30修正
![手とpict_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/1c5611e8-3cb2-4fe3-58e7-8de201291c62.png)
一致したのは、1つだけ・・・
###PictMasterとGIHOZ
![pictとgihoz.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/e671a515-492b-120c-a02a-1688063ecd57.png)
この場合も、3つだけですね。生成の仕組みが何か違うのでしょう。GIHOZはデフォルトシードにしましたが、PictMasterでは、CIT-BACHを生成エンジンに使いました。
###手作業とGIHOZ
2021/11/30修正
![手とgihoz_002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/57d03b98-3c6b-e1d8-d1a0-1158b8d19bf6.png)
PictMasterの場合と一致したテストデータが微妙に違いますね。
生成エンジンが違うので、できるものは違う。なんか当たり前の結論です。
#変化への耐性を比較
ここからは、手作業はしません。
麺種類として、極太麺と普通麺と極細麺の仕様追加を行ないます。120件だったテストは、このままでは360件になってしまいますね、15件でも45件になるのでしょうか。やってみましょう。
###PictMasterの場合
![pictmaster002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/dd909bb0-72fd-20b8-a399-131b7f84ef60.png)
Excel表を修正して、ボタン押すだけです。
16件のテストデータでした。1件しか増えていません。
###GIHOZの場合
![gihoz002.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/f62e0317-b15b-02ee-635c-4e3fe79edf20.png)
こちらもブラウザ画面の表を修正してボタン押しだけです。やはり16件となりました。
PictMasterもGIHOZも、新たに追加された因子に対して、ALL Pair法によるテストデータ生成を実施し、16件で生成されたことがわかりました。ここがALL Pair法の強みです。45件または360件のテストデータに比べて、網の目が粗くなったのは事実ですが、ALL Pairという技法を使って旨く網羅したテストデータを生成した結果が16件ということになります。360件のテストが仮に1週間費やしたとして、16件ならば半日でできるかもしれません。これは、Weeklyリリースで開発を行なっている場合に、例えばバグが見つかっても、来週のリリースに間に合うか・間に合わないかの分かれ目になります。（極端な例かもしれませんが。）
#制約条件を追加してみる
極太麺は塩味スープでは選択不可、極細麺は、味噌味では選択不可とします。
例えば、麺とスープの絡み具合への拘りとか。
###PictMasterの場合
![pictmaster003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/7f86fb9c-3590-1a33-d425-429293b95fc0.png)
環境設定ボタンから制約表を有効化して、スープと麺種類の制約表を記述します。
生成結果は15件でした。
###GIHOZの場合
![gihoz003.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/3c31d389-ea52-439a-e423-7b0cfb995ad9.png)
制約表の使用スイッチを入れて、因子毎に制約表を記述します。
生成結果が16件になりました。1件増えた！
どの様な生成結果になったのか、並べ替えて比較してみました。
![制約の比較001.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/5ae0805a-ce9b-b2e4-29c2-dbfd30800efd.png)
GIHOZでは、魚介系のテストが1件追加になっているのが判ります。
こちらも、「生成エンジンの違い」としか判りませんが、仮に追加になった1件でバグが見つかったなら、GIHOZにして良かったと言えるし、何もバグが見つからなかったら、PictMasterの方が生産性が高いということになります。
#総括
ALL Pair法を手作業・2つのツールとで比較してみました。
比較して判るのは、
1. 手作業でテストデータを生成するのは、よほどで無い限りお薦めできない。
2. 仕様変更やテスト中の様々なテスト条件変化に対して、2つのツールともに、十分対応できそう。
3. 生成エンジンの違いにより、テストデータに違いが生じる場合がある。

文中でGIHOZとしましたが、ALL Pair = GIHOZ ではありません。GIHOZには他にもテスト設計作業を支援してくれる機能もあり、リポジトリの共有を使って、テスト仕様のレビュー等にも使えるのではないかと思います。
一方、PictMasterでは、2因子間は100%のペアリングなのは当然として、3因子になると、どのくらい低下するのか確認する機能があったりと、まだ他にも使いこなせていない機能が多いです。
![pictmaster004.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/939617/f2e4273f-4230-eb02-7df9-dcefa556c790.png)

ツール・道具は、使いようです。
GIHOZやPictMasterと旨くつきあって、テストをより効果的な活動にしたいものです。