組み合わせテストケース生成ツール 「PictMaster」 とソフトウェアテストの話題 -66ページ目

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

それでは、また。

Jennyで組み合わせの欠落が現れる制約指定の例

AllPairIIで生成エンジンにJennyを使用した場合、組み合わせの欠落が起こることがあるとお知らせしました。


どのような制約指定を行なった場合にそれが起きるか、確認できた例を以下に示します。


ペアの現れない例


この制約指定では一部しか示していませんが、1つづつパラメータをずらしていって、制約の25まで指定します。環境設定で生成エンジンにJennyを指定し、最少テストケース生成を選択します。


間接制約を表示」にチェックを入れてください。


この状態で「生成」をクリックすると、「間接制約により組み合わせに現れない値のペア」のファイルが開かれ、そこで示されたペアが現れていないことが分かります。


このペアは制約には関係しないのでこのペアが現れないのはJennyのバグによるものです。

JennyのバグとAllPairIIの使用中止について

AllPairIIで使用している組み合わせ生成エンジンのひとつであるJennyに基本的な部分でバグのあることが分かりました。

ある特定の制約を指定して組み合わせを生成すると、必要な組み合わせのペアの一部が欠落するというものです。バグの内容が内容であるだけに、Jennyの使用は中止せざるを得ません。

現在、AllPairIIを使用されている方は、PictMasterに切り替えるかAllPairIIでPICTのみを使用するようにしてください。m(_ _)m

今後は、AllPairIIに盛り込まれているPictMasterの不具合修正箇所と機能改善箇所をPictMasterに移植し、PictMasterのバージョンアップを行なう予定です。

今回の事態でブログの題名を変更しました。

AllPairII 次バージョンで盛り込み予定の新機能

AllPairIIの次のバージョンで盛り込む内容を考えているのですが、いくつかあげてみます。

(1)Jennyで値の重み付けができるようにする。
(2)Jennyで原型シートを扱えるようにする。
(3)Jennyで無効値テストができるようにする。
(4)Jennyでパラメータどうしの比較ができるようにする。
(5)最少テストケース生成で、PICTとJennyを連続して実行し、どちらかより少ない組み合わせ数となった組み合わせを最終結果として出力できるようにする。

いずれもJennyの機能をPICTなみに強化し、PICTとの違いを少なくするすことを狙っています。これが実現すると(5)PICTとJennyの連続実行で、より少ない組み合わせを出力するということがほとんどのケースで実施可能となります。

現在、本業が忙しくなかなか時間が割けないのですが、10月末までには出したいと思っているのですがどうなることやら。

もしかしたらJennyへのいくつかの機能追加を先送りしてとにかくPICTとJennyの連続実行ができるバージョンを出すことになるかもしれません。

それでは、また。

Jennyでの制約対象のOR指定の方法

AllPairIIの現在のマニュアル上では、生成エンジンにJennyを使用した場合、制約対象のOR指定ができないことになっています。


制約対象のOR指定の例を図1表1およびリスト1に示します。



モデル

図1.モデルの例


表1.PICTでの生成結果

PICTの結果



リスト1.PICTの制約式


if ([A] = "a1" )
then ([B] = "b1" ) or ([C] = "c1" ) ;



表1の生成結果では、パラメータAがa1のとき、パラメータBがb1となる場合とパラメータCがc1となる場合がともに現れています。


図1と同じモデルと制約で生成エンジンにJennyを指定して生成した結果表2に示します。


表2.Jennyでの生成結果その1

Jennyの結果



同じ制約の場合、Jennyの生成結果ではOR条件ではなくAND条件となってしまっています。これはPICTの場合に、制約表上で制約条件が同じ制約が隣り合う場合、制約対象がORとなるようにPICTの制約式を生成する特別の処理が追加されているのに対し、Jennyの場合は特別な処理を何も行なっていないからです。


AllPairIIを作成した当初は、Jennyの -w オプションで組み合わせできない組み合わせを指定するという方法では、制約対象をORで指定する方法が思いつきませんでした。


その後、改めて見直してみたところ、Jennyでも -w オプションの指定を工夫することによって制約対象をOR条件で指定することが可能であることが分かりました。


その方法を図2の制約表に示します。この制約表では、制約対象と逆制約の関係にある制約条件を追加しています。このときのJennyの生成結果を表3に示します。



改良した制約表


図2.改良した制約表



表3.Jennyでの生成結果その2

改良したJennyの結果



表3の結果では、表1の生成結果と同様、パラメータAがa1のとき、パラメータBがb1となる場合とパラメータCがc1となる場合がともに現れています。この制約表でPICTで生成してもOR条件での生成結果が得られます。


どうしてこの制約表で制約対象がOR条件となるかは、制約表をよく見てもらえば自然と理解できると思います。もし制約表がなくて、-w オプションだけだったら分からなかったと思います。


今回示した方法は直感的に分かりにくいので、次のバージョンではJennyでもPICTと同じ記入方法で制約対象のOR条件が指定できるようにしたいと考えています。


それでは、また。