PICTの生成エンジン部分は意外と単純? | 組み合わせテストケース生成ツール 「PictMaster」 とソフトウェアテストの話題

PICTの生成エンジン部分は意外と単純?

PictMasterでPICTを使用していて以前から感じていたことですが、パラメータと値の比較ではなく、パラメータとパラメータの比較が含まれていると、組み合わせ生成に比較的長い時間がかかることが気になっていました。

PICTは、エイリアス、パラメータとパラメータとの比較、無条件制約式、無効値テストなど、非常に多くの機能を備えています。これは他のフリーのツールとは大きく異なる点です。機能だけで比較したら他の有償のツールよりも多機能かもしれません。

PICTの組み合わせ生成部分でこうした多機能を実現しているわけではなく、PICTのスクリプト言語など、モデルと制約式を解釈し、組み合わせ条件を生成エンジンに渡しているコンパイラ部分、それも「コード生成」に相当する部分がPICTの多機能を実現しているのではないかと推測しています。

一般のコンパイラでのコード生成部分は、機械語を生成しますが、PICTのコンパイラのコード生成部分は、「組み合わせできない組み合わせ」のリストを生成します。

制約をサポートしたAll-Pair法のツールは、いずれも「組み合わせできない組み合わせ」を除外する機能をもっているはずです。

PICTは制約式で「組み合わせ可能な組み合わせ」を指定します。これは簡単に「組み合わせできない組み合わせ」に変換することができます(AllPairIIでのJennyの -w オプションで実現したように)。PICTではコンパイラのコード生成部分で、モデルや制約式の記述をもとに「組み合わせできない組み合わせのリスト」を生成し、組み合わせ生成のエンジン部分に渡しているのではないでしょうか。

このことを暗示している例として、PICTの「パラメータとパラメータの比較」があります。制約をサポートしているツールでもパラメータとその値の比較は可能ですが、パラメータどうしの比較をサポートしているツールはほとんどないと思います。

モデルと制約式が以下の場合、

A: 1, 2, 3
B: 1, 2, 3
C: 1, 2, 3

if ([A] = [B] )
then ([B] <> [C] ) ;

この制約式はパラメータどうしの比較を行なっていますが、これと等価な制約式をパラメータと値の比較の制約式で表すと以下のとおりとなります。

if ([A] = 1 ) and ([B] = 1 )
then ([C] <> 1 ) ;
if ([A] = 2 ) and ([B] = 2 )
then ([C] <> 2 ) ;
if ([A] = 3 ) and ([B] = 3 )
then ([C] <> 3 ) ;

パラメータどうしの比較に較べてずいぶん複雑になっています。仮にパラメータの値の数が10個であれば、この制約式も10個必要になります。

各パラメータの値の数を3個とした場合と20個とした場合のPICTの組み合わせ生成時間を調べてみました。最初はパラメータどうしの比較を行なう制約式で行ないました。最少テストケース生成回数は30回です。

3個: 3秒
20個: 13秒

今度はパラメータと値の比較を行なう制約式で同じことを行なってみました。

3個: 3秒
20個: 13秒

結果は全く同じ時間となりました。このことから、PICTの組み合わせ生成エンジン自体には、パラメータどうしの比較を行なう機能はなく、コンパイラ部分でパラメータと値の比較に変換し、組み合わせできない組み合わせのリストとしてPICTの生成エンジンに渡しているのではと推測できます。

無条件制約、無効値テストなども生成エンジンに渡す組み合わせの除外条件を工夫することによって実現していると思われます。

PICTの生成エンジン自体は特別な機能は持たず、一般的な生成エンジンとそれほど変わらないようです(サブモデル機能は別です)。

PICTの特徴的な機能の大部分は、PICTの組み合わせ生成エンジン内部にあるのではなく、コンパイラ部分(除外組み合わせ生成部分)で実現しているのではないか、ということが結論です。

もし、この結論が正しいなら、PICT並みの多機能を備えた組み合わせテストツールを実現することは、それほど難しいことではなく、さらなる新機能追加の余地も大いにあるといえるでしょう。

それでは、また。