テスト設計の効率化！Pictを使って無駄なテストケースを削減する


:::note info
この記事は『LITALICO Advent Calendar 2024』18日目の記事です。
:::
## はじめに
はじめまして！今年の4月に入社したエンジニアの@PopShunです。

いきなりですが、テスト設計をする中で「ケース数が多すぎて現実的じゃない…」「本当に効率的にテストできているのか不安…」という悩みを抱えたことはありませんか？

私も4月に入社して、テストをする中でまさにそのような悩みを抱えていました。特に、テストケースが膨大になり、どの組み合わせを選べば良いのか迷うことが多かったです。

そんな時、業務で**Pict**というツールを学ぶ機会があったので、今回はその使い方や学んだことを記事としてアウトプットしてみたいと思います。

## 1. Pictって何？

### 1-1. **Pictとは？**
chatgptによると、
>Pict(Pairwise Independent Combinatorial Testing)は、**ペアワイズ法**（因子のペアを網羅）を用いて効率的なテストケースを生成するツールで、Microsoftが提供しています。

とあります。

### 1-2. **ペアワイズ法とは？**
こちらも同じように調べてみると、
>「ソフトウェアの**バグの多くが1つまたは2つの因子の組み合わせによって発生している**」という事実に基づいてテストケースを作成する方法

と出てきました。

業務の中では、2004年に発表された論文「Software Fault Interactions and Implications for Software Testing」　を引用し、

>4つの異なるシステムにおいて、
>- 1つの要因で発生する欠陥が全体の29～68%
>- **2つ以下の要因で発生する欠陥は全体の70～97%**
>- 3つ以下の要因で発生する欠陥は全体の89～99%

という結果が出たと説明されていました。

:::note info
この結果から、ペアワイズ法を利用することで、**限られたテストケース数でも効率よくバグを発見できる**ことがわかります。
:::

## 2. Pictの導入手順と基本操作

### 2-1. **Pictのインストール**
Pictを使うためには、まずインストールが必要です。以下の手順で導入できます。

#### macOSユーザー：
```bash
brew install pict
```
#### Windowsユーザー：
.exeファイルを下記リンクからダウンロード
https://github.com/Microsoft/pict/releases

インストール後にpictコマンドが使えるようになります。
```terminal:Terminal
$ pict
Pairwise Independent Combinatorial Testing

Usage: pict model [options]

オプション:
 /o:N    - 組み合わせるパラメータの数 (初期値: 2)
 /d:C    - 値の区切り記号 (初期値: ,)
 /a:C    - エイリアスの区切り記号 (初期値: ¦)
 /n:C    - 無効値の前置記号 (初期値: ~)
 /e:file - 組み合わせ生成の元となるファイルの指定
 /r[:N]  - 組み合わせ生成の初期条件を指定, N:生成条件初期値
 /c      - 英文字の大文字と小文字を区別する
 /s      - 組み合わせ生成情報を出力
```

### 2-2. 基本の使い方：モデルファイルを作成する
Pictでは、テスト対象の因子と水準を .txt ファイルに記述します。

>**因子**：テストで確認したい項目のことです。たとえば、アプリケーションの動作がOSの種類や言語によって変わる場合、それぞれOSやLanguageが因子になります。つまり、因子とは「**テストで試したい項目**」や「**変化させたい要素**」です。

>**水準**：各因子が取り得る値のことです。たとえば、OSの因子にはWindows、macOS、Linuxという水準があります。LanguageにはEnglishとJapaneseという水準が考えられます。水準とは「**その項目が取り得る具体的な状態**」や「**選択肢**」です。


例えば、ユーザー登録機能のテストを行う場合、以下のように記述します。

```text:model.txt
デバイス: PC, スマホ, タブレット
ブラウザ: Chrome, Firefox, Safari
登録状態: 未登録, 登録済み, 無効
```

次に、以下のコマンドを実行することで、テストケースを生成できます。
```terminal:Terminal
pict model{ファイル名}.txt
```

入力するファイルは下記のようなフォーマットに従うテキストファイルにします。
```text
{ 因子名1 }: { 水準名① }, { 水準名② }, { 水準名③ }, ...
{ 因子名2 }: { 水準名① }, { 水準名② }, { 水準名③ }, ...
```
### 2-3. テストケースの生成結果
出力されるテストケースは、次のように最小限の組み合わせで効率よく網羅されます。

```text
デバイス       ブラウザ     登録状態
PC            Chrome      未登録
スマホ         Firefox     登録済み
タブレット     Safari      無効
スマホ         Chrome      無効
PC            Firefox     登録済み
タブレット     Chrome      未登録
```

## 3. Pict活用時の落とし穴
Pictは非常に強力なツールですが、いくつかの落とし穴にも注意が必要です。以下に代表的な落とし穴について紹介します。

### 3-1. 落とし穴1: すべての組み合わせを網羅できない
Pictはペアワイズ法 に基づいており、**3つ以上の因子の組み合わせ**で発生する欠陥（バグ）を網羅できないため、見落としが発生するリスクがあります。

もし、3因子以上の組み合わせをしっかり網羅したい場合は、Pictに**オプション**を追加することで対応可能です。
```terminal:Terminal
pict model.txt /o:3
```
このオプションを使用すると、3因子以上の組み合わせを考慮したテストケースを生成でき、見落としを防ぐことができます。

### 3-2. 落とし穴2: 設定値が不適切だとテストケースが不完全になる
Pictでは、**自分が設定した因子や水準に基づいて**テストケースを生成します。
したがって、もし設定した因子や水準が不完全または不適切な場合、テストケースが期待通りに作成されない可能性があります。

たとえば、「入力数値Y」という因子を設定し、その水準に「0」を含めなかった場合、Pictは「（入力数値X）÷0」のようなゼロ除算エラーを網羅するテストケースを生成しません。このように、必要なテストが生成されないリスクがあるため、因子と水準の設定は慎重に行う必要があります。

### 3-3. 落とし穴3: そもそも組み合わせて考えるべきなのか
Pictを使っていると、組み合わせてテストを作りたくなるのですが、先ほどの「ゼロ除算」などのケースは組み合わせテストではなく、単体テストとして個別に検証するのが適切です。

:::note info
Pictは因子間でどの組み合わせによっても期待値に影響がない**無則な組み合わせ**のテストに使用するべきであり、「ゼロ除算」のように因子間の組み合わせによって期待値に影響を与える**有則な組み合わせ**の場合は、別のテスト技法を使用する方が適切です。
:::

## 4. 終わりに
ここまで読んでいただき、本当にありがとうございました！

この記事では、業務で学んだPict中心に、効率的なテストケース作成に役立つ知識をアウトプットしました。

Pictは、無則な組み合わせのテストに活用することで、膨大なケースを効率的に網羅できる強力なツールです。ただし、すべての課題を解決するわけではないため、テストの目的やシナリオに応じて適切な技法を選択する重要性も感じました。

今回は、初めてのqita記事の作成であたふたしましたが、今後も業務を通じて得た知見などをこのような機会を通じてアウトプットしていきたいと思います！

明日のアドベントカレンダー19日目は、
- @katzumi さん
- @mka10 さん
- @sysysy さん

です！是非明日の記事も楽しんでいってください！


## 5. 参考
- テストの数を減らそう！プリキュアで学ぶPICT
    - https://qiita.com/greymd/items/ad18aa44d4159067a627
- テストについて学ぼう！　～第6話　ペアワイズ法とは～
    - https://developers.gnavi.co.jp/entry/software-testing-episode6
- 「全網羅テスト」という言葉について 〜または、ペアワイズ法、直交表、PICT活用時の落とし穴〜 #テストアドカレ
    - https://nihonbuson.hatenadiary.jp/entry/AllCoverageTrap
- ペアワイズ法によるテストケース抽出ツール「PICT」を使ってテストケースを85%削減する
    - https://qiita.com/odekekepeanuts/items/6eceddc534d87fc797cc#pictpairwise-independent-combinatorial-testing-tool%E3%81%A8%E3%81%AF