(57)【特許請求の範囲】
【請求項１】
テストパス中にデータベース（DB）への複数の参照アクセスをもつテスト用のデータを生成するためのテストパス中に複数の参照アクセスをもつテスト用のデータ生成装置であって、
入力された設計情報からテストケースを抽出し、テストケース記憶手段に格納するテストケース抽出手段と、
前記テストケース記憶手段から前記テストケースを読み出し、同じDB初期状態を共有可能なテストケースを、同じグループに属するテストケースの各SELECT文が抽出するレコードに重複がないようにテストケースグループとしてグルーピングし、テストケースグループ集合記憶手段に格納するテストケースグルーピング手段と、
前記テストケースグループ集合記憶手段から前記テストケースグループを読み出し、該テストケースグループのテストケースの入力変数の制約式を生成し、該テストケースが含まれるテストケースグループ集合記憶手段の制約集合に格納する入力変数制約式生成手段と、
前記テストケースグループ集合記憶手段から前記テストケースグループを取得し、該テストケースグループに含まれるテストケースのDBテーブル変数を前記テストケース記憶手段から取得し、該DBテーブル変数のレコード件数を決定し、該DBテーブル変数の参照クエリ群へSELECTクエリを追加する処理を、該レコード件数分繰り返し、レコード配置表記憶手段の該DBテーブル変数の参照クエリ群に追加し、該レコード配置表記憶手段の該DBテーブル変数を前記テストケースグループ集合記憶手段に反映させるレコード配置決定手段と、
前記テストケースグループ集合記憶手段のテストケースグループに含まれる前記DBテーブル変数について、一意性を保証する制約式を生成し、該テストケースグループ集合記憶手段に格納するDBテーブル変数制約式生成手段と、
前記テストケースグループ集合記憶手段に格納された前記制約式を任意の解法を用いて解き、テストケース毎の入力値と、該テストケースを共有するDB初期状態をテストデータとして出力する制約式解法手段と、
を有することを特徴とするテストパス中に複数の参照アクセスをもつテスト用のデータ生成装置。
【請求項２】
前記テストケースグルーピング手段は、
グルーピング対象のテストケースから任意に1つのテストケースを選択し、選択されたテストケースのDBテーブル変数を、前記テストケースグループのDBテーブル変数に代入する手段を含む
請求項１記載のテストパス中に複数の参照アクセスをもつテスト用のデータ生成装置。
【請求項３】
前記レコード配置決定手段は、
前記レコードの件数を、各参照クエリの検索結果レコード件数の合計値とする手段を含む
請求項１記載のテストパス中に複数の参照アクセスをもつテスト用のデータ生成装置。
【請求項４】
前記DBテーブル変数制約式生成手段は、
前記レコード配置表記憶手段の前記DBテーブル変数のSELECT文が参照するWHERE句の条件に合うレコードを生成し、参照しないレコードはWHERE句の条件に一致しないようにレコードを生成する手段を含む
請求項１記載のテストパス中に複数の参照アクセスをもつテスト用のデータ生成装置。
【請求項５】
テストパス中にデータベース（DB）への複数の参照アクセスをもつテスト用のデータを生成するためのテストパス中に複数の参照アクセスをもつテスト用のデータ生成方法であって、
テストケース記憶手段、テストケースグループ集合記憶手段、テストケース抽出手段、テストケースグルーピング手段、入力変数制約式生成手段、レコード配置決定手段、DBテーブル変数制約式生成手段、制約式解法手段を有する装置において、
前記テストケース抽出手段が、入力された設計情報からテストケースを抽出し、前記テストケース記憶手段に格納するテストケース抽出ステップと、
前記テストケースグルーピング手段が、前記テストケース記憶手段から前記テストケースを読み出し、同じDB初期状態を共有可能なテストケースを、同じグループに属するテストケースの各SELECT文が抽出するレコードに重複がないようにテストケースグループとしてグルーピングし、テストケースグループ集合記憶手段に格納するテストケースグルーピングステップと、
前記入力変数制約式生成手段が、前記テストケースグループ集合記憶手段から前記テストケースグループを取得し、該テストケースグループに含まれるテストケースのDBテーブル変数を前記テストケース記憶手段から取得し、該テストケースの入力変数の制約式を生成し、該テストケースが含まれる前記テストケースグループ集合記憶手段の制約集合に格納する入力変数制約式生成ステップと、
前記レコード配置決定手段が、前記テストケースグループ集合記憶手段から前記テストケースグループを取得し、該テストケースグループに含まれるテストケースのDBテーブル変数を前記テストケース記憶手段から取得し、該DBテーブル変数のレコード件数を決定し、該DBテーブル変数の参照クエリ群へSELECTクエリを追加する処理を、該レコード件数分繰り返し、レコード配置表記憶手段の該DBテーブル変数の参照クエリ群に追加し、該レコード配置表記憶手段の該DBテーブル変数を前記テストケースグループ集合記憶手段に反映させるレコード配置決定ステップと、
前記DBテーブル変数制約式生成手段が、前記テストケースグループ集合記憶手段のテストケースグループに含まれる前記DBテーブル変数について、一意性を保証する制約式を生成し、該テストケースグループ集合記憶手段に格納するDBテーブル変数制約式生成ステップと、
前記制約式解法手段が、前記テストケースグループ集合記憶手段に格納された前記制約式を任意の解法を用いて解き、テストケース毎の入力値と、該テストケースを共有するDB初期状態をテストデータとして出力する制約式解法ステップと、
を行うことを特徴とするテストパス中に複数の参照アクセスをもつテスト用のデータ生成方法。
【請求項６】
前記テストケースグルーピングステップにおいて、
グルーピング対象のテストケースから任意に1つのテストケースを選択し、選択されたテストケースのDBテーブル変数を、前記テストケースグループのDBテーブル変数に代入する
請求項５記載のテストパス中に複数の参照アクセスをもつテスト用のデータ生成方法。
【請求項７】
前記レコード配置決定ステップにおいて、
前記レコードの件数を、各参照クエリの検索結果レコード件数の合計値とする
請求項５記載のテストパス中に複数の参照アクセスをもつテスト用のデータ生成方法。
【請求項８】
前記DBテーブル変数制約式生成ステップにおいて、
前記レコード配置表記憶手段の前記DBテーブル変数のSELECT文が参照するWHERE句の条件に合うレコードを生成し、参照しないレコードはWHERE句の条件に一致しないようにレコードを生成する
請求項５記載のテストパス中に複数の参照アクセスをもつテスト用のデータ生成方法。
【請求項９】
コンピュータを、
請求項1乃至４のいずれか1項に記載のテストパス中に複数の参照アクセスをもつテスト用のデータ生成装置の各手段として機能させるためのテストパス中に複数の参照アクセスをもつテスト用のデータ生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、テストパス中に複数の参照アクセスをもつテスト用のデータ生成装置及び方法及びプログラムに係り、特に、DB（データベース）に格納されているデータの読み出し操作を伴うような機能性テストの際に、テストパス中に複数の参照アクセス（SELECT）が含まれるテストデータを生成するテストデータ生成装置及び方法及びプログラムに関する。
【背景技術】
【０００２】
データベースに格納されているデータの読み出しの操作を伴うような機能性テストのためのテストデータ生成技術として以下のようなものがある。なお、ここで、テストデータとは、データベースの初期状態（以下、「DB初期状態」と記す）と入力値のペアであり、データベースアプリケーションのテストのため、テスト実施時の各画面の入力フィールドへの入力、データベースに予め入れておくデータセットとして利用する。
【０００３】
従来は、テストケースごとに記述された事前条件を入力として、テストケース（DB初期状態を含む）生成する方法（例えば、非特許文献１参照）や、ソフトウェアの設計情報を入力として、テストケース及び、そのテストケースの事前条件を抽出し、テストケース毎にテストケースの事前条件を満たすDB初期状態を生成する方法（例えば、非特許文献２参照）がある。
【先行技術文献】
【非特許文献】
【０００４】
【非特許文献１】藤原翔一朗、宗像一樹、片山朝子、前田芳晴、大木憲二、上原忠弘、山本里枝子、smt solverを利用したwebアプリケーション用テストデータの生成、情報処理学会創立50周年記念（第72回）全国大会講演論文集,2010.
【非特許文献２】丹野治門、張暁晶、星野隆："設計モデルを利用したテスト用データベースの自動生成手法"，情報処理学会論文誌：ソフトウェア工学特集号、Vol. 53, No.2, pp. 566-577, 2012.
【発明の概要】
【発明が解決しようとする課題】
【０００５】
しかしながら、同じカラムに対する検索条件の空間に重なりがある場合、上記従来方法を用いると、テストパス上のガード条件（整数算術式、整数比較演算子等の整数制約）で予定したレコード件数と異なるレコード件数が返ってきてしまうという問題がある。
【０００６】
また、これらの技術は、１テストケースにつき、１つのDB初期状態を生成するため、高々１回のDB定義（Persons）のSELECTアクセスしか扱えない。従ってテスト実施毎に、DB初期状態の入れ替えの回数が多いという問題がある。例えば、図１に示す入力値定義、DB定義（Persons）があり、処理フロー図から抽出されたテストケースにおいて、SELECT文として「SELECT * FROM Persons WHERE Age<= maxAge AND Age>= minAge」が与えられた場合（１つのSELECT文が使われている場合）は、同図右に示すような検索結果レコード件数が２件となるテストデータを得ることができる。しかし、同一テーブル（Persons）に対して複数回の参照アクセス、条件分岐がある場合には、対応できないという問題がある。
【０００７】
本発明は、上記の点に鑑みなされたもので、複数回のSELECT文の検索結果レコード件数に応じて後続するSELECT文の実行を行うテストケースを生成でき、かつ、テスト実施時のDBの初期状態の入れ替え回数を削減することが可能なテストパス中に複数の参照アクセスをもつテスト用のデータ生成装置及び方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
上記の課題を解決するため、本発明（請求項１）は、テストパス中にデータベース（DB）への複数の参照アクセスをもつテスト用のデータを生成するためのテストパス中に複数の参照アクセスをもつテスト用のデータ生成装置であって、
入力された設計情報からテストケースを抽出し、テストケース記憶手段に格納するテストケース抽出手段と、
前記テストケース記憶手段から前記テストケースを読み出し、同じDB初期状態を共有可能なテストケースを、同じグループに属するテストケースの各SELECT文が抽出するレコードに重複がないようにテストケースグループとしてグルーピングし、テストケースグループ集合記憶手段に格納するテストケースグルーピング手段と、
前記テストケースグループ集合記憶手段から前記テストケースグループを読み出し、該テストケースグループのテストケースの入力変数の制約式を生成し、該テストケースが含まれるテストケースグループ集合記憶手段の制約集合に格納する入力変数制約式生成手段と、
前記テストケースグループ集合記憶手段から前記テストケースグループを取得し、該テストケースグループに含まれるテストケースのDBテーブル変数を前記テストケース記憶手段から取得し、該DBテーブル変数のレコード件数を決定し、該DBテーブル変数の参照クエリ群へSELECTクエリを追加する処理を、該レコード件数分繰り返し、レコード配置表記憶手段の該DBテーブル変数の参照クエリ群に追加し、該レコード配置表記憶手段の該DBテーブル変数を前記テストケースグループ集合記憶手段に反映させるレコード配置決定手段と、
前記テストケースグループ集合記憶手段のテストケースグループに含まれる前記DBテーブル変数について、一意性を保証する制約式を生成し、該テストケースグループ集合記憶手段に格納するDBテーブル変数制約式生成手段と、
前記テストケースグループ集合記憶手段に格納された前記制約式を任意の解法を用いて解き、テストケース毎の入力値と、該テストケースを共有するDB初期状態をテストデータとして出力する制約式解法手段と、を有する。
【０００９】
また、本発明（請求項２）は、前記テストケースグルーピング手段において、
グルーピング対象のテストケースから任意に1つのテストケースを選択し、選択されたテストケースのDBテーブル変数を、前記テストケースグループのDBテーブル変数に代入する手段を含む。
【００１０】
また、本発明（請求項３）は、前記レコード配置決定手段において、
前記レコードの件数を、各参照クエリの検索結果レコード件数の合計値とする手段を含む。
【００１１】
また、本発明（請求項４）は、前記DBテーブル変数制約式生成手段において、
前記レコード配置表記憶手段の前記DBテーブル変数のSELECT文が参照するWHERE句の条件に合うレコードを生成し、参照しないレコードはWHERE句の条件に一致しないようにレコードを生成する手段を含む。
【発明の効果】
【００１２】
上記のように本発明によれば、SELECT文毎に、当該SELECT文が参照するレコードはWHERE句の条件に合うレコードを生成し、参照しないレコードはWHERE句の条件に一致しないようにレコードを生成するため、テストパス上の各参照アクセスで、予定した件数のレコードが過不足なく返却されることを保証し、結果として、直前のSELECT文の参照結果のレコード件数に応じて後続するSELECT文の実行を行うテストケース（テストパス）を試験するためのテストデータを構成するDB初期状態を生成することができる。
【００１３】
また、本発明では、同じDB初期状態を使いまわすテストケースをグルーピングすることにより、同じグループに属するテストケースの各SELECT文が抽出するレコードに、重複がないようにDB初期状態を１つ生成するため、結果として生成されたDB初期状態は、各テストケース（各テストパス）とするためのテストデータを構成するDB初期状態となる。また、DB初期状態の入れ替え回数を削減することができる。
【図面の簡単な説明】
【００１４】
【図１】従来技術におけるテストケース生成例である。
【図２】本発明の一実施の形態におけるテストデータ生成の概要を示す図である。
【図３】本発明の一実施の形態におけるテストデータ生成装置の構成図である。
【図４】本発明の一実施の形態における入力されるDB定義の例である。
【図５】本発明の一実施の形態における入力されるテストケース（経路）の例である。
【図６】本発明の一実施の形態における入力される入力値定義の例である。
【図７】本発明の一実施の形態におけるテストデータ生成装置の概要動作のフローチャートである。
【図８】本発明の一実施の形態におけるテストケースグループ集合記憶部に格納されたデータ構成である。
【図９】本発明の一実施の形態におけるテストケース抽出部の詳細処理のフローチャートである。
【図１０】本発明の一実施の形態におけるテストケース記憶部の格納例である。
【図１１】本発明の一実施の形態におけるテストケースグルーピング部の詳細処理のフローチャートである。
【図１２】本発明の一実施の形態におけるテストデータグルーピングの例である。
【図１３】本発明の一実施の形態における入力変数制約式生成部の詳細処理のフローチャートである。
【図１４】本発明の一実施の形態におけるレコード配置決定部の詳細処理のフローチャートである。
【図１５】本発明の一実施の形態におけるレコード配置決定部の動作の例である。
【図１６】本発明の一実施の形態におけるDBテーブル変数制約式生成部の詳細処理のフローチャートである。
【図１７】本発明の一実施の形態におけるDBテーブル変数制約式生成部の動作例である。
【図１８】本発明の一実施の形態におけるテストデータ出力部からの出力例である。
【発明を実施するための形態】
【００１５】
以下、図面と共に本発明の実施の形態を説明する。
【００１６】
本発明は、図２に示すように、設計情報（XML）として入力値定義、テストケース（経路）、DB定義（本実施の形態ではPersonsテーブル)を入力する。テストケースは、同一テーブル（Persons）に対してn回（同図の例では２回）の参照アクセス及びC1,C2の２回の条件分岐を行うものである。これらの設計情報から同図右側に示すように、２箇所の分岐（C1，C2）を制御するテストデータを生成する。同図の例では、条件分岐C1に対して０件、C2に対して２件のレコードを返すことを示している。
【００１７】
図３は、本発明の一実施の形態におけるテストデータ生成装置の構成を示す。
【００１８】
同図に示すテストデータ生成装置１は、テストケース抽出部１０、テストケースグルーピング部３０、入力変数制約式生成部４０、レコード配置決定部５０、DBテーブル変数制約式生成部６０、制約式解法部７０、テストデータ出力部８０、テストケース記憶部１５、テストケースグループ集合記憶部３５、レコード配置表メモリ５５から構成される。テストケース記憶部１５、テストケースグループ集合記憶部３５、レコード配置表メモリ５５は、ハードディスクやメモリ等の記憶媒体である。また、レコード配置表メモリ５５は、レコード配置決定部５０の外部に設けているが、この例に限定されることなく、レコード配置決定部５０内に具備してもよい。
【００１９】
まず、端末２からテストデータ生成装置１に入力されるデータについて説明する。
【００２０】
図４〜図６は、本発明の設計情報の例を示す。
【００２１】
図４は、本発明の一実施の形態における入力されるＤＢ定義の例である。
【００２２】
DB定義（Personsテーブル）は、DBテーブルID、DBレコードのカラム、カラムID（String型と定義域、カラムの種類（Normal/Primary Key））、型と定義域、整数定義域、カラムの種類等が定義されている。
【００２３】
図５は、本発明の一実施の形態における入力されるテストケース（経路）の例である。同図（A）に示す処理フロー図は、処理内容を示すノードと、ある処理から次の処理への遷移を示すエッジからなり、ノード、ノード内容、クエリ（SELECT，UPDATE，INSERT，DELETE)ID、カラムと設定値、WHERE句条件群、次ノード接続エッジ群、エッジ、ガード条件、整数制約、整数算術式、整数項、整数比較演算子、整数因子、カラム参照、変数参照等が規定されている。なお、SELECTクエリはResultRecordCountを含む。
【００２４】
図６は、本発明の一実施の形態における入力される入力値定義の例である。
【００２５】
入力値定義は、入力値と、その入力値のString型と定義域を含む。
【００２６】
上記の構成における処理を説明する。
【００２７】
図７は、本発明の一実施の形態におけるテストデータ生成装置の概要動作のフローチャートである。
【００２８】
ステップ１１０）  テストケース抽出部１０は、端末２から入力された設計情報（XML形式）から、テストケースを抽出し、テストケース記憶部１５に格納する。詳細な動作は図９で詳述する。
【００２９】
ステップ１３０）  テストケースグルーピング部３０は、ステップ１１０で抽出されたテストケースをテストケース記憶部１５から読み込み、同じDB初期状態を使い回すテストケースをテストケースグループとしてグルーピングし、テストケースグループ集合記憶部３５に格納する。テストケースグループ集合記憶部３５には、図８に示すように、テストケースグループID（テストケース＋制約集合、DBテーブル変数）毎に、テストケース記憶部１５から取得したテストケースが格納される。テストケースは、テストケースId，FlowId、（テストパス、変換済み更新クエリ）、制約集合、DBテーブル変数、DBフィールド変数、参照群クエリ（SELECTクエリ）、入力変数、整数型変数を含む。
【００３０】
なお、本実施の形態では、ユーザ入力された、参照クエリについてグルーピングするためのパラメータに基づいて、グルーピングを行うものとする。詳細な動作は図１１で詳述する。
【００３１】
ステップ１４０）  入力変数制約式生成部４０は、テストケースグループ集合記憶部３５からテストケースグループを取得し、当該テストケースグループに含まれるテストケースをテストケース記憶部１５から取得し、テストケースにおける入力変数の制約式を生成し、テストケースグループ集合記憶部３５のテストケースグループ毎の制約集合へ追加する。当該処理を取得した全テストケースについて繰り返す。詳細な処理は図１３で詳述する。
【００３２】
ステップ１５０）  レコード配置決定部５０は、テストケースグループ集合記憶部３５からテストケースグループを読み込み、当該テストケースグループの設計情報のDBテーブル変数をテストケース記憶部１５から取得する。DBテーブル変数に基づいて、最終的に生成するDBテーブルにおけるレコードの件数、そして、各参照クエリにヒットするレコードをそれぞれどの位置に配置するかを決定する。レコード件数は各DBテーブルのクエリ（SELECT）の検索結果レコード件数（ResultRecordCount）の合計値とし、DBテーブル変数の参照クエリ群へSELECTクエリを追加する処理を、該レコード件数分繰り返し、該テストケースグループ集合記憶部３５の該DBレコード変数の参照クエリ群に追加する。詳細な処理は図１４で詳述する。
【００３３】
ステップ１６０）  DBテーブル変数制約式生成部６０は、テストケースグループ集合記憶部３５からテストケースグループを読み込み、当該テストケースグループに含まれるテストケースのDBテーブル変数を抽出し、各DBフィールド変数に関する制約式を生成してテストケースグループ集合記憶部３４のテストケースグループの制約集合へ追加する。加えて、各テストケースの入力変数に関する制約式も生成し、同様に制約集合へ追加する。詳細な処理は図１６で詳述する。
【００３４】
ステップ１７０）  制約式解法部７０は、テストケースグループ集合記憶部３５のテストケースグループの制約集合を読み出して、制約式を取り出し、連立不等式を解き、ランダムに解を一つ得て、テストケースグループ集合記憶部３５に格納する。なお、連立不等式の解をとるために、既存の制約ソルバ(Trends in constraint Programming (Frederic Benhamou et. al., Wiley-ISTE, 1905209975, 2007)を用いる。
【００３５】
ステップ１８０）  テストデータ出力部８０は、テストケースグループ集合記憶部３５から取得したテストケース毎の入力値と、テストケースで使いまわすDB初期状態値１つを、このテストケースグループの使用するテストデータとしてまとめ、出力する。当該処理には、例えば、特許文献１：特開2010-267022号公報に記載の技術を適用することが可能である。
【００３６】
以下に、上記の図７の各ステップの動作を詳細に説明する。
【００３７】
＜テストケース抽出部の処理（ステップ１１０）＞
次に、図７のステップ１１０のテストケース抽出部１０の処理について説明する。
【００３８】
図９は、本発明の一実施の形態におけるＳ１１０の詳細処理のフローチャートである。
【００３９】
ステップ２１０）  テストケース抽出部１０は、入力された設計情報の処理フロー図からテストパスを抽出する。例えば、図５の例では、分岐条件C1カバレッジを満たすよう、全てのテストパスを抽出する。
【００４０】
ステップ２２０）  次に、抽出されたテストパスから当該テストパスを持つテストケースを作成し、テストケース記憶部１５に格納する。テストケースの作成方法としては、処理フロー図から抽出したそれぞれのパスに対応するテストケース（抽出した１本のパスが１テストケースとなる）を抽出するための特許文献１（特許4966386号公報）に記載の方法を用いることが可能である。
【００４１】
ステップ２３０）  設計情報のDB定義を取得し、DBテーブル変数を抽出し、テストケース記憶部１５のテストケースに対応付けて追加する。テストケース記憶部１５へのDBテーブル変数の追加の例を図１０に示す。
【００４２】
ステップ２４０）  設計情報の入力値定義を読み込み、入力変数と制約を抽出し、テストケース記憶部１５のテストケースに対応付けて、図１０に示すように追加する。図６の例では、中緑地名に対応する型、最小値、最大値を抽出し、これを図１０の入力変数として、テストケースに対応付けて追加する。
【００４３】
＜テストケースグルーピング部の処理（ステップ１３０）＞
次に、図７のステップ１３０のテストケースグルーピング部３０の処理について説明する。当該処理は、DB初期状態を使いまわすテストケース毎にグループ化し、テストケースグループ集合記憶部３５に格納するものである。
【００４４】
図１１は、本発明の一実施の形態におけるテストケースグルーピング部の詳細処理のフローチャートである。
【００４５】
ステップ６１０）  テストケースグルーピング部３０は、テストケース記憶部１５からテストケース集合を読み込む。
【００４６】
ステップ６２０）  空のテストケースグループ集合をテストケースグループ集合記憶部３５上に生成する。
【００４７】
ステップ６３０）  テストケースグループ集合記憶部３５に空の参照クエリテストケース集合を生成する。
【００４８】
ステップ６５０）  ステップ６１０で読み込んだテストケースをテストケースグループ集合記憶部３５の参照クエリテストケース集合に追加する。当該処理をテストケース集合の各テストケース全てに対して行う。
【００４９】
ステップ６５７）  ユーザから、参照クエリテストケースをまとめるためのグルーピングパラメータを取得する。
【００５０】
ステップ６６０）  グルーピングパラメータを元に、テストケースをグルーピングする。なお、本発明では、グルーピングパラメータは、参照クエリテストケースに対するものであり、他の更新クエリ等には適用されない。
【００５１】
具体的には、入力されたグルーピングパラメータが｛［１，２，３］，［４，５］｝であれば、ＩＤが１，２，３の参照クエリのテストケース群、ＩＤが４，５の参照クエリのテストケース群をそれぞれ一つのテストグループとしてまとめる。このとき、同じグループに属するテストケースの各SELECT文が抽出するレコードに重複がないようにまとめる。なお、入力されたグルーピングパラメータを用いることに限定されることなく、任意の技術を適用しても良い。
【００５２】
ステップ６８０）  テストグループに属するテストケースを任意に１つ選ぶ。なお、どのテストケースを選んでもDBテーブル変数群は同じである。
【００５３】
ステップ６９０）  選んだテストケースのDＢテーブル変数を複製して、テストケースグループのDBテーブル変数へ代入し、図１２に示すように、テストケースグループ集合記憶部３５のテストケースに追加する。なお、同図では、ユーザ入力パラメータの指定に基づいてテストケースをグルーピングする例である。
【００５４】
本発明では、上記のように、複数のテストケースをグルーピングすることにより、グループ化したテストケースが使いまわせるDB初期状態を生成するため、１つのテストケースに対して１つのDB初期状態を生成する従来技術よりもDB初期状態の入れ替え回数が少なくなる。
【００５５】
＜入力変数制約式生成部の処理（ステップ１４０）＞
次に、図７のステップ１４０の入力変数制約式生成部４０の処理について説明する。
【００５６】
図１３は、本発明の一実施の形態における入力変数制約式生成部の詳細処理のフローチャートである。下記に示す入力変数制約式の生成には従来技術を用いることができる。
【００５７】
ステップ８１０）  入力変数制約式生成部４０は、テストケースグループ集合記憶部３５からテストケースグループを読み込む。
【００５８】
ステップ８２０）  読み込んだテストケースの集合からテストケースを抽出する。
【００５９】
ステップ８３０）  抽出されたテストケースの各入力変数全てに対し、当該入力変数の定義域から制約式を生成する。詳しくは、入力変数をXとする。当該入力変数Xに対応する入力値定義の「整数定義域」の最小値（Min Value）、最大値(Max Value)を取得し、X≧Min Value、X≦Max Valueという制約式を新たに生成し、テストグループに対応付けてテストケースグループ集合記憶部３５の制約集合に追加する処理を入力変数の各入力変数に対して繰り返す。
【００６０】
ステップ８４０）  処理フロー図(図５参照)に含まれるガード条件と、テストグループ集合記憶部３５から取得したテストケースグループを入力とし、ガード条件の整数制約を、テストケースグループ集合記憶部３５のテストケースグループの制約集合に追加する。
【００６１】
＜レコード配置決定部の処理（ステップ１５０）＞
次に、図７のステップ１５０のレコード配置決定部５０の処理について説明する。
【００６２】
当該処理は、DBテーブルをレコード配置表にクエリと対応付けてレコード配置表を作成するものである。
【００６３】
図１４は、本発明の一実施の形態におけるレコード配置決定部の詳細処理のフローチャートである。
【００６４】
ステップ９１０）  レコード配置決定部５０は、テストグループ集合記憶部３５からテストケースグループを読み込む。
【００６５】
ステップ９２０）  テストケース記憶部１５からテストケースグループに含まれるテストケースのDB定義のDBテーブル変数を読み込む。
【００６６】
ステップ９３０）  SELECTクエリの「FROM Table ID」がDBテーブル変数のIDと一致している場合は、レコード配置表メモリ５５のテーブル(図１５の例では、テーブル変数＝「Table A」)にDBテーブル変数の参照クエリ群へSELECTクエリを追加する。
【００６７】
当該処理を、テストケースグループに属するテストケースの各SELECTクエリに対して繰り返す。
【００６８】
ステップ９４０）  DB変数の参照クエリ群における各クエリQ1，Q2，…，Qn，Qiの検索結果レコード件数(ResultRecordCount)をRiとおく。DBレコードの件数Rは、R1+R2+…+Rnとし、DBレコード変数をR個生成し、DBテーブル変数へ追加する。なお、検索結果レコード件数は、図５の処理フロー図のSELECTクエリが保持する「Result RecordCount」に対応する。
【００６９】
ステップ９５０）  メモリ（図示せず)上にレコード位置カウンタを生成し、０で初期化する。
【００７０】
ステップ９６０）  SELECTクエリをレコード配置表メモリ５５のレコード配置表のDBテーブル変数のレコード位置カウンタの箇所へ登録し、レコード位置カウンタを１インクリメントする。
【００７１】
詳しくは、DBテーブル変数の「レコード位置カウンタ」番目のDBレコード変数の参照クエリ群へSELECTクエリを追加し、テストケース毎に参照クエリ群にタグを付与する。タグは任意に設定可能であるが、例えば、テストケースIdを付与することが考えられる。その後、レコード位置カウンタを1インクリメントする。
【００７２】
上記の動作を、図１５を用いて説明する。Q1〜Q3のクエリはSELECTクエリであり、これらのSELECTクエリはDBテーブル変数「TableA」を参照している。Q4、Q5は、更新系クエリ変換部２０でSELECTクエリに変換された変換済み更新クエリである。検索結果レコード件数は、クエリQ1が１件、クエリQ2が２件、クエリQ3が３件であるため、この件数に沿って、１＋２＋３＝6件のレコードをレコード配置表メモリ５５に作成する。
【００７３】
例えば、クエリとして、
Q1：SELECT * from TableA WHERE … ResultCount==1
Q2：SELECT * from TableA WHERE … ResultCount==2
Q3：SELECT * from TalbeA WHERE … ResultCount==3
があるとする。この場合の、レコードの配置パターンは、
レコード位置カウンタ＝１：レコード[1] Q1が参照するレコード；
レコード位置カウンタ＝２：レコード[2] Q2が参照するレコード；
レコード位置カウンタ＝３：レコード[3] Q２が参照するレコード；
レコード位置カウンタ＝４：レコード[4] Q3が参照するレコード；
レコード位置カウンタ＝５：レコード[5] Q3が参照するレコード；
レコード位置カウンタ＝６：レコード[6] Q3が参照するレコード；
となる。
【００７４】
上記のSELECTクエリのレコード件数分の処理が終了したら、レコード配置表のDBテーブル変数（SELECTクエリ）をテストケースグループ集合記憶部３５に反映させる。
【００７５】
なお、上記ではレコード配置表メモリ５５のレコード配置表を用いているが、テストケースグループ集合記憶部３５のDBテーブル変数の各レコード変数が持つ参照クエリ群に直接設定することが可能である。例えば、DBレコード変数として、Record1、Record2があるとき、クエリQ1,Q2を設定する場合、Record1にはクエリQ1を設定し、Record2にはクエリQ1、Q2を設定することができる。
【００７６】
＜DBテーブル変数制約式生成部の処理（ステップ１６０）＞
次に、図７のステップ１６０のDBテーブル変数制約式生成部６０の処理について説明する。当該処理は、レコード配置決定部５０により更新されたテストケースグループ集合記憶部３５のDBテーブル変数から制約式を生成する。このとき、参照するレコードに対しては、WHERE句の条件に合うレコードを生成し、参照しないレコードに対してはWHERE句の条件に一致しないようにレコードを生成するための処理を行う。
【００７７】
図１６は、本発明の一実施の形態におけるDBテーブル変数制約式生成部の詳細処理のフローチャートである。
【００７８】
ステップ１０１０）  DBテーブル変数制約式生成部６０は、テストケースグループ集合記憶部３５からテストケースグループを読み込む。
【００７９】
ステップ１０２０）  読み込まれたテストケースグループ集合に含まれるテストケースを抽出し、当該テストケースのDBテーブル変数を読み込む。
【００８０】
ステップ１０３０）  DBテーブル変数のSELECTクエリのWHERE句条件群を複製する。
【００８１】
ステップ１０４０）  ステップ１０３０で複製されたWHERE句条件群に含まれる各「カラム参照」（図５の処理フロー図の「カラム参照」）を、当該「カラム参照」に対応するDBレコード変数のDBフィールド変数に置き換える。
【００８２】
ステップ１０５０）  SELECTクエリがDBレコード変数の参照クエリ群に含まれる場合には、複製クエリ条件群の論理否定を作成するため、「複製WHERE句条件群」を「NOT（複製WHERE句条件群）」へと変換し、新たな複製クエリ条件群とする。SELECTクエリが参照クエリ群に含まれない場合は当該処理をスキップする。
【００８３】
ステップ１０６０）  複製WHERE句条件群をテストケースグループ集合記憶部３５のテストケースグループの制約集合へ追加する。
【００８４】
ステップ１０７０）  テストケースグループ集合記憶部３５のDBテーブル変数において、対応するカラムの種類がPrimary KeyであるDBフィールド変数をF1,F2,…,Fnとする（ｎはDBレコード変数の件数となる）。「F1＜F2＜…Fn」というFi同士の一意性を保証するための制約式を生成し、テストケースグループ集合記憶部３５の制約集合へ追加する。
【００８５】
以下に、図１７を用いてDBテーブル変数制約式生成部６０の処理を説明する。
【００８６】
DBテーブル変数制約式生成部６０は、テーブルごとに参照クエリについて、確実に検索結果レコード件数（ResultRecordCount）で指定した件数を返すよう制約式を生成する。図１７（ａ）のPersonsテーブルと同図（ｂ）のテストケースグループ集合記憶部３５のDBテーブル変数（レコード配置表）を読み込んで、Personsテーブルの参照クエリ（SELECT）に対して、指定された検索結果レコード件数分の制約式を生成し、テストケースグループ集合記憶部３５の制約集合に追加する。同図の例において、クエリQ1：「SELECT  *FROM  Persons  WHERE  Id  <  10  ResultRecordCount  ==1については、同図（ｃ）に示すように、制約式として、Id[1]  Q1のWHERE句条件、「not  (Age[1].>=20)  not  (Q2のWHERE句条件)」を設定している。
【００８７】
DBテーブル変数制約式生成部６０は、上記で得られた制約式をテストケース集合記憶部３５に格納する。
【００８８】
上記のレコード配置決定部５０と、DBテーブル変数制約式生成部６０により、SELECT文毎に、自身が参照するレコードについては、WHERE句の条件に合うレコードを生成し、参照しないレコードはWHERE句の条件に一致しないようNOT  WHERE句としてレコードを生成する。これにより、直前のSELECT文の参照結果のレコード件数に応じて後続するSELECT文の実行を行うテストケースを試験するためのテストデータを生成することが可能となる。また、テストパス上の各参照アクセスで、予定した件数のレコードが過不足なく返ってくることが保証される。結果として、直前のSELECT文の参照結果のレコード件数に応じて後続するSELECT文の実行を行うテストケース（テストパス）を試験するためのテストデータを構成するDB初期状態を生成できる。
【００８９】
制約式解法部７０は、テストケース集合記憶部３５から制約式を読み込み、当該制約式に制約ソルバを適用することにより、テストケースの解を得て、テストケースグループ集合記憶部３５の各テーブル変数、各DBレコードのそれぞれのDBフィールド変数に対して追加する。
【００９０】
テストデータ出力部８０は、テストケースグループ集合記憶部３５からテストケースとテストデータを読み込み、テキスト形式でテストケースグループとテストパスを出力する。テストケースグループは、図１８に示すように、テストケースグループのデータとして、テストグループId、DBテーブル変数、テストケース（Id、フローId、テストパス）、DBテーブル変数（Id、DBレコード変数）、DBレコード変数（Id、インデックス、DBフィールド変数）、DBフィールド変数（Id、整数型変数入力）、変数（Id、整数型変数）、整数型変数（変数値）を含む。
【００９１】
なお、上記の図３に示すテストデータ生成装置の構成要素の動作をプログラムとして構築し、テストデータ生成装置として利用されるコンピュータにインストールして実行させる、または、ネットワークを介して流通させることが可能である。
【００９２】
本発明は、上記の実施の形態に限定されることなく、特許請求の範囲内において、種々変更・応用が可能である。
【符号の説明】
【００９３】
１  テストデータ生成装置
２  ユーザ端末
１０  テストケース抽出部
１５  テストケース記憶部
３０  テストケースグルーピング部
３５  テストケースグループ集合記憶部
４０  入力変数制約式生成部
５０  レコード配置決定部
５５  レコード配置表メモリ
６０  DBテーブル変換制約式生成部
７０  制約式解法部
８０  テストデータ出力部
【図１】
0005523526.tif 000002
【図２】
0005523526.tif 000003
【図３】
0005523526.tif 000004
【図４】
0005523526.tif 000005
【図５】
0005523526.tif 000006
【図６】
0005523526.tif 000007
【図７】
0005523526.tif 000008
【図８】
0005523526.tif 000009
【図９】
0005523526.tif 000010
【図１０】
0005523526.tif 000011
【図１１】
0005523526.tif 000012
【図１２】
0005523526.tif 000013
【図１３】
0005523526.tif 000014
【図１４】
0005523526.tif 000015
【図１５】
0005523526.tif 000016
【図１６】
0005523526.tif 000017
【図１７】
0005523526.tif 000018
【図１８】
0005523526.tif 000019