テストの初心者が直交表を用いて組み合わせテストの活用をしてみた!
このシリーズは、私自身の「初心者研修記録」をもとに、研修で学んだテスト技法を実務でどのように活用したのかを記録したものです。
今回はその中から、実務で初めてテスト技法を意識的に活用した取り組みとして、「状態遷移図」を用いた検証の記録を整理し、記事としてまとめました。
私自身、ソフトウェアテスト受託業務の企業に就職してまだ3カ月ほどであり、ソフトウェアテストに関しては社内研修で学んだ知識しか持っていない状態でした。
実務経験がほぼない中で、研修で学んだテスト技法をどのように業務に落とし込んだのか、その過程と考えたことを初心者の視点で残しておきたいと考え、今回の記事を作成しています。
※本記事は株式会社モンテカンポの新人スタッフが記録したレポートを元に、記事として編集しなおしたものとなります。

| 私について簡単に自己紹介をします。 前職では、サーバ(ハードウェア)開発に関連する業務に従事していました。 そのため、ソフトウェア開発やソフトウェアテストに関しては、実務として深く関わる機会はほとんどありませんでした。 ソフトウェア分野の基礎知識としては、基本情報技術者試験の資格を取得していますが、あくまで座学ベースの理解に留まっており、実際のテスト業務は未経験の状態で現在の会社に入社しました。 そのようなバックグラウンドを持つ私が、研修で学んだテスト技法をどのように理解し、どのように実務で使おうとしたのかが、今回の前提となっています。 |
今回活用するテスト技法
今回は直交表を用いた組み合わせテストの活用に挑戦します。
組み合わせテストとは
組み合わせテストとは、複数の条件が絡み合う複雑なシステムにおいて、効率的にテストケースを作成するための設計技法の一つです。
全パターンを網羅しようとすると、組み合わせ数が膨大になり現実的ではなくなります(組み合わせ爆発)。
今回の例では以下の因子が考えられます。
| 検証端末:計6端末 当選倍率:計3種類 賞品の種類:計3種類 |
これだけでも6 x 3 x 3 = 54通りとなります。
ここに「商品の組み合わせ」などを加えると、ケース数は容易に100を超えてしまいます。
組み合わせテストは、こうした多因子な検証を効率化するために行われます。
直交表とは
直交表とは組み合わせテストにおける具体的なペアの算出方法のひとつ。
元々はソフトウェアテスト技法ではなく実験のための手法だったそうです。
直交表で重視している考え方は「ソフトウェアの不具合の90%は、1つの因子または二つの因子の特定の組み合わせによって引き起こされる」という経験則。
以下は直交表の中でも最もシンプルなL4直交表です。
| 因子1 | 因子2 | 因子3 | |
| ペア1 | 水準1 | 水準1 | 水準1 |
| ペア2 | 水準1 | 水準2 | 水準2 |
| ペア3 | 水準2 | 水準1 | 水準2 |
| ペア4 | 水準2 | 水準2 | 水準1 |
これは3種類の因子がそれぞれ2つの値(水準)を持ちうる場合の直交表。
分かりづらい方は、今回の検証になぞらえて
| 因子1 = 検証端末(水準1: Android機, 水準2:iOS機) 因子2 = 購入商品数(水準1: 1品, 水準2: 2品) 因子3 = 応募賞品(水準1: QUOカード, 水準2: デジタルポイント) |
として考えてみてください。
| 検証端末 | 購入商品数 | 応募賞品 | |
| ペア1 | Android機 | 1品 | QUOカード |
| ペア2 | Android機 | 2品 | デジタルポイント |
| ペア3 | iOS機 | 1品 | デジタルポイント |
| ペア4 | iOS機 | 2品 | QUOカード |
この表の特徴は、いずれかの2因子に着目したときにこの4ペアで2因子で構成される全組み合わせを網羅している点です。
上記の因子1(検証端末)と因子2(購入商品数)に着目すると、水準のペア{水準1,水準1} {水準1,水準2} {水準2,水準1} {水準2,水準2}の全4パターンが網羅されていることがわかります。
| 検証端末 | 購入商品数 | 応募賞品 | |
| ペア1 | Android機 | 1品 | QUOカード |
| ペア2 | Android機 | 2品 | デジタルポイント |
| ペア3 | iOS機 | 1品 | デジタルポイント |
| ペア4 | iOS機 | 2品 | QUOカード |
これは因子2 – 因子3や因子3 – 因子1のペアに着目した場合でも同じ。
つまり直交表とは、二つの因子にフォーカスした時にいずれの因子の組み合わせでも全組み合わせが網羅されている表のことをいいます。
テスト内容
以下の検証業務を対象として実施します。
※検証対象は社外秘のため、本資料用に一部の仕様改変および名称変更を行っています。
【キャンペーン概要】
レシート登録による賞品応募キャンペーン
| 1.対象商品の購入レシートを登録すると、商品点数と同じ数のポイントを獲得できます。 2.貯まったポイントを使用して、賞品A・B・Cに応募可能です。 3.さらに、対象商品の中から計2種類を含んだレシートを登録すると当選確率が2倍、計3種類だと3倍になります。 |
【検証要件】
| ・Webサイト内の表示および表記ゆれの確認 ・各画面の画面遷移確認 ・レシート読み取り(OCR)の精度確認 ・賞品応募フローの確認 |
テスト技法の活用検討
検討(1回目)
因子・水準の検討
今回は検証項目に関して、因子と水準の組み合わせを検討します。
既存の直交表に適合するように、因子と水準を選定していきます。
今回は、検証が冗長になりやすい「NGレシートパターン」に関して検討を行いました。
まず、検証の条件を以下のように列挙しています。
【因子と水準のパターン】
因子:NGレシートパターン
| ・購入日時不明 ・購入店舗不明 ・購入金額不明 ・日時が対象期間前 ・日時が対象期間後 ・対象外商品のレシート ・レシートではない画像 ・既にポイント獲得済みのレシート |
因子:レシート登録条件(購入商品数)
| ・1種類1個 ・1種類複数 ・3種類1個ずつ |
因子:レシート登録条件(購入商品)
| ・商品A 〜 H(計8種類) |
因子:検証端末
| ・端末a 〜 f(計6種類) |
因子定義で困った点
上記で検討した項目は、実際の検証条件に沿って定義しました。
そのうえで因子数について検討する際、課題となったのは因子間における水準の従属性です。
上記4因子の総組み合わせ数は、単純な8x3x8x6(各因子の水準数の積)では表せません。
なぜなら、因子「購入商品数」の水準「3種類1個ずつ」と、因子「購入商品」の組み合わせが単純な積にならないからです。
本来、その組み合わせ数は以下の通りとなります。
8C3=56通り
なので、今回は割り切って考えて、「3種類1個ずつ」を「必ずベースとなる商品A〜Hのどれか1つが含まれている状態(+残り2つはランダム)」と定義し直す方向で検討してみました。
そうして「3種類1個ずつ」と因子「レシート登録条件: 購入商品」の組み合わせ総数は単純な8パターンで考えることができ、総組み合わせ数も8x3x8x6(各因子の水準数の積)で表すことができます。
ところで、因子「NGレシートパターン」の水準「対象外商品のレシート」と水準「レシートではない画像」は因子「レシート登録条件: 購入商品数」と因子「レシート登録条件: 購入商品」に依存しません。
なのでこれらは別途検証を行うものとし、直交表用の水準からは外すと、因子「NGレシートパターン」の水準数は6個に削減できるのです。
適応する直交表の選定
以上の検討により、「6水準 × 3水準 × 8水準 × 6水準」という構成になりました。これに適応できる直交表を調査したところ、「L64直交表」が該当します。
L64直交表は、本来「8水準・4因子」の対象に使用できるもので、組み合わせ数は64個となります(Lの下付き文字は表の組み合わせ数と等しくなります)。
しかし、今回の検証対象は水準数が異なるため、そのままでは当てはまりません。
このような場合に活用できるのがダミー水準法(ダミー法)というテクニックです。
これは因子の水準数をダミーで増やす手法です。
具体的に今回のパターンで説明すると、以下のようになります。
レシート登録条件:購入商品数(本来は3水準)
| 1. 1種類1個 2. 1種類複数 3. 3種類1個ずつ 4. 1種類1個(ダミー1) 5. 1種類複数(ダミー2) 6. 3種類1個ずつ(ダミー3) 7. 1種類1個(ダミー4) 8. 1種類複数(ダミー5) |
このように、あえて8水準と定義することで、直交表に無理やり適合させることが可能です。
この手法を用いることで、これらの因子の組み合わせについては、合計64回のテストを実施すれば効果的な結果を得られることがわかりました。
しかし、NGパターンだけで64回という数はかなりのボリュームであるため、もう少し削減できないか再検討することにしました。
検討(2回目)
組み合わせ数を削減するには
検証数を64回よりも少なくするには、当然ながらL64よりも小さい直交表を使用する必要があります。調査したところ、以下のような選択肢がありました。
| L9直交表:テスト回数 9回(3水準の因子を最大4つまで配置可能) L16直交表:テスト回数 16回(4水準の因子を最大5つまで配置可能) L18直交表:テスト回数 18回(2水準を1つ、3水準を7つまで配置可能) |
4因子の構成において、水準数が6以上含まれていると、最小でもL64が必要になるようです。そのため、次は「水準数そのものを削減する方法」について検討します。
因子・水準の再検討
まず因子「検証端末」については、今回はOSに着目することとし、「iOS」と「Android」の2水準に集約します(※この場合、OS依存の障害は検証できますが、端末固有の障害は発見しづらくなる点に注意が必要です)。
次に、最も水準数が多い「購入商品(8水準)」についてです。
水準を分割する手段として「多水準作成法(擬似因子法)」が活用できることがわかりました。これは、たとえば9以下の水準を「2因子・3水準」に分割する手法です。
3水準の因子が2つあれば、計 3^2 = 9通りの組み合わせが作れます。これらを分割したい元の水準に割り当てることで、構成を整理できます。
今回は、架空の「因子X(3水準)」と「因子Y(3水準)」を作成し、以下のようにマッピングしました。
| X1 | X2 | X3 | |
| Y1 | 商品A | 商品B | 商品C |
| Y2 | 商品D | 商品E | 商品F |
| Y3 | 商品G | 商品H | 商品A(ダミー) |
因子「NGレシートパターン」についても同様に、多水準作成法を活用します。
| A1 | A2 | A3 | |
| B1 | 購入日時不明 | 購入店舗不明 | 購入金額不明 |
| B2 | 日時が対象期間前 | 日時が対象期間後 | 対象外商品レシート |
| B3 | 購入日時不明(ダミー) | 購入店舗不明(ダミー) | 購入金額不明(ダミー) |
以上の施策により、以下の構成に整理できました。
| 2水準:1因子(検証端末:OS) 3水準:4因子(購入商品数、および多水準作成法で分けた因子A, B, X, Y) |
この構成であれば、「L18直交表(2水準を1つ、3水準を7つまで配置可能)」に適応できる形となります。
直交表の作成
前章で検討した通り、今回の検証におけるL18直交表を作成しました。
以下はL18直交表のテンプレート。
| L18 | A(2水準) | B | C | D | E | F | G | H |
| 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 2 | 1 | 1 | 2 | 2 | 2 | 2 | 2 | 2 |
| 3 | 1 | 1 | 3 | 3 | 3 | 3 | 3 | 3 |
| 4 | 1 | 2 | 1 | 1 | 2 | 2 | 3 | 3 |
| 5 | 1 | 2 | 2 | 2 | 3 | 3 | 1 | 1 |
| 6 | 1 | 2 | 3 | 3 | 1 | 1 | 2 | 2 |
| 7 | 1 | 3 | 1 | 2 | 1 | 3 | 2 | 3 |
| 8 | 1 | 3 | 2 | 3 | 2 | 1 | 3 | 1 |
| 9 | 1 | 3 | 3 | 1 | 3 | 2 | 1 | 2 |
| 10 | 2 | 1 | 1 | 3 | 3 | 2 | 2 | 1 |
| 11 | 2 | 1 | 2 | 1 | 1 | 3 | 3 | 2 |
| 12 | 2 | 1 | 3 | 2 | 2 | 1 | 1 | 3 |
| 13 | 2 | 2 | 1 | 2 | 3 | 1 | 3 | 2 |
| 14 | 2 | 2 | 2 | 3 | 1 | 2 | 1 | 3 |
| 15 | 2 | 2 | 3 | 1 | 2 | 3 | 2 | 1 |
| 16 | 2 | 3 | 1 | 3 | 2 | 3 | 1 | 2 |
| 17 | 2 | 3 | 2 | 1 | 3 | 1 | 2 | 3 |
| 18 | 2 | 3 | 3 | 2 | 1 | 2 | 3 | 1 |
これに今回の検証対象を適応すると以下の通りとなります。
| L18 | OS | NGパターン | 購入商品数 | 購入商品 | 不使用 | 不使用 | ||
| A | B | X | Y | |||||
| 1 | iOS | A1 | B1 | 1種類1個 | X1 | Y1 | 1 | 1 |
| 2 | iOS | A1 | B2 | 1種類複数個 | X2 | Y2 | 2 | 2 |
| 3 | iOS | A1 | B3 | 3種類1個 | X3 | Y3 | 3 | 3 |
| 4 | iOS | A2 | B1 | 1種類1個 | X2 | Y2 | 3 | 3 |
| 5 | iOS | A2 | B2 | 1種類複数個 | X3 | Y3 | 1 | 1 |
| 6 | iOS | A2 | B3 | 3種類1個 | X1 | Y1 | 2 | 2 |
| 7 | iOS | A3 | B1 | 1種類複数個 | X1 | Y3 | 2 | 3 |
| 8 | iOS | A3 | B2 | 3種類1個 | X2 | Y1 | 3 | 1 |
| 9 | iOS | A3 | B3 | 1種類1個 | X3 | Y2 | 1 | 2 |
| 10 | Android | A1 | B1 | 3種類1個 | X3 | Y2 | 2 | 1 |
| 11 | Android | A1 | B2 | 1種類1個 | X1 | Y3 | 3 | 2 |
| 12 | Android | A1 | B3 | 1種類複数個 | X2 | Y1 | 1 | 3 |
| 13 | Android | A2 | B1 | 1種類複数個 | X3 | Y1 | 3 | 2 |
| 14 | Android | A2 | B2 | 3種類1個 | X1 | Y2 | 1 | 3 |
| 15 | Android | A2 | B3 | 1種類1個 | X2 | Y3 | 2 | 1 |
| 16 | Android | A3 | B1 | 3種類1個 | X2 | Y3 | 1 | 2 |
| 17 | Android | A3 | B2 | 1種類1個 | X3 | Y1 | 2 | 3 |
| 18 | Android | A3 | B3 | 1種類複数個 | X1 | Y2 | 3 | 1 |
・NGパターン組み合わせ
| A1 | A2 | A3 | |
| B1 | 購入日時不明 | 購入店舗不明 | 購入金額不明 |
| B2 | 日時が対象期間前 | 日時が対象期間後 | 対象外商品レシート |
| B3 | 購入日時不明(ダミー) | 購入店舗不明(ダミー) | 購入金額不明(ダミー) |
・購入商品組み合わせ
| X1 | X2 | X3 | |
| Y1 | 商品A | 商品B | 商品C |
| Y2 | 商品D | 商品E | 商品F |
| Y3 | 商品G | 商品H | 商品A(ダミー) |
元々は2水準x3水準x8水準x6水準(検証端末をiOS, Androidの2パターンにした場合) = 288通りの組み合わせ数から、たった18パターンに抑えられたことは感動的でした。
ただし、直交表が適応出来る形にするために因子数・水準数の変更を伴うことによるテスト品質の低下が発生し得ることだけは考慮しなければならないと感じました。
今回の場合だと検証端末をOS違いのみに絞ったが、これは即ち「端末依存の障害は検出しにくい」ということ。
直交表を検証において何が重要で何が重要でないかはテスト設計者が把握したうえで因子・水準を検討しなければなりません。
また、本表を作成後に改めて考えてみたところ、多水準作成法が直交表のメリットを部分的に潰していることに気づきました。
直交表の特徴は、いずれかの2因子に着目したときにこの4ペアで2因子で構成される全組み合わせを網羅している点であるが、多水準作成法を活用した時点で検証できないペアが発生しています。
直交表も多水準作成法も、あくまで効率的に組み合わせを検討する手法であり、テスト効力の絶対値は下がる点は認識しなければいけない点であると感じました。
まとめ
今回の検証では直交表を作成しました。
直交表には種類があるためどのような条件でも使用できるものでは無い一方で、ダミー水準法や多水準作成法を活用することでうまく直交表にはまる形にすることができることが分かりました。
また、因子・水準をうまく調整する際には、何の因子・水準を重要視し、何の因子・水準が省略しても影響が無いかを考慮したうえで考えなければいけないことが分かりました。
直交表は形状が決まっているため活用に制限のあるテスト技法かと思っていましたが、本経験を通して因子・水準の選定・調整やテクニック(ダミー水準法, 多水準作成法, 等)の活用等、思ったよりも自由度の高いテスト技法であると感じました。
なお、今回は直交表を用いた組み合わせテストを検討したが、組み合わせテストには直交表以外にオールペア法を用いる方法もあります。
オールペア法の方が直交表よりも組み合わせ数の削減ができるそうですが、ただし原理が複雑であるため、今回は扱いやすい直交表を扱いました。
オールペア法に関しても、触れる機会があれば活用検討したいと思います。
