3因子間網羅率を測定する | 組み合わせテストケース生成ツール 「PictMaster」 とソフトウェアテストの話題

3因子間網羅率を測定する

PictMasterの次期バージョン 5.0 では生成したテストケースの3因子間網羅率を表示する機能を追加する予定です。すでに実装は完了しており、テスト中の段階です。


3因子間網羅率は次の式で表されます。


 3因子間網羅率 = 生成された3因子の組み合わせ数/(制約がない場合の3因子の全組み合わせ数 - 組み合わせできない3因子の組み合わせ数)


ここで問題となるのが「組み合わせできない3因子の組み合わせ数」を算出することが極めて困難であるということです。PICTは非常に複雑な制約指定が可能であり、制約指定を分析して、組み合わせできない3因子の組み合わせ数を算出することは事実上不可能です。


ここで発想を変えてみます。PICTは組み合わせる因子数に3を指定してテストケースを生成することができます。こうして生成されたテストケースの3因子間網羅率は100%ですから、先ほどの式は次の式で置き換えることができます。


 3因子間網羅率 = 生成された3因子の組み合わせ数/組み合わせる因子数に3を指定して生成された3因子の組み合わせ数


この方法では、組み合わせる因子数に3を指定して生成する必要があるので、大きなモデルでは生成が完了するまでに時間がかかるという難点がありますが、どんなに複雑な制約指定を行なっても正確な3因子間網羅率が簡単に得られるという大きなメリットがあります。


3因子の組み合わせ数は次の手続きで求めることができます。ここで、Pnは全体の因子数、qは全体の因子のうち3つの因子に着目した場合の可能な因子の組み合わせ数です。配列Aには特定の3因子の組み合わせに属するユニークな値の組の数を格納します。rはすべての3因子の組み合わせでのユニークな値の組の合計数(3因子の組み合わせ数)です。


  q = 1
  For i = 1 To Pn - 2     '3因子の全組合せを網羅する
    For j = i + 1 To Pn - 1
      For k = j + 1 To Pn
        A(q) = 値組数算出(i, j, k)    '特定の3因子の組み合わせに属するユニークな値の組の数を保存する
        q = q + 1
      Next k
    Next j
  Next i
  q = q - 1


  r = 0
  For i = 1 To q
    r = r + A(i)     'すべての3因子の組み合わせでのユニークな値の組の合計数を求める
  Next i


因子数が50の場合、3つの因子に着目した場合の可能な因子の組み合わせ数は19600となります。


関数の値組数算出では、特定の3因子の組み合わせに属するユニークな値の組の数を算出しています。生成されたテストケースには、特定の3因子の組み合わせに属する値の組に、3つの値の組み合わせが同一の値の組が含まれている場合があります。同じ組み合わせの値の組は1組を残して後は除外する必要があります。


同じ値の組が含まれているかを判定するには、テストケース数が100件の場合、1組の3因子の組み合わせだけに限っても4950回の比較演算が必要です。VBAはDictionaryオブジェクトを使うことができます。Dictionaryオブジェクトには様々なものを入れることができますが、これから入れようとするものと同じものがすでに入っているかが瞬時に分かるようになっています。Dictionaryオブジェクトを使うことで高速に比較演算ができるようになります。


値にエイリアスが含まれていると、正確な3因子間網羅率を求めることができません。テストケース中に出現するアイリアスの値は、テストケース数によって異なります。このため3因子間網羅率の比較対象のテストケースと、3因子間網羅率100%のテストケースとで、エイリアスの出現パターンが異なり、すべての3因子の組み合わせでのユニークな値の合計数に影響を与えます。3因子間網羅率を計算する前に、テストケースに含まれるエイリアスの値の名称は、元の値の名称に戻す必要があります。


こうした処理を行なうことで正確な3因子間網羅率を高速に測定できるようになりました。今回の実装で感じたのはVBAの持つポテンシャルの高さです。たかがマクロではないかと馬鹿にしがちですが、高速なコードを書くことで処理速度を1桁も2桁も高速化することができました