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