テスト工数を削減できるかもしれないペアワイズ法とPairwiser

筆者は元々デザイン系の出身なので、ソフトウェアのテストというものを真剣に考えたり調べたことはあまりなかった。この記事では、そんな自分がブラックボックステストをやることになり知った、組み合せテストにまつわる問題について説明する。

**本記事の概要**

* テストにおいて**パラメータの組み合せが厄介な性質を持っている**ことに気付いた
* 組合せテストの負荷を軽減する「**ペアワイズ法**」というものがある
* ペアワイズ法を使って無料でテストケースを生成できる**PairwiserというWebアプリケーション**がある

# 組み合わせの数が多すぎる

あるWebサイトに、以下のような典型的な検索UIがあったとする。この画面を対象にブラックボックステストを実施したい。

検索UI：
![スクリーンショット 2016-04-08 14.01.29.png](https://qiita-image-store.s3.amazonaws.com/0/48238/a8ede334-b2e2-a88b-dfd4-60bf2adb9d77.png)

文字列の部分には以下のような文字列を入れてテストしたい。

* 一般的な文字列
* 未入力
* 極端に複雑な文字列
* 極端に長い文字列

チェックボックスの部分はオンとオフしかないので

* 絞り込み条件あり
* 絞り込み条件なし

の2択になる。

早速スプレッドシートに組合せの表を作ろうとしたが、すぐにその組合せの種類が膨大になってしまうことに気付いた。

![スクリーンショット 2016-04-08 14.05.38.png](https://qiita-image-store.s3.amazonaws.com/0/48238/54fbfedc-1f46-6283-e2fe-7b19af95a6fd.png)

検索機能としてはそれほど複雑なものではないはずなのに、あっという間に必要なテストの数が256になってしまった。

しかも、もし今後絞り込み条件が増えていったとしたら、**条件が1つ増える度にテストケースの数が2倍になる**。

# ペアワイズ法・オールペア法・直交表

この組み合せをの多さをうまいところ削減できる方法はないか調べたところ、ペアワイズ法(またはオールペア法、または直交表)という手法を使うとテストケースを減らせることが分かった。

> そこで例えば、2個の因子の組（ペア）に注目して、全ての因子の組み合わせでなく、全てのペアの組み合わせにテストを制限します。
> [現場で使うためのオールペア法、直交表の基本（2）：組み合わせテストを科学的に効率化する――手法とツール、品質保証のための道具 (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1503/16/news149.html)

筆者の数学力は**数IIをクリアできていない**ので、具体的にどうやって組み合せを作っているのかまではよく分からなかった。理論の詳細は下記の参考URLを参照してほしい。

---

#### 参考サイト

* [第1回　組み合わせテストの技法：組み合わせテストをオールペア法でスピーディに！｜gihyo.jp … 技術評論社](http://gihyo.jp/dev/feature/01/sp-test/0001)
* [現場で使うためのオールペア法、直交表の基本（2）：組み合わせテストを科学的に効率化する――手法とツール、品質保証のための道具 (1/3) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1503/16/news149.html)

#### 有識者によるスライド資料

* [Pairwiseテスト導入の効果と課題 Pairwiseは大規模パッケージソフトウェアで効果的に運用できるか](http://jasst.jp/symposium/jasst12tokyo/pdf/A4-2.pdf)
* [直行表とオールペア法の並行運用によるソフトウェアテスト 手法と強さ、因子、水準の選択ガイドライン](http://jasst.jp/symposium/jasst14tokyo/pdf/C4-1-1.pdf)

---

**筆者が資料を読んで理解したこと：**

* システム開発会社も、テストケースが膨大な数になってしまうことに悩んでいる
* テストする機能のパラメータの種類のことを「因子」、それがとりうる値のことを「水準」と呼ぶ
* 水準を網羅する因子の組み合せに制限(2つまで、3つまで等)をかけ、テストケースの個数を減らすことができる?
* 統計的に、ほとんどのバグは2因子の組み合わせで起こることが認められている
* その為、因子の組み合わせを2つに制限しても、必要十分なテストを行える場合があると言われている
* だからといって、削減されたテストケースに重大なバグがないということは保証されない。本当に削除して良いテストケースかどうかは案件の性質を考慮する

# 無料で入手できるテストケース生成ツール

ペアワイズ法がどうやって組み合わせを作成するのかには理解が及ばなかったが、SIerの実務の一部で既に用いられていることも分かった。

ググると、ペアワイズ法を使って自動的にテストケースを生成できるツールがあった。これを早速仕事に取り入れてみることにした。

## Pairwiser

![スクリーンショット 2016-04-12 20.38.15.png](https://qiita-image-store.s3.amazonaws.com/0/48238/85bc50c7-810f-84ec-d4d5-d281d406c137.png)

[Pairwiser - Pairwise Testing and Test Generation Tool](https://inductive.no/pairwiser/)

* INDUCTIVE社というノルウェーの企業が開発しているWebアプリケーション
* Webブラウザ上からGUIでテストデータの入力と、ペアワイズ法によるテストケースの生成ができる
* 作ったテストケースをエクセル形式でダウンロードできる
* 禁則条件(要件上テストする必要ない組み合せ)、必須テスト条件も設定できる
* 無料アカウントで普通に使える
* **アカウント登録時のメールアドレスの、ドメインよりも手前の部分が自分のログインIDとなる(案内が不親切…)**

## PICT Master

[PictMaster プロジェクト日本語トップページ - OSDN](https://osdn.jp/projects/pictmaster/)

エクセルのVBAを使ってペアワイズ法によるテストケースを生成することができる。
**ただし、Mac版のエクセルに非対応**なので、筆者はこれを使うことができていない。

# Pairwiserの使い方

基本的に、左から右へタブに必須情報を入力してテストケースを生成する。それぞれのタブの「Save」ボタンを押さないとデータが保存されない。また、データが保存されていないタブよりも右側のタブの内容は更新が効かないようになっている。

## 因子と水準の入力

**"Define Parameters"**タブを選択し、好きなデータを入力する。一括インポートの機能がないのが惜しい。
なお、以下の例では、デフォルトで入っているサンプルのテストケース「Example2」を適当に和訳したデータを使っている。

![Pairwiserの因子・水準データ入力画面が表示されたスクリーンショット。](https://qiita-image-store.s3.amazonaws.com/0/48238/0d63474e-aa6a-1888-49ca-e30a04852e5b.png)

### 条件・禁則の設定

**"Constraints:"**で、パラメータ同士の細かい条件を設定できる。

![Pairwiserの条件入力画面が表示されたスクリーンショット。](https://qiita-image-store.s3.amazonaws.com/0/48238/3312ffb9-6264-c3b8-f03c-302e178f8252.png)

## 必須条件の設定

**"Required Tests"**タブでは、絶対に生成結果に含めてほしいテスト条件を明示することができる。

## テストの生成

**"Generate Tests"**タブでは、これまでに入力したデータと条件に基き、実際にテストケースを生成する。

![Pairwiserのテスト生成画面が表示されたスクリーンショット。](https://qiita-image-store.s3.amazonaws.com/0/48238/02cf96a0-2b0b-1615-da73-76d65fc5b46d.png)

## テストコードの作成

**"Test Script Template"**と**"Test Scripts"**のタブでは、テストケースの要素をテンプレートにあてはめてコードを生成したり、テスト手順書を作成することができる。(日本語が混ってると動かないっぽい??)

#### ホワイトボックステストにも使えそう

例がブラックボックステストっぽい内容になっているためイメージしにくいが、何かの関数のパラメータをデータとして入力すれば、ユニットテスト用のテストコードを生成することもできそう。

## 実際に使ってみて

Pairwiserを使うことで、**256あったテストケースを、48にまで減らすことができた**。ツールがあるとエクセルの手作業で作るよりもはるかに高速にテストケースを作れるので、その部分でもメリットを感じられた。

Web制作系の受託案件では、専門のシステムフトウェア会社に比べてテストにかけられるコストは大きくないことが多いだろう。ペアワイズ法を使うことで、限られた工数内で少しでもソフトウェアの信頼性を上げることができるかもしれない。

# スライド版資料

本記事は、拙作のスライド「[Web制作者視点で理解するソフトウェアテスト](http://media-massage.net/works/docs/learning_software_test_from_web_production_side/)」からPairwiserに関する記述をさらに掘り下げたものになっている

![スライド『Web製作者視点で理解するソフトウェアテスト』のサムネイルが表示されている。](https://qiita-image-store.s3.amazonaws.com/0/48238/cb7315ec-02ae-c27b-8ba8-9da7e5e60353.png)