テストケース抽出の手間を軽減する「PICT」の使い方

# 初めに
テストケースの作成において、以前から次のような悩みを抱えていました。

* 因子をもとにテストケースを作成し、スプレッドシートにまとめる作業が手間になる
* 因子の数が多いと、それに伴い実施すべきテストも増えてしまう

そんな中、PICTというツールを知り、このツールを活用すればこれらの課題を解決できるのではないかと感じました。そこで、今回は実際に試してみようと思います。


# PICTとは
MicrosoftのOSSで、テストケースを抽出するツールです。

https://github.com/microsoft/pict

因子の一覧からコマンド実行でテストケースを抽出できます。

```text: factor.txt
OS:   Win10, Win11
言語: English, Japanese
```

```powershell: 実行結果
> pict .\factor.txt /o:2
OS      言語
Win10   Japanese
Win10   English
Win11   English
Win11   Japanese
```

# 試してみる
環境は以下です。
OS：`Windows11 PRO`
PICT：`3.7.4`

## インストール
### 1. PICTのGitHubからexeファイルをダウンロード
PICTのGitHubからexeファイルをダウンロードします。

https://github.com/microsoft/pict/releases/tag/v3.7.4


### 2. Pathを通す
環境変数からexeファイルのパスを通します。

たったこれだけでOKです。

```powershell
> pict
Pairwise Independent Combinatorial Testing

Usage: pict model [options]

Options:
 /o:N|max - Order of combinations (default: 2)
 /d:C     - Separator for values  (default: ,)
 /a:C     - Separator for aliases (default: |)
 /n:C     - Negative value prefix (default: ~)
 /e:file  - File with seeding rows
 /r[:N]   - Randomize generation, N - seed
 /c       - Case-sensitive model evaluation
 /s       - Show model statistics
```


## テストケース抽出
実際にテストケースを抽出してみましょう。

### 1. 因子ファイルを作成
今回は、「パーティーの参加者と食事」というテーマで因子を作成してみました。
```text: factor.txt
年齢区分:   未成年, 成人
食事:  肉, 魚, 麺, ピザ
飲み物: コーラ, オレンジジュース, ビール
```

### 2. コマンド実行
因子ができたら、以下のコマンドを実行します。
このコマンドを実行することで、factor.txtに定義した因子の組み合わせが自動的に生成されます。/o:maxオプションは、全ての組み合わせを表示するために指定しています。


```powershell
> pict .\factor.txt /o:max
年齢区分        食事    飲み物
未成年  ピザ    オレンジジュース
成人    ピザ    オレンジジュース
未成年  肉      オレンジジュース
成人    肉      コーラ
成人    魚      ビール
未成年  ピザ    ビール
成人    肉      ビール
成人    魚      コーラ
未成年  麺      コーラ
未成年  麺      ビール
未成年  魚      コーラ
未成年  麺      オレンジジュース
未成年  ピザ    コーラ
成人    麺      オレンジジュース
未成年  魚      ビール
未成年  肉      コーラ
成人    ピザ    コーラ
成人    麺      コーラ
未成年  肉      ビール
成人    肉      オレンジジュース
未成年  魚      オレンジジュース
成人    麺      ビール
成人    ピザ    ビール
成人    魚      オレンジジュース
```
これだけでテストケースが抽出できました！

# オプション、使い方
GitHubにオプションの使い方などが一通り載ってました。
https://github.com/Microsoft/pict/blob/main/doc/pict.md

この記事でもいくつか紹介したいと思います。

## 1. テストケースの数を抽出したい
抽出されるテストケースの数を知りたい時は`/s`オプションを使用します。
`Generated tests`がテストケースの数です。

```powershell
> pict .\factor.txt /o:max /s
Combinations:   24
Generated tests:24
Generation time:0:00:00
```


## 2. 組み合わせの条件指定
↑の例では未成年がビールを飲むことになっていますね。
未成年者がビールを飲むという選択肢が不適切であるため、その組み合わせを除外するために、条件を設定してみましょう。

:::note warn
このシステムでは「未成年の場合選択肢にビールは出てこない」ため、試験をする必要はないとします（本来であれば選択肢に出てこないことを確認するべきですが、条件指定を試したいので）。
:::


というわけで、未成年の場合ビールはNGという条件を加えてみましょう。
条件は因子のテキストファイルに記載できます。
```text: factor.txt
年齢区分:   未成年, 成人
食事:  肉, 魚, 麺, ピザ
飲み物: コーラ, オレンジジュース, ビール

if [年齢区分] = "未成年" then [飲み物] <> "ビール";
```

これにより、未成年がビールを飲むというテストケースをなくすことができました。
```powershell
> pict .\factor.txt /o:max
年齢区分        食事    飲み物
成人    麺      ビール
成人    麺      コーラ
成人    魚      ビール
成人    ピザ    コーラ
成人    肉      オレンジジュース
未成年  魚      オレンジジュース
成人    魚      オレンジジュース
未成年  肉      オレンジジュース
成人    肉      ビール
成人    ピザ    ビール
成人    魚      コーラ
未成年  魚      コーラ
未成年  ピザ    オレンジジュース
成人    肉      コーラ
成人    ピザ    オレンジジュース
未成年  麺      コーラ
未成年  ピザ    コーラ
成人    麺      オレンジジュース
未成年  麺      オレンジジュース
未成年  肉      コーラ
```

## 3. テストケースを効果的に減らす「ペアワイズ法」
### ペアワイズ法とは
ペアワイズ法とは、ソフトウェアテストの効率化手法のひとつです。
「多くの不具合は 1つまたは2つの因子の組み合わせ によって発生する」という経験則に基づき、すべての因子の組み合わせを網羅するのではなく、2因子間の組み合わせを満たすようにテストケースを作成します。
これにより、全組み合わせをテストするよりもテストケースの数を大幅に減らしながら、重要な組み合わせをカバー できます。

https://www.veriserve.co.jp/helloqualityworld/media/20240125003/

### ペアワイズ法の指定方法
PICTではペアワイズ法に沿ったテストケースを抽出することが可能です。
`/o:2`をつけて実行するとペアワイズ法に沿ったテストケースを抽出します（そもそもデフォルトが`/o:2`なので、指定する必要もありません）。

```powershell
> pict .\factor.txt /o:2
年齢区分        食事    飲み物
未成年  麺      コーラ
成人    魚      ビール
成人    肉      ビール
成人    ピザ    ビール
成人    麺      オレンジジュース
未成年  肉      コーラ
未成年  ピザ    オレンジジュース
成人    肉      オレンジジュース
未成年  魚      オレンジジュース
成人    麺      ビール
成人    ピザ    コーラ
成人    魚      コーラ
```

# 終わりに
今回はテストケース抽出ツールのPICTを紹介しました。
因子を挙げてからスプレッドシートでマトリクスを作るのが手間だったのですが、これなら少し楽になりそうですね。
また、ペアワイズ法を用いて効率的なテストケース抽出ができるのも魅力ですね。是非活用していきたいと思います。

ここまでご覧いただきありがとうございました！


# 参考
https://qiita.com/greymd/items/ad18aa44d4159067a627

https://qiita.com/odekekepeanuts/items/6eceddc534d87fc797cc