以下、本発明の実施形態について添付の図面を参照しながら説明する。なお、本明細書及び図面において、実質的に同一の機能構成を有する構成要素については、同一の符号を付することにより重複した説明を省く。
(はじめに)
[シンボリック実行処理]
テスト対象プログラムをシンボリック実行処理により分析し、テストケース及びテストデータを効率的に生成する手法がある。シンボリック実行(記号実行)処理は、プログラムに外部から入力する値(引数値)にシンボル値(記号値)を設定してプログラムの実行をエミュレート(模擬実行)し、プログラム実行時の種々の情報を収集する技術である。テスト対象プログラムをシンボリック実行処理により分析した結果、そのプログラムにおいて実行可能なパスと、各パスが実行されるためにシンボル値が満たすべきパス条件とが抽出される。
受発注管理などの業務システムを構成するプログラムでは、マスタデータや処理結果や履歴等を記録するためにDBを利用する場合がある。例えば、図3は、DBを利用するJava(登録商標)プログラムの一例を示す。業務システムを構成するプログラム10がDB30を利用する場合、プログラム10は、JDBC20を介してDB30と接続する。JDBC20は、JavaプログラムとRDB(リレーショナルデータベース)との接続のためのAPI(Application Programming Interface)である。DB30は、SQL等のDB操作言語を受け付けて、DB操作言語に記述された操作内容に従ってDB30内に格納された情報を返す。
なお、業務システムを構成するプログラム10は、テスト対象プログラム11とDBアクセサ12とに分かれた構成であってもよい。DBアクセサ12は、DB30へアクセスする処理を行う専用のプログラムである。テスト対象プログラム11は、DB30を利用するプログラムであり、DBアクセサ12によりJDBC20を介してDB30にアクセスする。特に大規模なシステムのプログラムでは、DBへアクセスする処理を共通化するためにDBアクセサ12が作成され、利用されることがある。
図4は、DB30を利用するプログラムをテストする方法の一例を示す。まず、DB30の各レコードのフィールド値にテストデータ1が設定され(D1)、テスト対象プログラム11の引数値にテストデータ2が設定される(D2)。
次に、テストドライバ40は、テスト対象プログラム11を起動する。テスト作業者は、テスト対象プログラムの実行結果を計測し、実行結果の値と期待値とを比較してテストの成否を判定する(D3)。
DB30を利用するプログラム10のテストにおいても、シンボリック実行処理の手法を用いてテストデータを生成することが考えられる。しかしながら、DB30のフィールド値には、数値や文字列などの具体値(確定値)のみを設定することが可能であり、シンボル値を設定することはできない。このため、DBを利用するプログラムをシンボリック実行処理により分析することは困難である。
[DB処理のスタブ化]
そこで、DBの処理部分をシンボリック実行処理に対応可能なようにスタブ化する必要がある。つまり、シンボリック実行処理に対応していないDB30及びJDBC20(DBアクセスライブラリ)をスタブ化する必要がある。
図5は、DBの処理部分をスタブ化するための方法(1)〜(3)を示す。スタブ化する方法(1)〜(3)は、DBの処理部分をどの範囲でスタブ化するかで分類される。図5には、方式(1)〜(3)においてそれぞれスタブ化される範囲が示されている。
方式(1)は、DBアクセサ12の呼び出し時点でDBの処理部分をスタブ化する方法である。方式(1)では、DBアクセサ12のクラスまたはメソッドをスタブに置き換え、DBアクセサ12の呼び出し処理を代替する。
方式(2)は、DB操作言語の呼び出し時点でDBの処理部分をスタブ化する方法である。DB操作言語の一例としてはSQLが挙げられる。ただし、DB操作言語は、SQLに限られない。DB操作言語は、テスト対象プログラム11又はDBアクセサ12内に記述される。方式(2)は、テスト対象プログラム11又はDBアクセサ12内に記述されたDB操作言語の呼び出し部分の処理を代替する。
方式(3)は、DB30の替わりに、シンボリック実行処理に対応可能なようにDB30をスタブ化したDB(以下、「DBスタブ」ともいう。)及びDBアクセスライブラリ(以下、「JDBCスタブ」ともいう。)が使用される。テスト対象プログラム11又はDBアクセサ12は、JDBCスタブを介してDBスタブにアクセスする。
以上に説明したDB処理をスタブ化する方式のうち、方式(1)及び方式(2)には、次の第1〜第3の課題がある。第1には、スタブ化のためにプログラム10自体を一部修正する必要がある。第2には、DBアクセサ12毎又はSQL等のDB操作言語の記述毎にスタブを用意する必要があるため、大規模なプログラムでは用意すべきスタブの個数が多数となる。このため、スタブの箇所の発見とスタブの作成に多大の手間を要し、最終的にテストの工数が増大する。
第3には、シンボリック実行処理による分析によって生成されたテストデータは、DBアクセサ12等に記述されたSQLの実行の時点の変数に対して生成され、DBのフィールド値に対して生成されるわけではない。このため、DBを使ったテストに、生成したテストデータをそのまま利用することは困難である。
上記3つの課題のため、本実施形態は、方式(1)及び方式(2)を採用せず、方式(3)によりDBをスタブ化する方式を採用する。しかしながら、方式(3)においても、以下に説明するようにテストケース及びテストデータが重複して生成されるという課題がある。
[テストケース及びテストデータの重複]
以下、方式(3)の課題について、図6及び図2を参照しながら説明する。図6は、方式(3)によるDBの処理部分のスタブ化を説明するための図である。図2は、図6に示したDBスタブのシンボリック実行処理の結果の一例を示す。
図6に示されるように、方式(3)によるDBの処理部分のスタブ化では、DBスタブ100及びJDBCスタブ200の2つのスタブが生成される。
DBスタブ100は、DB30のスタブである。DBスタブ100は、下記の機能を備える。
・DBスタブ100のフィールドFにシンボル値を設定することができる。よって、DBスタブ100は、シンボリック実行処理に対応できる。
・SQL等のDB操作言語を受け付け、DB操作言語に記述された操作内容に従って、DBスタブ100内に格納された情報を返す。
JDBCスタブ200は、JDBC20のスタブである。JDBCスタブ200は、ConnectionクラスのスタブやPrepared Statementクラスのスタブなど、JDBCを構成するクラスのスタブから構成され、下記の機能を備える。
・シンボル値を処理できる。
・DB30に替わってDBスタブ100にアクセスする。
図6の左に示したプログラムは、DBアクセサ12と一体化したテスト対象プログラム11のDBアクセス部分をJavaプログラムにより記述した例である。JDBCは、Javaプログラムの圧縮形式であるJar形式で提供される。Javaプログラムの実行時にクラスパスでJDBCスタブ200を指定することによって、JDBC20に代替してJDBCスタブ200を利用できる。JDBCスタブ200は、DB30に替わってDBスタブ100にアクセスする。これにより、テスト対象プログラム11には手を加えずに、DBの処理部分をスタブ化することができる。
なお、図6のJavaプログラムの(a)は、DBの接続、Prepared Statement(図6の例ではSQLの検索式)の取得を記述する。Javaプログラムの(b)は、Prepared Statementへの入力パラメタの設定(図6の例ではフィールド1にcを設定)、SQLに記述された検索条件に従ったシンボリック実行処理を記述する。Javaプログラムの(c)は、シンボリック実行処理の結果の返却を記述する。
図2には、DBをスタブ化したDBスタブ100にシンボル値を設定し、SQLにて記述された検索条件に従いシンボル値に対するシンボリック実行処理を行った結果の一例が示されている。本例でのSQL検索式(SQL:SELECT * FROM Table WHERE (F1 = "c"))の検索条件は、DBスタブ100のフィールドF1に対して検索条件「F1=c」に従い各レコードを検索するものである。
このときのシンボリック実行処理では、まず、「レコード1のF1がcか?」の条件文で、「s1=c」というパス条件と「s1≠c」というパス条件とが積まれる。次に、「レコード2のF1がcか?」の条件文で、「s4=c」というパス条件と「s4≠c」というパス条件とが積み上げられる。次に、「レコード3のF1がcか?」の条件文で、「s7=c」というパス条件と「s7≠c」というパス条件とが更に積み上げられる。フィールドF1の複数のシンボル値がcになるパス条件は、検索条件を満たさず成立しない。ここで、パス毎のパス条件を満たす値がテストケース毎のテストデータとなる。この結果、生成されるテストケースは4個であり、図2の右表に示した4つのテストケースのテストデータが生成される。なお、テストデータに示される「""」、「"!"」、「" "」はすべて「値がcでない」ことを示す。
具体的に生成されたテストデータは以下である。
テストケース1:検索条件を満たすレコードが1件もヒットしなかった場合
テストケース2:レコード3が1件ヒットした場合であり、テストデータは、s7=c
テストケース3:レコード2が1件ヒットした場合であり、テストデータは、s4=c
テストケース4:レコード1が1件ヒットした場合であり、テストデータは、s1=c
ここでDBスタブの複数のレコードにシンボル値を設定した場合、各レコードのシンボル値は区別されない。例えば、図2のレコード1、2、3のフィールドF1に設定されたs1、s4、s7のシンボル値は区別されない。よって、テストケース2、3、4は、すべてレコードが1件ヒットし、かつフィールドF1にcの値が設定された場合に該当するので同一のテストケースである。従って、図2では2個のテストケースが重複して抽出されている。このように、上記DBスタブのシンボリック実行処理では、重複したテストケースが抽出されるという課題を有する。
そこで、以下に示す本実施形態にかかるシンボリック実行装置では、重複のないテストケースを抽出するために、シンボル値が設定されたDBスタブ100の各レコードを区別できるようにする。そして、各レコードの異同を識別してシンボリック実行処理が制御される。これにより、重複のないテストデータを生成することができる。以下、本実施形態にかかるシンボリック実行装置の機能及び動作について詳細に説明する。
[シンボリック実行装置の機能構成]
まず、一実施形態にかかるシンボリック実行装置の機能構成について、図7を参照しながら説明する。図7は、一実施形態にかかるシンボリック実行装置の機能構成の一例を示す。
本実施形態にかかるシンボリック実行装置50は、DBスタブ100の各レコードのフィールド値にシンボル値を設定し、検索条件に従いシンボル値に対するシンボリック実行処理を行う。シンボリック実行装置50は、シンボル値設定手段51、シンボリック実行手段52、DB接続スタブ手段53、レコード識別設定手段54、レコード検索制御手段55、レコード更新制御手段56、レコード削除制御手段57及びレコード追加制御手段58を有する。
DBスタブ100は、DB30をスタブ化してシンボル値を設定可能にしたDB30の代替である。DBスタブ100は、シンボリック実行装置50の内部の記憶領域を使用して生成されてもよく、シンボリック実行装置50の外部の記憶領域を使用して生成されてもよい。
シンボル値設定手段51は、DBスタブ100の各レコードのフィールド値にシンボル値を設定する。
シンボリック実行手段52は、検索条件に従い、設定されたシンボル値に対するシンボリック実行処理を行う。シンボリック実行処理された結果、DBスタブ100のシンボル値のパス毎のパス条件が得られる。
DB接続スタブ手段53は、シンボル値を処理可能なJDBCスタブ200を用いてDB30に替わってDBスタブ100にアクセスする。
レコード識別設定手段54は、DBスタブ100のレコードを区別するためにレコード毎にレコード識別値を設定する。レコード識別設定手段54は、シンボル値をフィールド値として含むレコード群のうち、フィールド値に対する同一の検索条件を満たす複数のレコードに同一の識別値を設定してもよい。
レコード検索制御手段55は、検索条件に従いシンボリック実行処理の対象となるレコードを検索する。その際、レコード検索制御手段55は、レコード群のうち同一の検索条件を満たし、かつ同一の識別値が設定された複数のレコードのうちの一つをシンボリック実行処理の対象として抽出する。
レコード更新制御手段56は、設定されたレコード識別値に基づきDBスタブ100のレコードの更新処理を制御する。レコード更新制御手段56は、検索条件を満たすレコードが特定された場合、その特定されたレコードを更新する。
レコード削除制御手段57は、設定されたレコード識別値に基づきDBスタブ100のレコードの削除処理を制御する。レコード削除制御手段57は、検索条件を満たすレコードが特定された場合、その特定されたレコードを更新する。
レコード追加制御手段58は、設定されたレコード識別値に基づきDBスタブ100のレコードの追加処理を制御する。レコード追加制御手段58は、検索条件を満たすレコードが特定された場合、その特定されたレコードに対して一意性制約に反しないレコードを追加する。一意性制約とはデータを追加や更新する際の制約の一つで、プライマリキーが設定されたフィールドFの値が一意であること、つまり、プライマリキーが設定されたフィールドに同じデータがないことを要求する。
かかる機能構成を有するシンボリック実行装置50は、同じレコード識別値が付与された複数のレコードのうちの一つのレコードに対してシンボリック実行処理を行う。この結果、本実施形態にかかるシンボリック実行装置50によれば、重複のないDBのテストケースを生成することができる。
つまり、後述されるように、シンボリック実行処理により抽出されたパス毎のパス条件は、テストケース生成装置60のテストデータ生成手段61に入力される。テストデータ生成手段61は、入力されたパス毎のパス条件に基づきDB30のフィールド値のテストデータを生成する。これによれば、抽出されたパス及びパス条件は重複していないため、重複のないテストケース及びテストデータを生成することができる。
[シンボリック実行処理(テストデータ生成処理)]
次に、本実施形態にかかるシンボリック実行処理について、図8及び図9を参照しながら説明する。図8は、本実施形態にかかるシンボリック実行処理(テストデータ生成処理)の一例を示したフローチャートである。図9は、図8に示したシンボリック実行処理を説明するための図である。
図8では、まず、テスト対象プログラム11(又はDBアクセサ12)が、クラスパスでJDBCスタブ200を指定し、JDBCスタブ200に接続するように変更される(ステップS10)。これにより、図9の(1)に示されるように、DBアクセサ12が、JDBCスタブ200と接続可能になる。
次に、テストドライバ40の制御により、シンボル値設定手段51は、DBスタブ100のレコードの各フィールドにシンボル値を設定する(ステップS11)。これにより、図9の(2)に示されるように、DBスタブ100の各フィールドにシンボル値が設定される。なお、DBスタブ100のフィールド値には、シンボル値又は具体値を設定することができる。
次に、シンボリック実行手段52によりテストドライバ40が起動され、テスト対象プログラム11、DBアクセサ12、JDBCスタブ200及びDBスタブ100が順にアクセスされる。シンボリック実行手段52は、テスト対象プログラム11又はDBアクセサ12内のSQLに記述された検索条件に従いシンボル値に対してシンボリック実行処理を行う(ステップS12)。本実施形態では、DBスタブ100の各フィールドには、テストドライバ40の制御により指定されたシンボル値が設定されている。よって、検索条件に従い、その設定されたシンボル値に対するシンボリック実行処理が行われる。この結果、図9の(3)に示されたシンボル値に対するシンボリック実行処理が行われ、実行可能なパス及びパス条件が抽出される。
抽出されたパス毎のパス条件は、テストデータ生成手段61に入力される。テストデータ生成手段61は、入力されたパス毎のパス条件を解析し、テストケース毎にテストデータを生成し(ステップS13)、本シンボリック実行処理(テストデータ生成処理)を終了する。
[テストデータの利用例]
以上のようにして生成されたテストデータの利用の一例について、図10を参照しながら説明する。図10は、一実施形態にかかるテストデータの利用の一例を説明するための図である。
図10の上段に示される利用手順1では、図8のフローチャートを参照して説明した通り、シンボリック実行処理を用いてテストケース毎のテストデータが生成され、出力される。
図10の下段に示される利用手順2では、DB30の各フィールド値に生成したテストデータが設定される。この状態で、テストドライバ40によりテスト対象プログラム11が起動され、テスト対象プログラム11の動作を確認するテストが実施される。
後述されるように、本実施形態に係るシンボリック実行装置50では、重複のないテストケース及びテストデータを生成することができる。この結果、上記テスト対象プログラム11の動作確認のテストを効率的に行うことができる。
[DBを利用するプログラムとテストドライバの例]
次に、一実施形態にかかるDBを利用するプログラム(テスト対象プログラム11の一部)及びテストドライバの一例を、図11を参照しながら説明する。図11は、一実施形態にかかるDBを利用するプログラム及びテストドライバの一例を示した図である。
図11に示されるDBを利用するプログラムのプログラミング言語はJavaである。このプログラムの例では、プログラムはテストドライバと一体となって、テストドライバから直接にDBスタブ100にアクセス可能である。また、本実施形態においてプログラムが利用する、シンボリック実行処理の対象となるDBスタブを呼び出すメソッドは、「testJDBCStub」である。
図11のプログラム(テストドライバ)の一例では、下記の(1)〜(4)の処理が記述される。
(1)では、s1〜s9をフィールドFに設定するシンボル値として扱うことの宣言が記述される。
(2)では、testJDBCStubのメソッド(ドライバ)から呼び出されるDBスタブ100の各レコードのフィールドFにシンボル値s1〜s9を設定することが記述される。
(3)では、DBを検索する処理が記述される。SQLの検索式の設定や入力パラメタの設定等の準備後、SQLの検索条件に従いシンボル値を用いたシンボリック実行処理が行われる。
(4)では、DB処理結果を利用するための処理が記述される。これにより、シンボル値を用いたシンボリック実行処理による検索結果が返却される。
[JDBCスタブ及びDBスタブ]
JDBCスタブ200は、JDBC20を代替し、DB30の代わりにDBスタブ100にアクセスする手段を提供する。図12は、JDBCスタブ200の主要なAPI(ライブラリ)の例を示す。JDBCスタブ200は、JDBC20と同一のAPIを提供してもよい。テスト対象プログラム11(又はDBアクセサ12)は、JDBCスタブ200のAPIを利用してDBスタブ100にアクセスすることができる。
DBスタブ100は、DB30の機能を代替する。図13に示されるように、DBスタブ100のフィールドには、例えばABCや11のような具体値だけでなく、s1〜s11のようなシンボル値(記号値)を設定できる。DBスタブ100は、JDBCスタブ200から接続され、SQLの検索条件に従いシンボル値を用いたシンボリック実行処理が可能である。
具体的には、SQLなどのDB操作言語と、JDBCスタブ200のAPIの呼出しにより指示された内容に従ってシンボリック実行処理が行われ、DBスタブ100内のレコードに設定されたシンボル値に対する検索(Select)、更新(Update)、削除(Delete)及び追加(Insert)などの処理が実行される。
[レコード識別]
次に、DBスタブ100内の各レコードに付与されたレコード識別値について説明する。レコード識別設定手段54は、DBスタブ100内のレコードを区別するためにレコード識別値を設定する。レコード識別設定手段54は、シンボル値をフィールド値として含むレコード群のうち、フィールド値に対する同一の検索条件を満たす複数のレコードに同一の識別値を設定してもよい。
レコード識別設定手段54は、ユーザによる指定に応じてレコード識別値を設定してもよい。例えば、DBスタブ100内の複数のレコードに対して検索条件を満たすレコードのヒット件数を1件にしたい場合、レコード識別設定手段54は、複数のレコードに1種類のレコード識別値を設定する。DBスタブ100内の複数のレコードに対して検索条件を満たすレコードのヒット件数をN件にしたい場合、レコード識別設定手段54は、複数のレコードにN種類のレコード識別値を設定する。
図14は、一実施形態にかかるレコード識別値の一例を示す。DBスタブ100の複数のレコード101のフィールドF1、F2、F3にはシンボル値s1〜s9が設定されている。本例では、DBスタブ100の3つのレコード101のそれぞれのフィールド値はすべてシンボル値であり、各レコードを区別することができない。そこで、レコード識別設定手段54は、これらのレコードを区別できるようにレコード毎にレコード識別値102を設定する。
レコード識別設定手段54は、SQLの検索条件を満たす複数のレコードが検出された場合にそれらの複数のレコードのうちの一つのレコードに対してシンボリック実行処理が行われるように、同一の検索条件を満たす複数のレコードに同じレコード識別値を付与する。同じレコード識別値が付与された複数のレコードのうちの一つのレコードに対してシンボリック実行処理が行われた場合、それ以外のレコードは検索対象から除外され、シンボリック実行処理の対象外となる。
例えば、図14(a)は、レコード1〜3のレコード識別値102に同じ値「A」が付与されている例である。この場合、レコード1〜3は、同じレコードであると識別される。よって、図14(a)は、レコード1〜3を区別せず、レコード1〜3から検索条件を満たすテストケースが1件だけ抽出されるようにしたい場合のレコード識別値の設定例である。この場合、レコード識別設定手段54は、レコード1〜3のレコード識別値102に同一の値を設定すればよい。
図14(b)は、レコード1,2のレコード識別値102に同じ値「A」が付与され、レコード3のレコード識別値102にレコード1,2と異なる値「B」が付与されている例である。この場合、レコード1,2は、同じレコードであると識別され、レコード3は、レコード1,2と異なるレコードであると識別される。よって、図14(b)は、レコード1〜3を2種類に区別して、3件のレコードからテストケースが2件抽出されるようにしたい場合のレコード識別値の設定例である。この場合、レコード識別設定手段54は、レコード識別値102に2種類の値を設定すればよい。
このようにして、SQL等で記述された検索条件を満たすDBスタブの複数のレコードに対して同じレコード識別値を付与することで、検索条件を満たすDBスタブの複数のレコードから1件のテストケースを生成することができる。
[レコード検索処理]
レコード検索制御手段55は、DBスタブ100のレコード群のうち同一の検索条件を満たし、かつ同一のレコード識別値が設定された複数のレコードのうちの一つをシンボリック実行処理の対象として抽出する。その際、レコード検索制御手段55は、同一のレコード識別値が設定されたレコードが既にシンボリック実行処理の対象として抽出されたかを示すフラグを用いる。
例えば、本実施形態では、フラグの初期値は「0」であり、既にシンボリック実行処理の対象として抽出されたレコードのレコード識別値に対するフラグの値は、「0」から「1」に変更される。ただし、既にシンボリック実行処理の対象として抽出されたレコードに設定されたレコード識別値か否かを判定できれば、フラグ以外のいかなる手段を用いることもできる。そして、レコード検索制御手段55は、フラグの値に基づき、既にシンボリック実行処理の対象として抽出されたレコードのレコード識別値と同一のレコード識別値が設定されたレコードについてはシンボリック実行処理を行うレコードの検索対象から除外する。以下、レコード検索制御手段55が行うレコード検索処理例1、2について詳しく説明する。
[レコード検索処理例1]
まず、本実施形態に係るレコード検索処理例1について、図15及び図16を参照しながら説明する。図15は、本実施形態にかかるシンボリック実行処理を行うレコードの検索処理の一例を示したフローチャートである。図16は、左表に示されるDBスタブ100のレコード1〜3のレコード識別値に「A」が設定された場合の図15のレコード検索処理の結果の一例を示す。
図15のレコード検索処理が開始されると、レコード検索制御手段55は、テスト対象プログラムに記述されたSQLの検索式を解析し、検索条件を取得する(ステップS20)。以下の処理では、図16に示されるようにSQLの検索式に基づき、検索条件がフィールドF1=cである場合を例に挙げて説明する。
次に、レコード検索制御手段55は、検索対象のDBスタブ100からレコードi(i=1,2・・・N)を取得する(ステップS21)。例えば、図16に示されるDBスタブ100では、レコード1,2,3(レコード数N=3)が取得される。
次に、レコード検索制御手段55は、レコードiに1を設定し(ステップS22)、レコードiのレコード識別値が既出かを判定する(ステップS23)。ここで、「レコードiのレコード識別値が既出か」とは、レコードiのレコード識別値が、既にシンボリック実行処理の対象として抽出されたレコードに設定されたレコード識別値と同じレコード識別値であるかを意味する。
この時点では、レコード識別値「A」のフラグは「0」に設定されている。よって、レコード検索制御手段55は、レコード1のレコード識別値「A」は既出でないと判定し、レコード1が検索条件を満たすかを判定する(ステップS24)。
ここでは、レコード検索制御手段55は、レコード1のフィールドF1に設定された値がcであるかを判定する。レコード1のフィールドF1に設定された値がcでないと判定された場合(ここでは、シンボル値s1がcでない場合)、ステップS26に進む。一方、レコード1のフィールドF1に設定された値がcであると判定された場合(ここでは、シンボル値s1がcである場合)、レコード検索制御手段55は、検索結果を格納するテーブルに検索条件を満たすレコード1を記憶し、レコード1のレコード識別値「A」のフラグに1を設定し、レコード1のレコード識別値を既出とする(ステップS25)。
次に、レコード検索制御手段55は、レコードiに1を加え(ステップS26)、レコードiがレコード数N(=3)よりも大きいかを判定する(ステップS27)。この時点では、レコード2は、レコード数3よりも小さいため、ステップS23に戻り、レコード検索制御手段55は、レコード2のレコード識別値「A」が既出かを判定する。
この時点で、レコード識別値「A」のフラグは「1」に設定されているため、レコード検索制御手段55は、レコード識別値「A」が既出であると判定し、シンボリック実行手段52にバックトラックの指示を出す(ステップS28)。この指示に応じて、シンボリック実行手段52は、レコード2に対するシンボリック実行処理におけるパスのパス条件の追跡を中断し、追跡可能な別のパスが存在するレコードの位置(命令文)まで戻る(バックトラック)。これにより、本実施形態では、既にシンボリック実行処理の対象として抽出されたレコード1と同一のレコード識別値が設定されたレコード2は、検索対象から除外される。
次に、レコード検索制御手段55は、レコードiに1を加え(ステップS26)、レコードiがレコード数Nよりも大きいかを判定する(ステップS27)。
この時点では、レコード3は、レコード数3に等しいため、ステップS23に戻り、レコード検索制御手段55は、レコード3のレコード識別値「A」が既出かを判定する。レコード識別値「A」のフラグは1に設定されているため、レコード検索制御手段55は、レコード識別値「A」が既出であると判定し、シンボリック実行手段52にバックトラックの指示を出す(ステップS28)。この指示に応じて、シンボリック実行手段52は、レコード3に対するシンボリック実行処理におけるパスのパス条件の追跡を中断し、バックトラックする。これにより、本実施形態では、既にシンボリック実行処理の対象として抽出されたレコード1と同一のレコード識別値が設定されたレコード3は、検索対象から除外される。
次に、レコード検索制御手段55は、レコードiに1を加え(ステップS26)、レコードiがレコード数Nよりも大きいかを判定する(ステップS27)。
この時点では、レコード4は、レコード数3よりも大きいため、ステップS29に進む。シンボリック実行手段52は、検索結果のテーブルに格納されたレコード1からSQLに記述された検索条件に従ってシンボリック実行処理を行い、パス毎のパス条件を抽出して、出力する(ステップS29)。
シンボリック実行手段52は、検索条件「F1=c」に従い、検索結果のテーブルに記憶されたレコード1のフィールドF1に設定されたシンボル値s1に対するシンボリック実行処理を行う。この結果、シンボル値s1がcである場合とcでない場合の2つのパス条件が抽出される。なお、シンボル値s4及びシンボル値s7はcである場合は成立せず、cでない場合のパス条件が抽出される。
この結果、パス1では、シンボル値s1、s4、s7がすべてcでないパス条件が抽出され、パス2では、シンボル値s1がcであり、シンボル値s4、s7がcでないパス条件が抽出される。このようにして抽出されたパス及びパス条件が出力された後、本レコード検索処理は終了する。
以上、レコード1〜3に同一のレコード識別値が設定された場合のレコード検索処理にについて説明した。これによれば、同一のレコード識別値に基づき、レコード1〜3はすべて同じレコードであると識別される。そして、本実施形態に係るレコード検索処理では、同じレコード識別値が設定された複数のレコードのうち、検索条件を満たした一つのレコードに対してシンボリック実行処理が行われるようにレコードが検索される。例えば、レコード1が検索条件を満たし、シンボリック実行処理の対象として抽出された場合、同じレコード識別値が設定されたレコード2,3は検索対象から除外される。これにより、同一の検索条件を満たし、かつ同一のレコード識別値が設定された複数のレコードのうちの一つをシンボリック実行処理の対象として抽出できる。以上により、同じレコード識別値が設定された複数のレコードに関して重複したテストケース及びテストデータの生成を防止できる。
なお、本実施形態に係るレコード検索処理例1では、レコード1をシンボリック実行処理させ、レコード1と同じレコード識別値が設定されたレコード2,3は検索対象から除外した。しかしながら、本実施形態に係るシンボリック実行装置50は、これに限られず、レコード識別値が同じ複数のレコードのうちの任意の一つのレコードに対してシンボリック実行処理が行われるようにしてもよい。例えば、レコード識別値が同じレコード2に対してシンボリック実行処理を行い、レコード1,3は検索対象から除外してもよい。また、レコード識別値が同じレコード3に対してシンボリック実行処理を行い、レコード1,2は検索対象から除外してもよい。
[レコード検索処理例2]
次に、本実施形態に係るレコード検索処理例1について、図15及び図17を参照しながら説明する。図17は、左表に示されるDBスタブ100のレコード1、2のレコード識別値に「A」が設定され、レコード3のレコード識別値に「B」が設定された場合の図15のレコード検索処理の結果の一例を示す。
図15のシンボリック実行処理が開始されると、レコード検索制御手段55は、SQLの検索式を解析し、検索条件を取得する(ステップS20)。以下の処理では、図17に示されるようにSQLの検索式に基づき、検索条件がフィールドF2=bである場合を例に挙げて説明する。
次に、レコード検索制御手段55は、検索対象のDBスタブ100からレコードi(i=1,2・・・N)を取得する(ステップS21)。例えば、図17に示されるDBスタブ100では、レコード1,2,3(レコード数N=3)が取得される。
次に、レコード検索制御手段55は、レコードiに1を設定し(ステップS22)、レコードiのレコード識別値が既出かを判定する(ステップS23)。この時点では、レコード識別値「A」のフラグは0に設定されている。よって、レコード検索制御手段55は、レコード1のレコード識別値Aは既出でないと判定し、レコード1が検索条件を満たすかを判定する(ステップS24)。
ここでは、レコード検索制御手段55は、レコード1のフィールドF2に設定された値がbであるかを判定する。レコード1のフィールドF2に設定された値がbでないと判定された場合(ここでは、シンボル値s2がbでない場合)、ステップS26に進む。一方、レコード1のフィールドF2に設定された値がbであると判定された場合(ここでは、シンボル値s2がbである場合)、レコード検索制御手段55は、検索結果を格納するテーブルにレコード1を記憶し、レコード1のレコード識別値「A」のフラグに1を設定、レコード1のレコード識別値を既出とする(ステップS25)。
次に、レコード検索制御手段55は、レコードiに1を加え(ステップS26)、レコードiがレコード数Nよりも大きいかを判定する(ステップS27)。この時点では、レコード2は、レコード数3よりも小さいため、ステップS23に戻り、レコード検索制御手段55は、レコード2のレコード識別値「A」が既出かを判定する。
この時点で、レコード識別値「A」のフラグは「1」に設定されているため、レコード検索制御手段55は、レコード識別値「A」が既出であると判定し、シンボリック実行手段52にバックトラックの指示を出す(ステップS28)。この指示に応じて、シンボリック実行手段52は、レコード2に対するシンボリック実行処理によるパスのパス条件の追跡を中断し、バックトラックする。これにより、レコード2は、検索対象から除外される。
次に、レコード検索制御手段55は、レコードiに1を加え(ステップS26)、レコードiがレコード数Nよりも大きいかを判定する(ステップS27)。
この時点では、レコード3は、レコード数3に等しいため、ステップS23に戻り、レコード検索制御手段55は、レコード3のレコード識別値「B」が既出かを判定する。レコード識別値「B」のフラグは0に設定されているため、レコード検索制御手段55は、レコード識別値「B」は既出でないと判定し、レコード3が検索条件を満たすかを判定する(ステップS24)。
ここでは、レコード検索制御手段55は、レコード3のフィールドF2に設定された値がbであるかを判定する。シンボル値s8がbでないと判定された場合、ステップS26に進む。一方、ステップS24にてシンボル値s8がbであると判定された場合、レコード検索制御手段55は、検索結果を格納するテーブルにレコード3を追加し、レコード3のレコード識別値「B」のフラグに1を設定する(ステップS25)。
次に、レコード検索制御手段55は、レコードiに1を加え(ステップS26)、レコードiがレコード数Nよりも大きいかを判定する(ステップS27)。
この時点では、レコード4は、レコード数3よりも大きいため、ステップS29に進む。シンボリック実行手段52は、検索結果のテーブルに格納されたレコード1,3からSQLに記述された検索条件に従ってシンボリック実行処理を行い、パス毎のパス条件を抽出して、出力する(ステップS29)。
シンボリック実行手段52は、検索結果のテーブルに記憶されたレコード1に対して検索条件「s2=b」に応じたシンボリック実行処理を行い、レコード3に対して検索条件「s8=b」に応じたシンボリック実行処理を行う。この結果、シンボル値s2がbである場合とbでない場合、及びシンボル値s8がbである場合とbでない場合の4つの組み合わせのパスが抽出される。なお、シンボル値s5はbでない場合のみ抽出される。
この結果、パス1では、シンボル値s2、s5、s8のすべてがbでないパス条件が抽出される。パス2では、シンボル値s2がbであり、シンボル値s5、s8がbでないパス条件が抽出される。パス3では、シンボル値s2、s5がbでなく、シンボル値s8がbであるパス条件が抽出される。パス4では、シンボル値s2、s8がbであり、シンボル値s5がbでないパス条件が抽出される。このようにして抽出されたパス及びパス条件を出力後、本レコード検索処理は終了する。
以上、二つのレコードに同一のレコード識別値が設定され、残りの一つのレコードには異なるレコード識別値が設定された場合のレコード検索処理について説明した。これによれば、同一のレコード識別値に基づき、レコード1,2は同じレコードであると識別される。これにより、レコード1が検索条件を満たしたら、同じレコード識別値が設定されたレコード2は検索対象から除外される。一方、レコード1と異なるレコード識別値が設定されたレコード3は検索対象から除外されない。このようにして、複数のレコードから最大で2個のレコードが抽出されてシンボリック実行処理によるテストケースが生成される場合、複数のレコードには2種類のレコード識別値が設定されればよい。これにより、複数のレコードからテストケースが2件だけ抽出されるように制御できる。以上により、同じレコード識別値が設定された複数のレコードに関して重複したテストケース及びテストデータの生成を防止できる。
なお、本実施形態に係るレコード検索処理例1では、レコード1をシンボリック実行処理させ、レコード1と同じレコード識別値が設定されたレコード2は検索対象から除外した。しかしながら、本実施形態に係るシンボリック実行装置50は、これに限られず、レコード2をシンボリック実行処理させ、レコード1は検索対象から除外してもよい。
[レコード更新処理]
次に、DBスタブ100のレコードの更新処理について、図18及び図19を参照しながら説明する。図18は、一実施形態にかかるレコード更新処理の一例を示したフローチャートである。図19は、一実施形態にかかるレコード更新処理の結果の一例を示す。なお、DBスタブ100の各レコードには、図19の左表に示されるシンボル値及びレコード識別値が設定されている。
レコード更新制御手段56は、SQLで記述された検索条件に従いレコード更新処理を制御する。その際、レコード更新制御手段56は、レコード識別値に基づきレコードの更新処理を制御する。図18のレコード更新処理のステップS21〜S29は、図15にて説明したレコード検索処理のステップS21〜S29と同一処理であり、レコード検索制御手段55により実行される。
図18のレコード更新処理が開始されると、レコード更新制御手段56は、SQLの検索式を解析し、検索条件を取得する(ステップS30)。以下の処理では、図19に示されるようにSQLの検索式に基づき、フィールドF2=bの検索条件を満たすレコードが特定され、特定されたレコードのフィールドF1を「B」に更新する処理が実行される。この更新処理は、検索条件を満たすレコードが特定された場合、特定されたレコードを変更する処理の一例である。
次に、レコード更新制御手段56は、レコード検索制御手段55にステップS21〜S29の処理を実行させる。レコード検索制御手段55は、ステップS21〜S29の順に各レコードを検索する。その結果、初めにレコード1が抽出され、その際にレコード識別値「A」のフラグに1が設定される。これにより、レコード2,3は検索対象から除外される。
次に、レコード更新制御手段56は、抽出されたレコード1をシンボリック実行処理させた結果により得られるパスに基づき、検索条件を満たすレコードを特定する(ステップS32)。
図19では、抽出されたレコード1をシンボリック実行処理させた結果により得られるパス1,2のパス条件が示されている。抽出されたレコード1をシンボリック実行処理させた結果、パス1のシンボル値s2、s5、s8がbでない場合と、パス2のシンボル値s2がbであり、シンボル値s5、s8がbでない場合が抽出される。このうち、パス2のパス条件が検索条件F2=bを満たす。よって、パス2に基づき検索条件を満たすレコード1が特定される。
次に、レコード更新制御手段56は、特定されたレコード1に対してSQLに記述されたフィールドF1を「B」に更新する処理を実行し(ステップS34)、本更新処理を終了する。
この結果、図19の右下の表に示されるように、レコード1のフィールドF1がBに更新される。以上に説明したレコード更新処理によれば、レコード識別値に基づいてレコードの更新を制御することができる。
[レコード削除処理]
次に、DBスタブ100のレコードの削除処理について、図20及び図21を参照しながら説明する。図20は、一実施形態にかかるレコード削除処理の一例を示したフローチャートである。図21は、一実施形態にかかるレコード削除処理の結果の一例を示す。なお、DBスタブ100各レコードには、図21の左表に示されるシンボル値及びレコード識別値が設定されている。
レコード削除制御手段57は、SQLで記述された検索条件に従いレコード削除処理を制御する。その際、レコード削除制御手段57は、レコード識別値に基づきレコードの削除処理を制御する。図20のレコード更新処理のステップS21〜S29は、図15にて説明したレコード検索処理のステップS21〜S29と同一処理であり、レコード検索制御手段55により実行される。
図20のレコード削除処理が開始されると、レコード削除制御手段57は、SQLの検索式を解析し、検索条件を取得する(ステップS40)。以下の処理では、図21に示されるようにSQLの検索式に基づき、フィールドF2=bの検索条件を満たすレコードが特定され、特定されたレコードを削除する処理が実行される。この削除処理は、検索条件を満たすレコードが特定された場合、特定されたレコードを変更する処理の一例である。
次に、レコード削除制御手段57は、レコード検索制御手段55にステップS21〜S29の処理を実行させる。レコード検索制御手段55は、ステップS21〜S29の順に各レコードを検索する。その結果、初めにレコード1が抽出され、その際にレコード識別値「A」のフラグに1が設定される。これにより、レコード2,3は検索対象から除外される。
次に、レコード削除制御手段57は、抽出されたパス及びパス条件に基づきフィールドF2=bの検索条件を満たすレコードを特定する。(ステップS42)。
図21では、抽出されたレコード1をシンボリック実行処理させた結果により得られるパス1,2のパス条件が示されている。抽出されたレコード1をシンボリック実行処理させた結果、パス1のシンボル値s2、s5、s8がbでない場合と、パス2のシンボル値s2がbであり、シンボル値s5、s8がbでない場合が抽出される。このうち、パス2のパス条件が検索条件F2=bを満たす。よって、パス2に基づき検索条件を満たすレコード1が特定される。
次に、レコード削除制御手段57は、特定されたレコード1に対してSQLに記述されたレコードの削除処理を実行し(ステップS44)、本削除処理を終了する。
この結果、図21の右下の表に示されるように、レコード1が削除される。以上に説明したレコード削除処理によれば、レコード識別値に基づいてレコードの削除を制御することができる。
[レコード追加処理]
次に、DBスタブ100のレコードの追加処理について、図22及び図23を参照しながら説明する。図22は、一実施形態にかかるレコード追加処理の一例を示したフローチャートである。図23は、一実施形態にかかるレコード追加処理の結果の一例を示す。なお、DBスタブ100の各レコードには、図23の左表に示されるシンボル値及びレコード識別値が設定されている。
レコード追加制御手段58は、SQLで記述された更新値に従いレコード追加処理を制御する。その際、レコード追加制御手段58は、レコード識別値に基づきレコードの追加処理を制御する。図22のレコード更新処理のステップS21〜S29は、図15にて説明したレコード検索処理のステップS21〜S29と同様の処理であり、レコード検索制御手段55により実行される。ただし、本実施形態では、等号の条件に従いレコードを検索する。
図22のレコード追加処理が開始されると、レコード追加制御手段58は、SQLの検索式を解析し、追加するレコードの更新値を取得する(ステップS50)。以下の処理では、図23に示されるようにSQLの検索式に基づき、フィールドF1、F2,F3の更新値がa、b、cのレコードを追加する処理が実行される。この追加処理は、検索条件を満たすレコードが特定された場合、新たなレコードを追加する処理の一例である。本実施形態に係る検索条件については、後述される。
レコード追加制御手段58は、プライマリキーが設定されたフィールドF1に対して、更新値との一意性制約に関する等号の条件を生成する(ステップS52)。ここで、一意性制約とはデータを追加や更新する際の制約の一つで、プライマリキーが設定されたフィールドFの値が一意であること、つまり、プライマリキーが設定された各レコードのフィールド値に同一値がないことを要求する。
本実施形態では、一意性制約に関する等号の条件として、プライマリキーが設定された各レコードのフィールドF1の値と、フィールドF1に追加する更新値「a」との間で等号の条件F1=aが生成される。
次に、レコード追加制御手段58は、レコード検索制御手段55にステップS21〜S29の処理を実行させる。レコード検索制御手段55は、ステップS21〜S29を実行し、等号の条件F1=aを満たすレコードの検索を行う。これにより、レコード検索制御手段55は、等号の条件F1=aを満たすレコードを抽出する。その結果、初めにレコード1が抽出され、その際にレコード識別値「A」のフラグに1が設定される。これにより、レコード2,3は検索対象から除外される。
次に、レコード追加制御手段58は、抽出されたパス及びパス条件に基づき、等号の条件を満たさないレコードを特定する(ステップS54)。つまり、等号の条件を満たすと一意性制約に反することになるため、本実施形態では、等号の条件を満たさない、つまりF1≠aとなるレコードが特定される。また、本実施形態に係る検索条件は、抽出されたレコードのうちプライマリキーが設定されたフィールド値が等号の条件を満たさないことであり、本実施形態では抽出されたレコード1のフィールドF1≠aである。
図23では、抽出されたレコード1をシンボリック実行処理させた結果により得られるパス1,2のパス条件が示されている。抽出されたレコード1をシンボリック実行処理させた結果、パス1のシンボル値s1、s4、s7がaでない場合と、パス2のシンボル値s1がaであり、シンボル値s4、s7がaでない場合が抽出される。
このうち、パス1のパス条件は、検索条件F1≠aを満たし、一意性制約に反しない。よって、レコード追加制御手段58は、ステップS56にて、レコード1は一意性制約に反しないレコードであると判定し、更新値a、b、cの新たなレコードを追加し(ステップS58)、本追加処理を終了する。これにより、図23の右下の表に示されるようにレコード4が追加される。
なお、レコード追加制御手段58は、ステップS56にて、抽出されたレコードが一意性制約に反するレコードであると判定した場合、新たなレコードを追加せずに(ステップS60)、本追加処理を終了する。
以上に説明したレコード追加処理によれば、レコード識別値に基づいてレコードの追加を制御することができる。
なお、レコード更新制御手段56、レコード削除制御手段57及びレコード追加制御手段58は、抽出されたレコードをシンボリック実行処理させた結果により得られるパスに基づき、検索条件を満たすレコードが特定された場合、特定されたレコードを変更する又は新たなレコードを追加するレコード変更制御手段の一例である。
以上、本実施形態にかかるシンボリック実行装置50について説明した。これによれば、DBスタブのシンボリック実行処理において、各レコードを識別するレコード識別値に基づき重複のないテストケースを抽出することができる。
(ハードウェア構成例)
最後に、シンボリック実行装置50のハードウェア構成例について簡単に説明する。図24は、本実施形態にかかるシンボリック実行装置50のハードウェア構成例を示す図である。
シンボリック実行装置50は、入力装置101、表示装置102、外部I/F103、RAM(Random Access Memory)104、ROM(Read Only Memory)105、CPU(Central Processing Unit)106、通信I/F107及びHDD(Hard Disk Drive)108を備え、それぞれがバスBで相互に接続されている。
入力装置101は、キーボードやマウスなどを含み、シンボリック実行装置50に各操作を入力するのに用いられる。表示装置102は、ディスプレイなどを含み、シンボリック実行装置50を使用してDBを利用するプログラムをテストするテスト作業者にテストケース及びテストデータ等のデータを表示する。
外部I/F103は、外部装置とのインタフェースである。外部装置には、記録媒体103aなどがある。シンボリック実行装置50は、外部I/F103を介して、記録媒体103aの読み取り及び/又は書き込みを行うことができる。記録媒体103aには、CD(Compact Disk)、及びDVD(Digital Versatile Disk)、ならびに、SDメモリカード(SD Memory card)やUSBメモリ(Universal Serial Bus memory)等がある。
ROM105は、不揮発性の半導体メモリ(記憶装置)であり、各種のプログラムやデータが格納されている。RAM104は、プログラムやデータを一時保持する揮発性の半導体メモリ(記憶装置)である。
HDD108は、プログラムやデータを格納している不揮発性の記憶装置である。格納されるプログラムやデータには、各種機能を提供するアプリケーションソフトウェアなどがある。また、HDD108は、上記実施形態のシンボリック実行処理やレコードの検索処理等を行うためにCPU106により実行されるJavaプログラムやAPI(ライブラリ)を格納してもよい。
CPU106は、上記記憶装置(例えば「HDD」や「ROM」など)から、プログラムやデータをRAM上に読み出し、装置全体の制御や搭載機能を実現する演算装置である。シンボリック実行処理やレコードの検索処理等は、HDD108等にインストールされたプログラムをCPU106に実行させることにより実現される。
通信I/F107は、ネットワークを介して他の機器と接続するためのインタフェースである。
以上、シンボリック実行プログラム、シンボリック実行方法及びシンボリック実行装置を上記実施形態により説明したが、本発明は上記実施形態に限定されるものではなく、本発明の範囲内で種々の変形及び改良が可能である。
以上の説明に関し、更に以下の項を開示する。
(付記1)
シンボル値を項目の値として含むレコード群のうち、前記項目に対する同一の検索条件を満たす複数のレコードに同一の識別値を設定し、
前記レコード群のうち同一の検索条件を満たし、かつ同一の識別値が設定された複数のレコードのうちの一つをシンボリック実行処理の対象として抽出し、
前記抽出されたレコードの前記項目の前記シンボル値に対し、前記検索条件に従ってシンボリック処理を実行する、
処理をコンピュータに実行させるためのシンボリック実行プログラム。
(付記2)
シンボリック実行処理させた結果により得られるパスに基づき、前記検索条件を満たすレコードを特定し、特定されたレコードを変更する、又は新たなレコードを追加する処理を更に含む、
付記1に記載のシンボリック実行プログラム。
(付記3)
シンボル値を項目の値として含むレコード群のうち、前記項目に対する同一の検索条件を満たす複数のレコードに同一の識別値を設定し、
前記レコード群のうち同一の検索条件を満たし、かつ同一の識別値が設定された複数のレコードのうちの一つをシンボリック実行処理の対象として抽出し、
前記抽出されたレコードの前記項目の前記シンボル値に対し、前記検索条件に従ってシンボリック処理を実行する、
処理をコンピュータが実行するシンボリック実行方法。
(付記4)
シンボリック実行処理させた結果により得られるパスに基づき、前記検索条件を満たすレコードが特定された場合、特定されたレコードを変更する又は新たなレコードを追加する処理を更に含む、
付記3に記載のシンボリック実行方法。
(付記5)
シンボル値を項目の値として含むレコード群のうち、前記項目に対する同一の検索条件を満たす複数のレコードに同一の識別値を設定するレコード識別設定手段と、
前記レコード群を検索し、同一の検索条件を満たし、かつ同一の識別値が設定された複数のレコードのうちの一つを抽出するレコード検索制御手段と、
前記抽出されたレコードの前記項目の前記シンボル値に対し、前記検索条件に従ってシンボリック処理を実行するシンボリック実行手段と、
を有するシンボリック実行装置。
(付記6)
シンボリック実行処理させた結果により得られるパスに基づき、前記検索条件を満たすレコードが特定された場合、特定されたレコードを変更する又は新たなレコードを追加するレコード変更制御手段を更に有する、
付記5に記載のシンボリック実行装置。