(57)【要約】【課題】  プログラムのバグを発生させている可能性の高いレコードを表示する。【解決手段】  設計情報から抽出されたテストケースのDELETE、INSERT，UPDATEクエリをSELECTクエリに変換し、同じグループに属するテストケースの各SELECT文が抽出するレコードに重複がないようにテストケースグループとしてグルーピングし、該テストケースグループの各テストケースの情報を取得して、該テストケースの入力変数の制約式を生成し、DBテーブル変数を取得し、該レコード件数分のDBレコード変数を生成し、該レコード配置表の該レコード位置カウンタの箇所に、グループ毎にテストケースとSELECTクエリにタグを付与する。テストケースグループの制約式を任意の解法を用いて解き、テストケース毎の入力値と、DB初期状態と共に、テストケースとSELECTクエリにタグを付与して出力する。【選択図】  図１５
2014056306.tif 000002
【特許請求の範囲】
【請求項１】
プログラムのバグを発生させているレコードを提示可能にするためのDBデータデバッグ支援装置であって、
入力された設計情報からテストケースを抽出し、テストケース記憶手段に格納すると共に、該設計情報を設計情報記憶手段に格納するテストケース抽出手段と、
前記テストケース記憶手段からテストケースを読み込み、テストパスで最後に出現するクエリの種類が更新クエリである場合は、該クエリの種類に応じた条件に基づいて該更新クエリを参照クエリに変換し、該テストケース記憶手段に格納する更新系クエリ変換手段と、
前記テストケース記憶手段から前記テストケースを読み出し、同じDB初期状態を共有可能なテストケースを、同じグループに属するテストケースの各SELECT文が抽出するレコードに重複がないようにテストケースグループとしてグルーピングし、テストケースグループ集合記憶手段に格納するテストケースグルーピング手段と、
前記テストケースグループ集合記憶手段から前記テストケースグループを読み出し、該テストケースグループの各テストケースの情報を前記テストケース記憶手段から取得して、該テストケースの入力変数の制約式を生成し、該テストケースが含まれるテストケースグループ集合記憶手段の制約集合に格納する入力変数制約式生成手段と、
前記テストケースグループ集合記憶手段から前記テストケースグループを取得し、該テストケースグループに含まれるテストケースのDBテーブル変数のレコード件数を決定し、これをレコード配置表のレコード位置カウンタとし、該レコード件数分のDBレコード変数を生成し、該レコード位置カウンタの箇所に、該テストケースグループ集合記憶手段の該DBレコード変数の参照クエリ群のSELECTクエリを追加し、テストケース及びクエリにタグを付与するレコード配置決定手段と、
前記テストケースグループ集合記憶手段の前記DBレコード変数について、一意性を保証する制約式を生成し、前記テストケースグループ集合記憶手段に格納するDB変換制約式生成手段と、
前記テストケースグループ集合記憶手段に格納された前記制約式を、任意の解法を用いて解き、テストデータの具体的な値を得る制約式解法手段と、
前記テストケースグループ集合記憶手段からテストケースを共有するDB初期状態のテストデータを取得し、テストケース及びクエリにタグを付与して、該テストケースの抽出元となった前記設計情報の処理フローIDに対応付けて出力するテストデータ出力手段と、
を有することを特徴とするDBデータデバッグ支援装置。
【請求項２】
前記テストケースグルーピング手段は、
グルーピング対象のテストケースから任意に1つのテストケースを選択し、選択されたテストケースのDBテーブル変数を、前記テストケースグループのDBテーブル変数に代入する手段を含む
請求項1記載のDBデータデバッグ支援装置。
【請求項３】
前記レコード配置決定手段は、
前記タグとして、前記DBレコード変数から取得した、少なくとも前記テストケースIDを付与する
手段を含む
請求項1記載のDBデータデバッグ支援装置。
【請求項４】
前記DB変換制約式生成手段は、
前記レコード配置表の前記DBレコード変数のSELECT文が参照するWHERE句の条件に合うレコードを生成し、参照しないレコードはWHERE句の条件に一致しないようにレコードを生成する手段を含む
請求項1記載のDBデータデバッグ支援装置。
【請求項５】
プログラムのバグを発生させているレコードを提示可能にするためのDBデータデバッグ支援方法であって、
テストケース記憶手段、テストケースグループ集合記憶手段、テストケース抽出手段、更新系クエリ変換手段、テストケースグルーピング手段、レコード配置決定手段、DB変換制約式生成手段、制約式解法手段、テストデータ出力手段を有する装置において、
前記テストケース抽出手段が、入力された設計情報からテストケースを抽出し、テストケース記憶手段に格納するとともに、該設計情報を設計情報記憶手段に格納するテストケース抽出ステップと、
前記更新系クエリ変換手段が、前記テストケース記憶手段からテストケースを読み込み、テストパスで最後に出現するクエリの種類が更新クエリである場合は、該クエリの種類に応じた条件に基づいて該更新クエリを参照クエリに変換し、該テストケース記憶手段に格納する更新系クエリ変換ステップと、
前記テストケースグルーピング手段が、前記テストケース記憶手段から前記テストケースを読み出し、同じDB初期状態を共有可能なテストケースを、同じグループに属するテストケースの各SELECT文が抽出するレコードに重複がないようにテストケースグループとしてグルーピングし、テストケースグループ集合記憶手段に格納するテストケースグルーピングステップと、
前記入力変数制約式生成手段が、前記テストケースグループ集合記憶手段から前記テストケースグループを読み出し、該テストケースグループの各テストケースの情報を前記テストケース記憶手段から取得して、該テストケースの入力変数の制約式を生成し、該テストケースが含まれるテストケースグループ集合記憶手段の制約集合に格納する入力変数制約式生成ステップと、
前記レコード配置決定手段が、前記テストケースグループ集合記憶手段から前記テストケースグループを取得し、該テストケースグループに含まれるテストケースのDBテーブル変数のレコード件数を決定し、これをレコード配置表のレコード位置カウンタとし、該レコード件数分のDBレコード変数を生成し、該レコード位置カウンタの箇所に、該テストケースグループ集合記憶手段の該DBレコード変数の参照クエリ群のSELECTクエリを追加し、テストケース及びクエリにタグを付与するレコード配置決定ステップと、
前記DB変換制約式生成手段が、前記テストケースグループ集合記憶手段の前記DBレコード変数について、一意性を保証する制約式を生成し、前記テストケースグループ集合記憶手段に格納するDB変換制約式生成ステップと、
前記制約式解法手段が、前記テストケースグループ集合記憶手段に格納された前記制約式を、任意の解法を用いて解き、テストデータの具体的な値を得る制約式解法ステップと、
前記テストデータ出力手段が、前記テストケースグループ集合記憶手段からテストケースを共有するDB初期状態のテストデータを取得し、テストケース及びクエリにタグを付与して、処理フローIDに対応付けて出力するテストデータ出力ステップと、
を行うことを特徴とするDBデータデバッグ支援方法。
【請求項６】
前記テストケースグルーピングステップにおいて、
グルーピング対象のテストケースから任意に1つのテストケースを選択し、選択されたテストケースのDBテーブル変数を、前記テストケースグループのDBテーブル変数に代入する
請求項５記載のDBデータデバッグ支援方法。
【請求項７】
前記レコード配置決定ステップにおいて、
前記タグとして、前記DBレコード変数から取得した、少なくとも前記テストケースIDを付与する
請求項５記載のDBデータデバッグ支援方法。
【請求項８】
前記DB変換制約式生成ステップにおいて、
前記レコード配置表の前記DBレコード変数のSELECT文が参照するWHERE句の条件に合うレコードを生成し、参照しないレコードはWHERE句の条件に一致しないようにレコードを生成する
請求項５記載のDBデータデバッグ支援方法。
【請求項９】
コンピュータを、
請求項1乃至４のいずれか1項に記載のDBデータデバッグ支援装置の各手段として機能させるためのDBデータデバッグ支援プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、DB(データベース)データデバッグ支援装置及び方法及びプログラムに係り、特に、DBのデータに対し、プログラムのバグを発生させているレコードを提示可能にするためのDBデータデバッグ支援装置及び方法及びプログラムに関する。
【背景技術】
【０００２】
データベースに格納されているデータの読み出しの操作を伴うような機能性テストのためのテストデータ生成技術として以下のようなものがある。なお、ここで、テストデータとは、データベースの初期状態（以下、「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データデバッグ支援装置であって、
入力された設計情報からテストケースを抽出し、テストケース記憶手段に格納すると共に、該設計情報を設計情報記憶手段に格納するテストケース抽出手段と、
前記テストケース記憶手段からテストケースを読み込み、テストパスで最後に出現するクエリの種類が更新クエリである場合は、該クエリの種類に応じた条件に基づいて該更新クエリを参照クエリに変換し、該テストケース記憶手段に格納する更新系クエリ変換手段と、
前記テストケース記憶手段から前記テストケースを読み出し、同じDB初期状態を共有可能なテストケースを、同じグループに属するテストケースの各SELECT文が抽出するレコードに重複がないようにテストケースグループとしてグルーピングし、テストケースグループ集合記憶手段に格納するテストケースグルーピング手段と、
前記テストケースグループ集合記憶手段から前記テストケースグループを読み出し、該テストケースグループの各テストケースの情報を前記テストケース記憶手段から取得して、該テストケースの入力変数の制約式を生成し、該テストケースが含まれるテストケースグループ集合記憶手段の制約集合に格納する入力変数制約式生成手段と、
前記テストケースグループ集合記憶手段から前記テストケースグループを取得し、該テストケースグループに含まれるテストケースのDBテーブル変数のレコード件数を決定し、これをレコード配置表のレコード位置カウンタとし、該レコード件数分のDBレコード変数を生成し、該レコード位置カウンタの箇所に、該テストケースグループ集合記憶手段の該DBレコード変数の参照クエリ群のSELECTクエリを追加し、テストケース及びクエリにタグを付与するレコード配置決定手段と、
前記テストケースグループ集合記憶手段の前記DBレコード変数について、一意性を保証する制約式を生成し、前記テストケースグループ集合記憶手段に格納するDB変換制約式生成手段と、
前記テストケースグループ集合記憶手段に格納された前記制約式を、任意の解法を用いて解き、テストデータの具体的な値を得る制約式解法手段と、
前記テストケースグループ集合記憶手段からテストケースを共有するDB初期状態のテストデータを取得し、テストケース及びクエリにタグを付与して、該テストケースの抽出元となった前記設計情報の処理フローIDに対応付けて出力するテストデータ出力手段と、を有する。
【００１０】
また、本発明（請求項２）は、前記テストケースグルーピング手段において、
グルーピング対象のテストケースから任意に1つのテストケースを選択し、選択されたテストケースのDBテーブル変数を、前記テストケースグループのDBテーブル変数に代入する手段を含む。
【００１１】
また、本発明（請求項３）は、前記レコード配置決定手段において、
前記タグとして、前記DBレコード変数から取得した、少なくとも前記テストケースIDを付与する手段を含む。
【００１２】
また、本発明（請求項４）は、前記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では検索結果レコードカウントが２となる例である。テストケース２は、１回の参照アクセスが行われ、C３の条件分岐により検索結果レコードカウントが１となる例である。これらの設計情報から同図右側に示すように、各テストケースが使用するDB定義テーブル（Personsテーブル）に対応するレコード配置表上において、テストケース毎に使用するレコードに重複がないようレコードを生成し、各レコードにはどのテストケース、どのクエリで使用されているかを示すためにタグを付与する。このようにすることで、バグを発生させている可能性の高いレコードを表示することが可能となる。
【００１９】
図３は、本発明の一実施の形態におけるテストデータ生成装置の構成を示す。
【００２０】
同図に示すテストデータ生成装置１は、テストケース抽出部１０、更新系クエリ変換部２０、テストケースグルーピング部３０、入力変数制約式生成部４０、レコード配置決定部５０、DBテーブル変換制約式生成部６０、制約式解法部７０、テストデータ出力部８０、テストケース記憶部１５、テストケースグループ集合記憶部３５、レコード配置表メモリ５５、設計情報記憶部８５から構成される。テストケース記憶部１５、テストケースグループ集合記憶部３５、レコード配置表メモリ５５、設計情報記憶部８５は、ハードディスクやメモリ等の記憶媒体である。また、レコード配置表メモリ５５は、レコード配置決定部５０の外部に設けているが、この例に限定されることなく、レコード配置決定部５０内に具備してもよい。
【００２１】
まず、端末２からテストデータ生成装置１に入力されるデータについて説明する。
【００２２】
図４〜図６は、本発明の設計情報の例を示す。
【００２３】
図４は、本発明の一実施の形態における入力されるＤＢ定義の例である。
【００２４】
DB定義（Personsテーブル）は、DBテーブルID、DBレコードのカラム、カラムID（String型と定義域、カラムの種類（Normal/Primary Key））、型と定義域、整数定義域、カラムの種類等が定義されている。
【００２５】
図５は、本発明の一実施の形態における入力されるテストケース（経路）の例である。同図（A）に示す処理フロー図は、処理内容を示すノードと、ある処理から次の処理への遷移を示すエッジからなり、処理フローID、ノードID、ノード内容、クエリ（SELECT，UPDATE，INSERT，DELETE)、カラムと設定値、WHERE句条件群、次ノード接続エッジ群、エッジID、ガード条件、整数制約、整数算術式、整数項、整数比較演算子、整数因子、カラム参照、変数参照等が規定されている。
【００２６】
図６は、本発明の一実施の形態における入力される入力値定義の例である。
【００２７】
入力値定義は、入力値と、その入力値のString型と定義域を含む。
【００２８】
上記の構成における処理を説明する。
【００２９】
図７は、本発明の一実施の形態におけるテストデータ生成装置の概要動作のフローチャートである。
【００３０】
ステップ１１０）  テストケース抽出部１０は、端末２から入力された設計情報（XML形式）から、テストケースを抽出し、テストケース記憶部１５に格納する。更に、入力された設計情報（処理フロー図）を、設計情報記憶部８５に格納する。詳細な動作は図９で詳述する。
【００３１】
ステップ１２０）  更新系クエリ変換部２０は、テストケース記憶部１５からテストケースを取得し、テストパスにおける更新系クエリを参照クエリ（変換済み更新クエリ）へと変換する。詳細な動作は図１０で詳述する。
【００３２】
ステップ１３０）  テストケースグルーピング部３０は、ステップ１１０で抽出されたテストケースをテストケース記憶部１５から読み込み、同じDB初期状態を使い回すテストケースをテストケースグループとしてグルーピングし、テストケースグループ集合記憶部３５に格納する。テストケースグループ集合記憶部３５には、図８に示すように、テストケースグループID（テストケース＋制約集合、DBテーブル変数）毎に、テストケース記憶部１５から取得したテストケースが格納される。テストケースは、テストケースId，FlowId、（テストパス、変換済み更新クエリ）、制約集合、DBテーブル変数、DBフィールド変数、参照群クエリ（SELECTクエリ）、入力変数、整数型変数を含む。
【００３３】
なお、本実施の形態では、ユーザ入力された、参照クエリについてグルーピングするためのパラメータに基づいて、参照クエリ（SELECT）のみについてグルーピングを行うものとする。また、変換済み更新クエリについては、１テストケースにつき、１テストケースグループとする。詳細な動作は図１２で詳述する。
【００３４】
ステップ１４０）  入力変数制約式生成部４０は、テストケースグループ集合記憶部３５からテストケースグループを取得し、当該テストケースグループに含まれるテストケースを取得し、当該テストケースの入力変数から制約式を生成し、テストケースグループ集合記憶部３５のテストケースグループ毎の制約集合へ追加する。当該処理を取得した全テストケースについて繰り返す。詳細な処理は図１３で詳述する。
【００３５】
ステップ１５０）  レコード配置決定部５０は、テストケースグループ集合記憶部３５からテストケースグループを読み込み、当該テストケースグループに含まれるテストケースのDBテーブル変数を抽出する。DBテーブル変数に基づいて、レコード配置及び、レコードの件数を決定し、レコード配置表メモリ５５上にレコード配置表を生成する。このとき、SELECTクエリのIDと当該SELECTクエリが存在するテストパスの属する少なくともテストケースのIDを取り出し、タグとして付与し、図８に示すようにテストケースグループ集合記憶部３５に格納する。なお、図８に示すように、テストケースＩＤに加えて、フローIDに対応付けてクエリIDも付与するようにしてもよい。当該処理を行うことで、テストデータ出力部８０において、テストデータ出力時にタグ付与してテストデータを表示装置（図示せず）に出力するため、テストケースが参照したレコードを知ることができる。詳細な処理は図１４で詳述する。
【００３６】
ステップ１６０）  DBテーブル変数制約式生成部６０は、テストケースグループ集合記憶部３５のテストケース毎に、DBテーブル変数の各DBフィールド変数に関する制約式を生成し、テストケースグループ集合記憶部３４のテストケースグループの制約集合へ追加する。加えて、各テストケースの入力変数に関する制約式も生成し、同様に制約集合へ追加する。詳細な処理は図１６で詳述する。
【００３７】
ステップ１７０）  制約式解法部７０は、テストケースグループ集合記憶部３５のテストケースグループの制約集合を読み出して、制約式を取り出し、連立不等式を解き、ランダムに解を一つ得る。なお、連立不等式の解をとるために、既存の制約ソルバ(Trends in constraint Programming (Frederic Benhamou et. al., Wiley-ISTE, 1905209975, 2007)を用いる。
【００３８】
ステップ１８０）  テストデータ出力部８０は、テストケースグループ集合記憶部３５から図８に示すようなテストケースグループを読み出し、当該テストケースグループに含まれるテストケースを抽出し、テストケース毎の入力値と、テストケースで使いまわすDB初期状態値１つを、このテストケースグループの使用するテストデータとしてまとめ、出力する。このとき、テストデータグループ集合記憶部３５では、テストケースのDBフィールド変数に、テストケースId、クエリIdをタグとして保持しているため、これらのタグと、これらのタグ（ID）の抽出元となった設計情報記憶部８５に格納されている処理フロー図の「処理フローID」と対応付けて、出力する。
【００３９】
以下に、上記の図７の各ステップの動作を詳細に説明する。
【００４０】
＜テストケース抽出部の処理（ステップ１１０）＞
次に、図７のステップ１１０のテストケース抽出部１０の処理について説明する。
【００４１】
図９は、本発明の一実施の形態におけるＳ１１０の詳細処理のフローチャートである。
【００４２】
ステップ２１０）  テストケース抽出部１０は、入力された設計情報の処理フロー図からテストパスを抽出する。例えば、図５の例では、分岐条件C1カバレッジを満たすよう、全てのテストパスを抽出する。
【００４３】
ステップ２２０）  次に、抽出されたテストパスから当該テストパスを持つテストケースを作成し、テストケース記憶部１５に格納する。テストケースの作成方法としては、処理フロー図から抽出したそれぞれのパスに対応するテストケース（抽出した１本のパスが１テストケースとなる）を抽出するための特許文献１（特許4966386号公報）に記載の方法を用いることが可能である。
【００４４】
ステップ２３０）  設計情報のDB定義を取得し、DBテーブル変数を抽出し、テストケース記憶部１５のテストケースに追加する。
【００４５】
ステップ２４０）  設計情報の入力値定義を読み込み、入力変数と制約を抽出し、テストケース記憶部１５のテストケースに追加する。図６の例では、入力値名に対応する型、最小値、最大値を抽出する。
【００４６】
ステップ２５０）  ステップ２１０で読み込んだ設計情報（処理フロー図）を設計情報記憶部８５に格納する。
【００４７】
＜更新系クエリ更新部の処理（ステップ１２０）＞
次に、図７のステップ１２０の更新系クエリ更新部２０の処理について説明する。
【００４８】
図１０は、本発明の一実施の形態における更新系クエリ更新部の詳細処理のフローチャートである。
【００４９】
ステップ３１０）  テストケース記憶部１５からテストケースを読み込む。
【００５０】
ステップ３２０）  テストケースのテストパスにおいて、終端に存在するクエリを得る。
【００５１】
ステップ３３０）  当該ステップでは、レコード挿入後の一意性保証のための参照クエリを生成する。具体的には、ステップ３２０で得られた終端のクエリがINSERTクエリである場合は、当該INSERTクエリからInto TableId、カラムが主キーである「カラムと設定値」からcolumnId, SetValueを取り出し複製し、copiedInto TableId, copiedColumnId, copiedSetValueとする。これらを用いて
「SELECT * FROM copiedInto TableId WHERE copiedColumnId = copiedSetValue, ResultCount = 0」
というSELECTクエリを新しく作成し、これを変換済み更新クエリとする。
【００５２】
ステップ３４０）  当該ステップでは、更新対象のレコードの存在を保証するための参照クエリを生成する。具体的には、ステップ３２０で得られた終端のクエリがUPDATEクエリである場合は、当該UPDATEクエリから、TableId, WHERE句条件群を取り出し複製し、copiedTableId, copiedWhere句条件群とする。それらを用いて
「SELECT * FROM copiedTableId WHERE copiedWhere句条件群」
というSELECTクエリを新しく作成し、これを変換済み更新クエリとする。
【００５３】
ステップ３５０）  当該ステップでは、レコード更新語の一意性保証のための参照クエリを生成する。具体的には、ステップ３２０で得られた終端のクエリがUPDATEクエリとする。UPDATEクエリから、TableId、カラムが主キーである「カラムと設定値」からColumnId,SetValueを取り出し複製し、copiedTableId,copiedColumnId, copiedSetValueとする。それらを用いて
「SELECT * FROM copiedInto TableId WHERE copiedClumnId = copiedSetValue, ResultCount = 0」
というSELECTクエリを新しく作成し、これを変換済み更新クエリとする。
【００５４】
ステップ３６０）  当該ステップでは、削除対象のレコードの存在を保証するための参照クエリを生成する。具体的には、ステップ３２０で得られたクエリがDELETEクエリである場合は、該DELETEクエリから、TableId, Where句条件群を取り出し複製し、copiedTableId, copiedWhere句条件群とする。それらを用いて
「SELECT * FROM copiedTAbleId WHERE copiedWhere句条件群」
というSELECTクエリを新しく作成し、これを変換済み更新クエリとする。
【００５５】
ステップ３７０）  上記の各ステップで新規作成された参照クエリを変換済み更新クエリとしてテストケースグループ集合記憶部３５のテストケースの「変換済み更新クエリ」へ追加する。なお、ステップ３４０から遷移してきた場合には、２つの変換済み更新クエリが入力となる。
【００５６】
図１１に上記の更新系クエリから参照系クエリへの変換の例を示す。
【００５７】
INSERTクエリは、同図（A）に示すようにSELECTクエリに変換する。変換する場合には、主キーが重複するとエラーになってしまうため、INSERTするレコードと同じ主キー値を持つレコードが、DB初期状態に存在しないことを保証することを条件とする。
【００５８】
UPDATEクエリは、同図（Ｂ）に示すようにSELECTクエリに変換する。変換する場合には、UPDATE対象のレコードが１件存在することを条件とする。当該条件を設定することで、必ずDB更新が行われる。また、主キーが重複するとエラーとなるため、UPDATEしたレコードと同じキー値を持つレコードが、DB初期状態に存在しないことを条件とする。これにより必ずDB更新が行われる。
【００５９】
DELETEクエリは、同図（C）に示すように、SLELECTクエリに変換する。変換する場合には、DELETE対象のレコードが１件存在することを条件とすることで、必ずDB更新が行われる。
【００６０】
＜テストケースグルーピング部の処理（ステップ１３０）＞
次に、図７のステップ１３０のテストケースグルーピング部３０の処理について説明する。当該処理は、DB初期状態を使いまわすテストケース毎にグループ化し、テストケースグループ集合記憶部３５に格納するものである。
【００６１】
図１２は、本発明の一実施の形態におけるテストケースグルーピング部の詳細処理のフローチャートである。
【００６２】
ステップ６１０）  テストケースグルーピング部３０は、テストケース記憶部１５からテストケース集合を読み込む。
【００６３】
ステップ６２０）  空のテストケースグループ集合をテストケースグループ集合記憶部３５上に生成する。
【００６４】
ステップ６３０）  テストケースグループ集合記憶部３５に空の参照クエリテストケース集合を生成する。
【００６５】
ステップ６４０）  テストケースグループ集合記憶部３５に、空の更新クエリテストケース集合を作成する。
【００６６】
ステップ６５０）  ステップ６１０で読み込んだテストケースをテストケースグループ集合記憶部３５の参照クエリテストケース集合に追加する。当該処理をテストケース集合の各テストケース全てに対して行う。
【００６７】
ステップ６５５）  テストケースをテストケースグループ集合記憶部３５の更新クエリテストケース集合へ追加する。
【００６８】
ステップ６５７）  ユーザから、参照クエリテストケースをまとめるためのグルーピングパラメータを取得する。
【００６９】
ステップ６６０）  グルーピングパラメータを元に、テストケースをグルーピングする。
【００７０】
ステップ６７０）  更新クエリテストケース集合とテストケースグループ集合を取得し、1テストケースにつき、1テストケースグループとしてまとめ、テストケースグループ集合記憶部３５のテストケースグループ集合へ追加する。
【００７１】
ステップ６８０）  テストグループに属するテストケースを任意に１つ選ぶ。なお、どのテストケースを選んでもDBテーブル変数群は同じである。
【００７２】
ステップ６９０）  選んだテストケースのDＢテーブル変数を複製して、テストケースグループのDBテーブル変数へ代入し、テストケースグループ集合記憶部３５のテストケースに追加する。
【００７３】
本発明では、上記のように、複数のテストケースをグルーピングすることにより、グループ化したテストケースが使いまわせるDB初期状態を生成するため、１つのテストケースに対して１つのDB初期状態を生成する従来技術よりもDB初期状態の入れ替え回数が少なくなる。
【００７４】
＜入力変数制約式生成部の処理（ステップ１４０）＞
次に、図７のステップ１４０の入力変数制約式生成部４０の処理について説明する。
【００７５】
図１３は、本発明の一実施の形態における入力変数制約式生成部の詳細処理のフローチャートである。
【００７６】
ステップ８１０）  入力変数制約式生成部４０は、テストケースグループ集合記憶部３５からテストケースグループを読み込む。
【００７７】
ステップ８２０）  テストケースグループに含まれるテストケースを抽出する。
【００７８】
ステップ８３０）  抽出されたテストケースの各入力変数全てに対し、当該入力変数の定義域から制約式を生成する。詳しくは、入力された入力変数をXとする。当該入力変数Xに対応する入力値定義の「整数定義域」の最小値（Min Value）、最大値(Max Value)を取得し、X≧Min Value、X≦Max Valueという制約式を新たに生成し、テストグループに対応付けてテストケースグループ集合記憶部３５の制約集合に追加する。当該処理を入力変数の各入力変数に対して繰り返す。
【００７９】
ステップ８４０）  処理フロー図(図５参照)に含まれるガード条件と、テストグループ集合記憶部３５から取得したテストケースグループを入力とし、ガード条件の整数制約を、テストケースグループ集合記憶部３５のテストケースグループの制約集合に追加する。
【００８０】
＜レコード配置決定部の処理（ステップ１５０）＞
次に、図７のステップ１５０のレコード配置決定部５０の処理について説明する。
【００８１】
当該処理は、DBテーブルをクエリと対応付けてメモリ上にレコード配置表を作成するものである。
【００８２】
図１４は、本発明の一実施の形態におけるレコード配置決定部の詳細処理のフローチャートである。
【００８３】
ステップ９１０）  レコード配置決定部５０は、テストグループ集合記憶部３５からテストケースグループを読み込む。
【００８４】
ステップ９２０）  テストケースグループに含まれるテストケースを抽出し、当該ＤＢ定義のＤＢテーブル変数を抽出する。
【００８５】
ステップ９３０）  SELECTクエリの「FROM Table ID」がDBテーブル変数のIDと一致している場合は、DBテーブル(図１２の例では「Table A」)のDBテーブル変数の参照クエリ群へSELECTクエリを追加する。
【００８６】
当該処理を、テストケースグループに属するテストケースの各SELECTクエリに対して繰り返す。
【００８７】
ステップ９４０）  DBテーブルのDB変数の参照クエリ群における各クエリQ1，Q2，…，Qn，Qiに定義されている検索結果レコード件数(Result Record Count)をRiとおく。DBレコードの件数Rを、R1+R2+…+Rnとし、DBレコード変数をR個生成し、DBテーブル変数へ追加する。
【００８８】
ステップ９５０）  レコード配置表メモリ５５上にレコード位置カウンタを生成し、０で初期化する。
【００８９】
ステップ９６０）  SELECTクエリをレコード配置表メモリ５５のレコード配置表のDBテーブル変数のレコード位置カウンタの箇所へ登録し、レコード位置カウンタを１インクリメントする。
【００９０】
詳しくは、DBテーブル変数の「レコード位置カウンタ」番目のDBレコード変数の参照クエリ群へSELECTクエリを追加し、テストケース毎に参照クエリ群にタグを付与する。タグは任意に設定可能であるが、例えば、テストケースIdを付与することが考えられる。その後、レコード位置カウンタを1インクリメントする。
【００９１】
上記の動作を、図１５を用いて説明する。Q1〜Q3のクエリはSELECTクエリであり、これらのSELECTクエリはDBテーブル変数「TableA」を参照している。Q4、Q5は、更新系クエリ変換部２０でSELECTクエリに変換された変換済み更新クエリである。検索結果レコード件数は、クエリQ1が１件、クエリQ2が２件、クエリQ3が３件、クエリQ4が１件、クエリQ5が１件であるため、この件数に沿って、１＋２＋３＋１＋１＝８件のレコードをレコード配置表に作成する。
【００９２】
上記のSELECTクエリに定義されている検索結果レコード件数分の処理が終了したら、最終的に、レコード配置表のレコード位置カウンタとDBテーブル変数（SELECTクエリ）をレコード配置表メモリ５５に出力する。このとき、
例えば、クエリとして、
G1：Q1：SELECT * from TableA WHERE … ResultCount==1
G1：Q2：SELECT * from TableA WHERE … ResultCount==2
G1：Q3：SELECT * from TalbeA WHERE … ResultCount==3
G2：Q4：SELECT * from TableA WHERE … ResultCount==1（変換済み更新クエリ）
G3：Q5：SELECT * from TableA WHERE … ResultCount==2（変換済み更新クエリ）
があるとする。但し、G1、G2、G3は、テストケースグルーピング部３０においてグルーピングされたグループを示す。この場合の、レコードの配置パターンは、
レコード位置カウンタ＝１：レコード[1] Q1が参照するレコード；
レコード位置カウンタ＝２：レコード[2] Q2が参照するレコード；
レコード位置カウンタ＝３：レコード[3] Q２が参照するレコード；
レコード位置カウンタ＝４：レコード[4] Q3が参照するレコード；
レコード位置カウンタ＝５：レコード[5] Q3が参照するレコード；
レコード位置カウンタ＝６：レコード[6] Q3が参照するレコード；
レコード位置カウンタ＝５：レコード[7] Q4が参照するレコード；
レコード位置カウンタ＝６：レコード[8] Q5が参照するレコード；
となる。さらに、テストケース毎にタグを付与する。例えば、クエリQ1、Q2は、テストケース１、Q3はテストケース２、Q4はテストケース３、Q5はテストケース４を使用している場合に、クエリQ,1,Q2には、タグとして"T1"、Q3には"T2"、Q4には"T3",
Q5には"T4"をそれぞれ付与する。付与するタグは、例えば、テストケースID、クエリIDの組とする。
【００９３】
ステップ９７０）  レコード配置表メモリ５５からレコード配置表を読み出して、テストケースグループ集合記憶部３５のDBレコード変数を更新する。
【００９４】
具体的には、レコード配置表からSELECTクエリ、レコード位置カウンタ、DBテーブル変数を抽出し、テストケースグループ集合記憶部３５に含まれるテストケースのDBテーブル変数の「レコード位置カウンタ」番目のDBレコード変数をXとする。SELECTクエリのIdと、SELECTクエリが存在するテストパスの属するテストケースのIdをレコード配置表から取り出し、XのQuervId、TestCaseIdにそれぞれ代入し、テストケースグループ集合記憶部３５を更新する。当該QuervId、TestCaseIdはタグとして用いられるものである。これにより、テストデータ出力部８０では、テストケースグループ集合記憶部３５からタグとして、QuervId、TestCaseIdを読み出して、抽出元となった処理フローの処理フローIDと対応付けて出力することができる。
【００９５】
＜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テーブル変換制約式生成部６０は、テストケースグループ集合記憶部３５のテストケースについて、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（TestCaseId）、及びクエリID（QuervId）を抽出し、設計情報記憶部８５に格納されているフロー図の処理フローIDとを対応付けて、例えば、図１８に示すようなイメージで出力する。図１８の例では、生成したテストデータ（DB初期状態）の核レコードに、レコードを使用したクエリのID及びテストケースのID、テストケースの抽出元である処理フローのIDをレコード情報と併記して表示するものである。図１９に、テストデータの構成例を示す。テストデータとして、テストケースグループのId、テストケース、DBテーブル変数、テストケース（Id、テストパス、DBテーブル変数、入力変数）、DBテーブル変数（Id、DBレコード変数）、DBレコード変数（Id、整数型変数、フローId）、DBフィールド変数（Id、整数型変数、フローId）、入力変数（Id、整数型変数）、整数型変数（値）を出力する。
【０１０９】
なお、上記の図３に示すテストデータ生成装置の構成要素の動作をプログラムとして構築し、テストデータ生成装置として利用されるコンピュータにインストールして実行させる、または、ネットワークを介して流通させることが可能である。
【０１１０】
本発明は、上記の実施の形態に限定されることなく、特許請求の範囲内において、種々変更・応用が可能である。
【符号の説明】
【０１１１】
１  テストデータ生成装置
２  ユーザ端末
１０  テストケース抽出部
１５  テストケース記憶部
２０  更新系クエリ更新部
３０  テストケースグルーピング部
３５  テストケースグループ集合記憶部
４０  入力変数制約式生成部
５０  レコード配置決定部
５５  レコード配置表メモリ
６０  DBテーブル変換制約式生成部
７０  制約式解法部
８０  テストデータ出力部
【図１】
2014056306.tif 000003
【図２】
2014056306.tif 000004
【図３】
2014056306.tif 000005
【図４】
2014056306.tif 000006
【図５】
2014056306.tif 000007
【図６】
2014056306.tif 000008
【図７】
2014056306.tif 000009
【図８】
2014056306.tif 000010
【図９】
2014056306.tif 000011
【図１０】
2014056306.tif 000012
【図１１】
2014056306.tif 000013
【図１２】
2014056306.tif 000014
【図１３】
2014056306.tif 000015
【図１４】
2014056306.tif 000016
【図１５】
2014056306.tif 000017
【図１６】
2014056306.tif 000018
【図１７】
2014056306.tif 000019
【図１８】
2014056306.tif 000020
【図１９】
2014056306.tif 000021