(57)【特許請求の範囲】
【請求項１】
データベース（DB）に格納されているデータの読み出し操作を伴う機能性テストを実施するためのテストデータを生成するテストデータ生成装置であって、
テストケースを格納するテストケース記憶手段と、
設計情報として、ソフトウェアの入力値の定義域を表す入力値定義、ソフトウェアの処理の流れを表す処理フロー図、データベースの設計情報であるDB定義を取得し、入力変数、DBテーブル変数、及び該ソフトウェアの特定の振る舞いを引き起こすようにテストデータが満たすべき条件である制約を抽出し、前記テストケース記憶手段に格納するテストケース抽出手段と、
前記テストケース記憶手段から取得した、DBテーブル変数のレコード件数に関する制約を解き、該DBテーブル変数のレコード件数を決定し、該レコード件数分のDBレコード変数を生成し、前記テストケース記憶手段に格納するDBレコード件数決定手段と、
前記テストケース記憶手段から取得した、文字列型変数同士の包含関係に関する制約から、文字列長に関する制約を導出し、文字列型変数の文字列長と整数型変数に関する制約を解き、文字列長変数と整数型変数を前記テストケース記憶手段に格納する整数・文字列長決定手段と、
前記テストケース記憶手段から取得した文字列型変数に関する制約を解き、文字列型変数を構成する文字の値を決定し、前記テストケース記憶手段に格納する文字決定手段と、
前記テストケース記憶手段に格納されている前記入力変数、前記DBテーブル変数をテストデータとして出力する出力手段と、
を有し、
前記テストケース抽出手段は、
前記入力値定義及び前記処理フロー図から「入力値に対する制約」を抽出し、該処理フロー図のDB検索条件から、「検索ヒット数、入力値、DB初期状態依存関係に関する制約」を抽出し、前記DB定義より「DB初期状態に対する制約」を抽出する手段を含み、
前記DBレコード件数決定手段は、
生成された前記DBレコード変数を取得する手段と、
前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」のうち、否定するパターンの全バリエーションを生成する手段と、
前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」を構成する制約を複製する手段と、
前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」を複製する手段と、
複製された制約のうち否定となっている制約のパターンの比較演算子を否定したものに置換する手段と、
DBテーブル変数を生成する手段と、
前記比較演算子を複製した制約に含まれるカラム全称参照を、当該カラムに対応する生成された前記DBテーブル変数への参照に置換した制約を生成し、前記テストケース記憶手段に格納する手段と、
を含むことを特徴とするテストデータ生成装置。
【請求項２】
前記DBレコード件数決定手段は、
入れ子の配列に相当する複雑なDBテーブルのレコード群を検出した場合に、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」に含まれる不等式で表された「DBテーブルのレコード群の件数に関する制約」を選択し、連立不等式として解くことでDBテーブル変数のDBレコード件数を決定する手段を含み、
前記整数・文字列長決定手段は、
入れ子の配列に相当する複雑なDBテーブルのレコード群を検出した場合に、前記テストケース抽出手段で抽出された前記「入力値に対する制約」、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」、前記「DB初期状態に対する制約」のいずれかに含まれる、不等式で表された「文字列の長さに関する制約」を選択し、連立不等式として解くことで配列の長さを決定する手段を含む
請求項１記載のテストデータ生成装置。
【請求項３】
前記整数・文字列長決定手段は、
前記「DB初期状態に対する制約」のうち、DBレコードの主キー、外部キーに関する制約を選び、整数変数同士比較に変換した制約、前記「入力値に対する制約」、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」、前記「DB初期状態に対する制約」のいずれかに含まれる、不等式で表された「整数に関する制約」を選択し、選択された整数に関する制約を連立不等式として解き、制約群を満たす値を求める手段を含む
請求項２記載のテストデータ生成装置。
【請求項４】
前記文字決定手段は、
前記「入力値に対する制約」、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」のいずれかに含まれる、文字列変数同士の包含関係に基づいて、該文字列変数同士の対応する位置に存在する文字がそれぞれ一致する、または、不一致となる文字を前記文字の値と決定する手段を含む
請求項１記載のテストデータ生成装置。
【請求項５】
前記文字決定手段は、
前記テストケース記憶手段の変数集合から文字型変数を取得し、該文字型変数の文字列長変数の値分だけ文字型変数を生成し、該文字型変数のシンボルに全ての文字型変数で異なる一意の記号を割り当てる手段と、
前記テストケース記憶手段から文字列親子ノードのリストを読み込み、文字列親ノードと文字列子ノードの文字列比較演算子の種類に応じて文字型変数ペアリストを生成し、該文字列比較演算子、及び、文字型変数ペアが文字型変数同士、文字列変数と定数文字同士、定数文字同士の各種別に応じて、
文字型変数を揃える処理、
文字型変数値を定数文字に置き換える処理、
文字型変数値を定数文字と異なる文字に置き換える処理、
または、
定数同士が等価ではない場合は、テストデータを生成することが不可能であることを示すテストデータ生成不可フラグを出力する処理、
のいずれかを行う手段と、
を含む
請求項４記載のテストデータ生成装置。
【請求項６】
データベース（DB）に格納されているデータの読み出し操作を伴う機能性テストを実施するためのテストデータを生成するテストデータ生成方法であって、
テストケース抽出手段が、設計情報として、ソフトウェアの入力値の定義域を表す入力値定義、ソフトウェアの処理の流れを表す処理フロー図、データベースの設計情報であるDB定義を取得し、入力変数、DBテーブル変数、及び該ソフトウェアの特定の振る舞いを引き起こすようにテストデータが満たすべき条件である制約を抽出し、テストケース記憶手段に格納するテストケース抽出ステップと、
DBレコード件数決定手段が、前記テストケース記憶手段から取得した、DBテーブル変数のレコード件数に関する制約を解き、該DBテーブル変数のレコード件数を決定し、該レコード件数分のDBレコード変数を生成し、前記テストケース記憶手段に格納するDBレコード件数決定ステップと、
整数・文字列長決定手段が、前記テストケース記憶手段から取得した、文字列型変数同士の包含関係に関する制約から、文字列長に関する制約を導出し、文字列型変数の文字列長と整数型変数に関する制約を解き、文字列長変数と整数型変数を前記テストケース記憶手段に格納する整数・文字列長決定ステップと、
文字決定手段が、前記テストケース記憶手段から取得した文字列型変数に関する制約を解き、文字列型変数を構成する文字の値を決定し、前記テストケース記憶手段に格納する文字決定ステップと、
出力手段が、前記テストケース記憶手段に格納されている前記入力変数、前記DBテーブル変数をテストデータとして出力する出力ステップと、
を行い、
前記テストケース抽出ステップにおいて、
前記入力値定義及び前記処理フロー図から「入力値に対する制約」を抽出し、該処理フロー図のDB検索条件から、「検索ヒット数、入力値、DB初期状態依存関係に関する制約」を抽出し、前記DB定義より「DB初期状態に対する制約」を抽出し、
前記DBレコード件数決定ステップにおいて、
生成された前記DBレコード変数を取得するステップと、
前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」のうち、否定するパターンの全バリエーションを生成するステップと、
前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」を構成する制約を複製するステップと、
前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」を複製するステップと、
複製された制約のうち否定となっている制約のパターンの比較演算子を否定したものに置換するステップと、
DBテーブル変数を生成するステップと、
前記比較演算子を複製した制約に含まれるカラム全称参照を、当該カラムに対応する生成された前記DBテーブル変数への参照に置換した制約を生成し、前記テストケース記憶手段に格納するステップと、
を含むことを特徴とするテストデータ生成方法。
【請求項７】
前記DBレコード件数決定ステップにおいて、
入れ子の配列に相当する複雑なDBテーブルのレコード群を検出した場合に、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」に含まれる不等式で表された「DBテーブルのレコード群の件数に関する制約」を選択し、連立不等式として解くことでDBテーブル変数のDBレコード件数を決定し、
前記整数・文字列長決定ステップにおいて、
入れ子の配列に相当する複雑なDBテーブルのレコード群を検出した場合に、前記テストケース抽出手段で抽出された前記「入力値に対する制約」、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」、前記「DB初期状態に対する制約」のいずれかに含まれる、不等式で表された「文字列の長さに関する制約」を選択し、連立不等式として解くことで配列の長さを決定する
請求項６記載のテストデータ生成方法。
【請求項８】
前記整数・文字列長決定ステップにおいて、
前記「DB初期状態に対する制約」のうち、DBレコードの主キー、外部キーに関する制約を選び、整数変数同士比較に変換した制約、前記「入力値に対する制約」、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」、前記「DB初期状態に対する制約」のいずれかに含まれる、不等式で表された「整数に関する制約」を選択し、選択された整数に関する制約を連立不等式として解き、制約群を満たす値を求める手段を含む
請求項７記載のテストデータ生成方法。
【請求項９】
前記文字決定ステップにおいて、
前記「入力値に対する制約」、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」のいずれかに含まれる、文字列変数同士の包含関係に基づいて、該文字列変数同士の対応する位置に存在する文字がそれぞれ一致する、または、不一致となる文字を前記文字の値と決定する
請求項６記載のテストデータ生成方法。
【請求項１０】
前記文字決定ステップにおいて、
前記テストケース記憶手段の変数集合から文字列型変数を取得し、該文字列型変数の文字列長変数の値分だけ文字型変数を生成し、該文字型変数のシンボルに全ての文字型変数で異なる一意の記号を割り当てるステップと、
前記テストケース記憶手段から文字列親子ノードのリストを読み込み、文字列親ノードと文字列子ノードの文字列比較演算子の種類に応じて文字型変数ペアリストを生成し、該文字列比較演算子、及び、文字型変数ペアが文字型変数同士、文字型変数と定数文字同士、定数文字同士の各種別に応じて、
文字型変数を揃える処理、
文字型変数値を定数文字に置き換える処理、
文字型変数値を定数文字と異なる文字に置き換える処理、
または、
定数同士が等価ではない場合は、テストデータを生成することが不可能であることを示すテストデータ生成不可フラグを出力する処理、
のいずれかを行うステップと、
を含む
請求項９記載のテストデータ生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、テストデータ生成装置及び方法に係り、特に、データベース（DB）検索を行うプログラムに対して、意図したDBレコードのみがヒットすることを確認するためのテストデータを自動的に生成するためのテストデータ生成装置及び方法に関する。
【背景技術】
【０００２】
一般に、ビジネスロジックとDBを結合させたときの動作を確認するためのテストである結合テストは、プログラムの一部を制御可能なダミー（スタブ、モック）に置き換えて行う単体テストと異なり、プログラム全体がテスト対象となるため、プログラムの内部を改変することができない。このため、テストで確認したいプログラムの振る舞いを引き起こすためには、適切に設定したパラメータをテスト対象プログラムに外部から与える必要がある。しかし、ビジネスロジックへの入力値と、DBレコード初期値を人手で用意するには手間が係り、効率的ではない。
【０００３】
自動的にテストデータを生成する第１の技術として、入力値定義と処理フローを入力とし、特定のテストパスを通すための整数型、文字列型の入力値を生成することによりテストデータを生成する手法がある（例えば、非特許文献１参照）。
【０００４】
また、第２の技術として、DB定義を入力として、DB定義を満たし、かつ指定されたレコード数を持つDB初期状態（主に性能テスト向け）を生成する手法がある。
【０００５】
また、第３の技術として、入力値定義、DB定義、DB事前条件を入力として、入力値、DB初期状態を生成する手法がある（例えば、非特許文献２参照）。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】張暁晶、星野隆"設計モデルを用いたテスト項目抽出とテストデータ生成手法"，信学技報，第109巻 of SS2009-7. pp.37-42. 2009.
【非特許文献２】藤原翔一郎、宗像一樹、片山朝子、前田芳晴、大木憲二、上原忠弘、山本里枝子. Smt solverを利用したwebアプリケーション用テストデータの生成．情報処理学会創立50周年記念(第72回)全国大会講演論文集．2010．
【発明の概要】
【発明が解決しようとする課題】
【０００７】
しかしながら、上記従来の第１の技術は、DBの初期状態（DBテーブル型）のデータを生成することができない。また、DB検索条件を設計書から読み取っていないため特定のテストのパスを通すために入力値とDB初期状態が満たすべき制約に抜けがある。また、複雑なデータ構造（配列）や変数の複雑な相互依存関係があった場合に適切なテストデータが生成できない、という問題がある。
【０００８】
また、仮に、従来の第１の技術と第２の技術を組み合わせて用いても、DB検索条件を設計情報として扱っていないため、DBのレコード検索結果の件数に依存する処理の分岐を制御するテストデータは生成することができない。また、第２の技術では、入力値とDB初期状態を個別に生成し、検索結果の件数が上限値、下限値で指定される範囲に収まるまで繰り返す方法もあるが、実用的な時間内で解くことができないという問題がある。
【０００９】
また、第３の技術では、フロー図を扱うことができないため、特定のテストパスを通す入力値、DB初期状態を生成できない。さらに、DB初期状態に関する必要不可欠な制約（例えば、主キーに関する制約）で抜けがある。また、文字列変数同士の包含関係を扱うことができない、という問題がある。
【００１０】
また、上記の従来技術では、整数変数同士の比較、文字列変数同士の包含関係（等価、前方一致、部分一致、後方一致、非等価、後方不一致、部分不一致）等の複雑な変数相互の依存関係を扱うテストデータを生成できないという問題がある。
【００１１】
本発明は、上記の点に鑑みなされたもので、入力値定義、処理フロー図、DE定義などのソフトウェア設計情報を入力とし、DB検索を行うプログラムに対して意図したDBレコードのみがヒットすることを可能とし、変数の複雑な依存関係を扱うテストデータを生成するテストデータ生成装置及び方法及びプログラムを提供することを目的とする。
【課題を解決するための手段】
【００１２】
上記の課題を解決するために、本発明は、データベース（DB）に格納されているデータの読み出し操作を伴う機能性テストを実施するためのテストデータを生成するテストデータ生成装置であって、
テストケースを格納するテストケース記憶手段と、
設計情報として、ソフトウェアの入力値の定義域を表す入力値定義、ソフトウェアの処理の流れを表す処理フロー図、データベースの設計情報であるDB定義を取得し、入力変数、DBテーブル変数、及び該ソフトウェアの特定の振る舞いを引き起こすようにテストデータが満たすべき条件である制約を抽出し、前記テストケース記憶手段に格納するテストケース抽出手段と、
前記テストケース記憶手段から取得した、DBテーブル変数のレコード件数に関する制約を解き、該DBテーブル変数のレコード件数を決定し、該レコード件数分のDBレコード変数を生成し、前記テストケース記憶手段に格納するDBレコード件数決定手段と、
前記テストケース記憶手段から取得した、文字列型変数同士の包含関係に関する制約から、文字列長に関する制約を導出し、文字列型変数の文字列長と整数型変数に関する制約を解き、文字列長変数と整数型変数を前記テストケース記憶手段に格納する整数・文字列長決定手段と、
前記テストケース記憶手段から取得した文字列型変数に関する制約を解き、文字列型変数を構成する文字の値を決定し、前記テストケース記憶手段に格納する文字決定手段と、
前記テストケース記憶手段に格納されている前記入力変数、前記DBテーブル変数をテストデータとして出力する出力手段と、
を有し、
前記テストケース抽出手段は、
前記入力値定義及び前記処理フロー図から「入力値に対する制約」を抽出し、該処理フロー図のDB検索条件から、「検索ヒット数、入力値、DB初期状態依存関係に関する制約」を抽出し、前記DB定義より「DB初期状態に対する制約」を抽出する手段を含み、
前記DBレコード件数決定手段は、
生成された前記DBレコード変数を取得する手段と、
前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」のうち、否定するパターンの全バリエーションを生成する手段と、
前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」を構成する制約を複製する手段と、
前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」を複製する手段と、
複製された制約のうち否定となっている制約のパターンの比較演算子を否定したものに置換する手段と、
DBテーブル変数を生成する手段と、
前記比較演算子を複製した制約に含まれるカラム全称参照を、当該カラムに対応する生成された前記DBテーブル変数への参照に置換した制約を生成し、前記テストケース記憶手段に格納する手段と、を含む。
【００１３】
また、本発明は、前記DBレコード件数決定手段に、入れ子の配列に相当する複雑なDBテーブルのレコード群を検出した場合に、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」に含まれる不等式で表された「DBテーブルのレコード群の件数に関する制約」を選択し、連立不等式として解くことでDBテーブル変数のDBレコード件数を決定する手段を含み、
前記整数・文字列長決定手段に、入れ子の配列に相当する複雑なDBテーブルのレコード群を検出した場合に、前記テストケース抽出手段で抽出された前記「入力値に対する制約」、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」、前記「DB初期状態に対する制約」のいずれかに含まれる、不等式で表された「文字列の長さに関する制約」を選択し、連立不等式として解くことで配列の長さを決定する手段を含む。
【００１４】
また、本発明は、前記整数・文字列長決定手段には、
前記「DB初期状態に対する制約」のうち、DBレコードの主キー、外部キーに関する制約を選び、整数変数同士比較に変換した制約、前記「入力値に対する制約」、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」、前記「DB初期状態に対する制約」のいずれかに含まれる、不等式で表された「整数に関する制約」を選択し、選択された整数に関する制約を連立不等式として解き、制約群を満たす値を求める手段を含む。
【００１５】
また、本発明は、前記文字決定手段に、
前記「入力値に対する制約」、前記「検索ヒット数、入力値、DB初期状態依存関係に関する制約」のいずれかに含まれる、文字列変数同士の包含関係に基づいて、該文字列変数同士の対応する位置に存在する文字がそれぞれ一致する、または、不一致となる文字を前記文字の値と決定する手段を含む。
【００１６】
また、本発明は、前記文字決定手段に、
前記テストケース記憶手段の変数集合から文字列型変数を取得し、該文字列型変数の文字列長変数の値分だけ文字型変数を生成し、該文字型変数のシンボルに全ての文字型変数で異なる一意の記号を割り当てる手段と、
前記テストケース記憶手段から文字列親子ノードのリストを読み込み、文字列親ノードと文字列子ノードの文字列比較演算子の種類に応じて文字型変数ペアリストを生成し、該文字列比較演算子、及び、文字型変数ペアが文字型変数同士、文字型変数と定数文字同士、定数文字同士の各種別に応じて、
文字型変数を揃える処理、
文字型変数値を定数文字に置き換える処理、
文字型変数値を定数文字と異なる文字に置き換える処理、
または、
定数同士が等価ではない場合は、テストデータを生成することが不可能であることを示すテストデータ生成不可フラグを出力する処理、
のいずれかを行う手段と、を含む。
【発明の効果】
【００１７】
上記のように、本発明によれば、DB検索を行うプログラムに対して、検索結果が正しい（意図したDBレコードのみがヒットする）ことを確認するためのテストデータを生成できる。すなわち、DBレコード検索結果の件数によって処理が分岐するプログラムにおいて、検索結果件数を上限値、下限値で指定される範囲に収め、処理の分岐を制御できるような入力値とDB初期状態の組合せを実用的な時間内で特定することができる。
【００１８】
また、本発明では、検索条件に一致するレコードに加えて、一致しないレコードの全バリエーションを必要最低限の件数だけ生成することができる。
【００１９】
更に、入れ子配列のような複雑なデータ構造を含むようなソフトウェアであっても、適切にテストデータを生成することができる。
【００２０】
また、整数変数同士の比較、文字列変数同士の包含関係（等価、前方一致、部分一致、後方一致、非等価、前方一致、後方不一致、部分不一致）等の変数の複雑な相互関係を扱うテストデータを生成することができる。
【図面の簡単な説明】
【００２１】
【図１】本発明で用いられるフロー図の例である。
【図２】本発明で用いられるテストパスの例である。
【図３】本発明で用いられる入力値定義の例である。
【図４】本発明で用いられるDB定義の例である。
【図５】本発明で用いられる制約の例である。
【図６】本発明で用いられる制約の定義を示す図である。
【図７】本発明の一実施の形態におけるテストデータ生成装置の構成図である。
【図８】本発明の一実施の形態におけるテストケース記憶部に格納されるデータである。
【図９】本発明の一実施の形態におけるテストデータ生成装置の全体の処理のフローチャートである。
【図１０】本発明の一実施の形態における図９のＳ１１０の詳細フローチャートである。
【図１１】本発明の一実施の形態における経路リスト生成処理のフローチャートである。
【図１２】本発明の一実施の形態における図１１のS２０６の詳細フローチャートである。
【図１３】本発明の一実施の形態における図１１のＳ２１１の詳細フローチャートである。
【図１４】本発明の一実施の形態における図１０のＳ２４０の詳細フローチャートである。
【図１５】本発明の一実施の形態におけるDB検索条件から制約への変換例である。
【図１６】本発明の一実施の形態における図９のＳ１２０の詳細フローチャートである。
【図１７】本発明の一実施の形態における図１６のＳ３６５の詳細フローチャートである。
【図１８】本発明の一実施の形態における図１３のＳ３７０の詳細フローチャートである。
【図１９】本発明の一実施の形態における図１３のＳ３８０の詳細フローチャートである。
【図２０】本発明の一実施の形態における図９のＳ１３０の詳細フローチャートである。
【図２１】本発明の一実施の形態における文字列長を決定する処理の例である。
【図２２】本発明の一実施の形態における図１５のＳ４５０の詳細フローチャートである。
【図２３】本発明の一実施の形態における図９のＳ１４０の詳細フローチャートである。
【図２４】本発明の一実施の形態における文字決定部の処理を示す図である。
【図２５】本発明の一実施の形態における図２３のＳ５４０の詳細フローチャートである。
【図２６】本発明の一実施の形態における図２５のＳ１０７０の詳細フローチャートである。
【図２７】本発明の一実施の形態におけるＳ１０７０とＳ１１７０の定数文字の非等価を説明するための図である。
【発明を実施するための形態】
【００２２】
以下図面と共に、本発明の実施の形態を説明する。
【００２３】
まず、本明細書で使用する用語について説明する。
【００２４】
処理フロー図：ソフトウェア設計情報の一種であり、振る舞い（ソフトウェアの処理の流れ）を表す。処理フロー図には、フローチャート、UML(Uniformed Modeling Language)アクティビティ図等の種類がある。処理フロー図の例を図１に示す。処理フロー図には、ノードとエッジからなる処理フロー図、ノード、ノードの内容、DB検索条件、検索結果レコード件数、Where句条件群、次ノード接続エッジ群、エッジ、ガード条件を含む。
【００２５】
テストパス：処理フロー図の中の特定のパスである。経路網羅性を確保するためには、処理フロー図の中の全てのテストパスに対し、テストパスを通す適切なテストデータを作成する必要がある。テストパスの例を図２に示す。テストパスは、ノードとエッジの情報からなる。
【００２６】
入力値定義：ソフトウェア設計情報の一種であり、ソフトウェアの入力値の定義域を表す。入力値定義の例を図３に示す。
【００２７】
DB定義：データベース設計情報であり、テーブル名、各テーブルにおけるカラム名、カラムの型、カラムの値の定義域が記述されている。DB定義の例を図４に示す。DB定義は、定義対象のDBテーブル、DBテーブルのレコード、カラム、型と定義域、整数定義域、文字列定義息、カラムの種類、参照先カラムを含む。
【００２８】
制約：「ソフトウェアの特定の振る舞い」を引き起こせるテストデータが満たすべき複数の条件のうちの１つであり、制約の種類は、図５に示すように、
（１）入力値に対する制約：入力値定義、処理フロー図より取得；
（２）検索ヒット数、入力値、DB初期状態の対応に関する制約：処理フロー図に記述されたDB検索条件より取得；
（３）DB初期状態に対する制約：DB定義より取得；
があり、上記の（１）〜（３）に含まれる各制約は図６に示すようにBNFで定義されている。制約は、設計情報に含まれる後述するテストケース抽出部で抽出される制約（図６（Ａ））と、テストデータ生成処理中に導出される制約（図６（Ｂ））がある。制約には、整数制約、文字列制約、一意制約がある。整数制約には、整数算術式、整数比較演算子、整数算術式に関する制約が含まれる。文字列制約には、文字列因子、文字列比較演算子、文字列因子に関する制約が含まれる。一意制約は、distinctカラム全称参照で表される。
【００２９】
図７は、本発明の一実施の形態におけるテストデータ生成装置の構成を示す。
【００３０】
テストデータ生成装置１００は、ユーザ端末１０と接続されている。
【００３１】
テストデータ生成装置１００は、テストケース抽出部１１０、DBレコード件数決定部１２０、整数・文字列長決定部１３０、文字決定部１４０、テストデータ出力部１５０、テストケース記憶部１６０から構成される。
【００３２】
上記の構成のうち、テストケース抽出部１１０、DBレコード件数決定部１２０、整数・文字列長決定部１３０、文字決定部１４０、テストデータ出力部１５０は、CPU内で機能し、テストケース記憶部１６０は、メモリ、ハードディスク等の記憶媒体である。
【００３３】
テストケース抽出部１１０は、ユーザ端末１０からXML形式の設計情報を取得して、当該設計情報から入力変数、DBテーブル変数、制約を抽出し、テストケースａとしてテストケース記憶部１６０に格納する。テストケースａは、設計情報の図１の処理フロー図、図２のテストパス、図３の入力値定義、図４のDB定義、抽出された入力変数、DBテーブル変数、制約（図６（Ａ））を含む。
【００３４】
DBレコード件数決定部１２０は、テストケース記憶部１６０からテストケースａを読み出して、当該テストケースａに含まれるDBテーブル変数からDBレコードの件数の値を決定する。さらに、前述のDB検索条件から抽出された図５の（２）の制約の論理積の各項の条件の否定に対して、決定された件数分のDBレコード変数を生成する。テストケースａをコピーし、そのメンバであるDBテーブル変数のレコード件数にその値を設定したものをテストケースｂとし、当該テストケースｂをテストケース記憶部１６０に格納する。また、DBテーブル変数のカラムに関する制約を各レコードのフィールドに対して展開する。
【００３５】
整数・文字列長決定部１３０は、テストケース記憶部１６０からテストケースｂ（変数、文字列同士の包含関係に関する制約（図６（Ａ））を読み出して、文字列型変数同士の包含関係に関する制約から文字列長に関する制約（図６（Ｂ））を導出し、文字列型変数の文字列長に関する制約と整数型変数に関する制約（図６（Ａ））を解き、それらの値(文字列型変数、文字列長変数、整数型変数)を決定し、それらの値とテストケースｂをコピーした内容をテストケースｃとし、当該テストケースｃをテストケース記憶部１６０に格納する。
【００３６】
文字決定部１４０は、テストケース記憶部１６０からテストケースｃを読み出して、文字列型変数に関する制約（図６（Ａ））を解き、文字列変数同士の包含関係に基づいて文字列変数同士の対応する位置の文字がそれぞれ一致する、または、不一致になるような文字を決定する。決定された文字（値決定済み変数）と文字型変数とテストケースｃをコピーした内容をテストケースdとし、当該テストケースｄをテストケース記憶部１６０に格納する。
【００３７】
テストデータ出力部１５０は、テストケース記憶部１６０から入力変数、DBテーブル変数の値をテキスト形式でユーザ端末１０に出力する。
【００３８】
テストケース記憶部１６０は、図８（Ａ）に示すような上記の各構成から出力される中間データとしてのテストケース、文字列包含関係木、文字列親子ノード及び図６に示す制約等を格納する。テストケース抽出部１１０からは、テストケースａとして、｛制約、変数｝が格納される。DBレコード件数決定部１２０からは、テストケースｂとして、｛テストケースａ＋DBテーブル変数、DBレコード件数変数、DBレコード変数、DBフィールド変数｝が格納される。整数・文字列長決定部１３０からは、テストケースｃとして、｛テストケースｂ＋文字列型変数、文字列長変数、整数型変数、文字列包含関係木、文字列親子ノード｝が格納される。文字決定部１４０からはテストケースｄとして、｛テストケースｃ＋文字型変数、値決定済み変数｝が格納される。また、上記のテストケースの他、図８（Ｂ）の文字列包含関係木、図８（Ｃ）に示す文字列親子ノード、DBレコード件数決定部１２０で参照される図８（Ｄ）に示す文字列比較演算子テーブル、図８（Ｅ）に示す整数比演算子not変換テーブルが格納される。
【００３９】
図８（Ｄ）の文字列比較演算子テーブルは、前方一致、部分一致、後方一致、等価の各演算子が「通常比較」、「否定比較」のいずれであるかを判定するためのテーブルである。図８（Ｅ）の整数比較演算子not変換テーブルは、"＞"を"＜＝"等の否定形に変換するためのテーブルである。
【００４０】
以下に、上記の構成における動作を詳細に説明する。
【００４１】
最初に、テストデータ生成装置１００の全体の動作を説明する。
【００４２】
図９は、本発明の一実施の形態におけるテストデータ生成装置の全体処理のフローチャートである。
【００４３】
ステップ１１０）  テストケース抽出部１１０において、設計情報を取得する。設計情報は、
・DB定義（DBテーブル変数、DBテーブルの各カラムに対する制約、DBテーブルの主キー、外部キー）；
・入力値定義；
・処理フロー図；
が含まれる。当該設計情報から変数（入力変数、DBテーブル変数）及び、制約を抽出し、これらをテストケースａとしてテストケース記憶部１６０に格納する。当該ステップの詳細については、図１０にて後述する。
【００４４】
ステップ１２０）  DBレコード件数決定部１２０において、テストケース記憶部１６０からテストケースａを読み込み、DBテーブル変数のレコード件数に関する制約を解き、DＢテーブル変数のレコード件数を決定する。図５（２）の制約の論理積の各項の条件の否定に対して決定されたレコード件数分のDBレコード変数を生成する、DB、テーブル変数のカラムに関する制約を各レコードのフィールドに対して展開する。テストケースａをコピーし、そのメンバであるDBテーブル変数のレコード件数にDBレコード変数を設定したものをテストケースｂとし、当該テストケースｂをテストケース記憶部１６０に格納する。テストケースｂとしてテストケース記憶部１６０に格納する。詳細については図１６で後述する。
【００４５】
ステップ１３０）  整数・文字列長決定部１３０において、テストケース記憶部１６０からテストケースｂを取得し、文字列型変数同士の包含関係に関する制約から文字列長に関する制約を導出し、テストケース記憶部１６０の制約集合に追加した後、ステップ１２０で導出された文字列型変数の文字列長とステップ１１０で抽出された整数型変数に関する制約を解き、それぞれの値を決定する。テストケースｂをコピーし、文字列型の変数の文字列長変数の値と、整数型変数の値を設定したものをテストケースｃとしてテストケース記憶部１６０に格納する。
【００４６】
ステップ１４０）  テストケース記憶部１６０からテストケースｃを取得し、文字決定部１４０において、文字列型変数に関する制約を解き、文字列型変数を構成する文字の値を決定し、テストケースｃをコピーしたものに設定し、テストケースｄとしてテストケース記憶部１６０に格納する。詳細は図２０で後述する。
【００４７】
ステップ１５０）  テストデータ出力部１５０において、テストケース記憶部１６０のテストケースｄから入力変数（図８（Ａ），9行目）、DBテーブル変数（図８（Ａ），5行目）の値を取得してユーザ端末１０にダンプ出力する。
【００４８】
上記のステップ１２０，１３０では、入れ子の配列に相当する複雑なデータ構造（DBテーブルのレコード群、文字列）を検出した際に、入れ子でいう「外側」の配列の長さ（DBテーブルのレコード群の件数、文字列の長さ）に関する制約を、図５に示す条件（１）、（２）、（３）から選び出して、それらを優先して解くことで配列の要素より先に配列の長さを決定する。
【００４９】
次に、上記のステップ１１０のテストケース抽出部１１０における設計情報から変数、制約を抽出する処理について説明する。
【００５０】
図１０は、本発明の一実施の形態における図７のＳ１１０の詳細フローチャートである。
【００５１】
ステップ２１０）  テストケース抽出部１１０は、設計情報からDB定義（図４）を読み込み、変数、制約を抽出する。詳しくは、DB定義から、DBテーブル変数とDBテーブルの各カラムに対する制約（図５の（３））を抽出し、変数と制約を出力する。
【００５２】
ステップ２２０）  次に、設計情報から、入力値定義（図３）を読み込み、変数、制約を抽出する。詳しくは、入力値定義から入力変数と入力値に対する制約（図５、（１））を抽出する。
【００５３】
ステップ２３０）  次に、処理フロー図（図１）を読み込み、C1カバレッジを満たすよう、全てのテストパス（図２）を抽出する。ここで、テストパスの抽出方法を説明する。テストパスの抽出は、テストケース抽出部１１０内に具備される経路抽出機能で実行する。
【００５４】
経路抽出機能は、読み込んだフロー図からテストすべき実行経路を抽出するために、ループ最大通過回数で指定された回数のループを通るような経路のリストを生成する。
【００５５】
経路抽出機能は、フロー図内の全ノード情報（ノードＩＤ，ノード内テキスト、次展開エッジ群）と、エッジ情報（エッジＩＤ，始点接続ノードＩＤ，終点接続ノードＩＤ，遷移条件）を読み込み、経路リストを生成する。当該経路リスト生成処理を以下に示す。
【００５６】
図１１は、本発明の一実施の形態における経路リスト生成処理のフローチャートである。
【００５７】
ステップ２０１０）  経路抽出部１３０は、読み込まれた開始エッジを次展開エッジ群用スタックに積む。なお、当該経路抽出機能に内部にバッファを備え、当該バッファにスタックの領域を設けるものとする。
【００５８】
ステップ２０２０）  次展開エッジ群用スタックは空であるかを判定し、空である場合は当該処理を終了する。
【００５９】
ステップ２０３０）  次展開エッジ群用スタックの最上位にある次展開エッジ群に要素があるかを判定し、ない場合はステップ２１２０に移行する。
【００６０】
ステップ２０４０）  次展開エッジ群スタックの最上位にある要素（現在次展開エッジ群）から、ひとつエッジを得て現在エッジとする。
【００６１】
ステップ２０５０）  現在次展開エッジ群から現在エッジを取り除く。
【００６２】
ステップ２０６０）  経路（エッジ用スタックに積まれているエッジの列）内のループ出現回数を計算する。当該処理は、探索途中経路に存在する現在ループ経路の数（ループ出現回数）を計算するものである。当該処理の詳細については図１２で後述する。
【００６３】
ステップ２０７０）  ループの出現回数（ループ最大出現回数）がユーザ端末１０より入力されたユーザ指定ループ最大通過数に１を加えた値より大きければ、ステップ２０２０に移行する。当該処理は、探索途中の経路のループ最大出現回数が異常値（ユーザ指定ループ最大通過数＋１）を超えたらその経路の探索を打ち切ることである。なお、「ループ最大出現回数」とは、探索途中経路に含まれる複数のループ経路のうちループ出現回数が最大であるループ経路のループ出現回数である。
【００６４】
ステップ２０８０）  現在エッジをエッジ用スタックに積み、ループ出現回数をループ出現回数用スタックに積む。
【００６５】
ステップ２０９０）  現在のエッジのもつ終点ノードＩＤに基づいて、フロー図からノードを取得し、そのノードのエッジ（始点との接続）群を取得し、その取得したエッジ（始点との接続）群を、次展開エッジとして、次展開エッジ群スタックに積む。
【００６６】
ステップ２１００）  現在のエッジが終了ノードに接続していない場合はステップ２０２０に移行する。
【００６７】
ステップ２１１０）  経路のループ最大出現回数に応じて、上限値、異常値、近傍値とラベルを付与し、経路（エッジ用スタックに積まれているエッジの列）を出力する。また、上限値、異常値、近傍値のどれにも相当しない経路に関しては出力しない。当該処理の詳細については図１３で後述する。
【００６８】
ステップ２１２０）  次展開エッジ群用スタックをポップする。
【００６９】
ステップ２１３０）  ポップしたエッジ用スタックが空である場合は、当該処理を終了する。
【００７０】
ステップ２１４０）  エッジ用スタックとループ出現回数スタックをポップして、処理を終了する。
【００７１】
次に、上記の図１１のステップ２０６の経路（エッジ用スタックに積まれているエッジの列）内の現在ループ経路の出現回数を計算する処理について詳述する。
【００７２】
図１２は、本発明の一実施の形態における図１１のＳ２０６０の詳細フローチャートである。
【００７３】
ステップ３０１０）  経路抽出機能は、バッファから現在エッジを読み込む。
【００７４】
ステップ３０２０）  経路（エッジ用スタックに積まれているエッジの列）を読み込む。
【００７５】
ステップ３０３０）  探索途中経路を生成する。具体的には、経路を複製し、複製した経路を探索途中経路とする。
【００７６】
ステップ３０４０）  探索途中経路の先頭から、先頭に一番近い現在エッジまでを現在ループ経路が何回出現するか計算する。
【００７７】
ステップ３０５０）  探索途中経路内で現在ループ経路が何回出現するか（ループ出現回数）を求める。当該ループ出現回数を求める手法として、文献１「R.S. boyer: J. S. Moore (1997). "A fast string searching algorithm". Comm. ACM 20: 762-772」等の技術を用いることができる。当該文献１の手法は、文字列照合のアルゴリズムであるが、ひとつのエッジをひとつの文字とみなし、経路（エッジの列）を文字列とみなせば適用可能である。
【００７８】
次に、上記の図１１のステップ２１１０のエッジ用スタックの中身を経路として出力する処理について詳述する。
【００７９】
図１３は、本発明の一実施の形態における図１１のステップ２１１０の詳細フローチャートである。
【００８０】
ステップ４０１０）  経路抽出機能は、経路のループ最大出現回数を計算する。具体的には、ループ出現回数用スタックに積まれているループ出現回数の最大値を取得し、ループ最大出現回数とする。
【００８１】
ステップ４０２０）  ループ最大出現回数（Ｍ）とユーザ指定ループ最大通過数（Ｎ）が等しいか（Ｍ＝Ｎ）を判定し、等しい場合にはステップ４０３０に移行し、等しくない場合はステップ４０４０に移行する。
【００８２】
ステップ４０３０）  Ｍ＝Ｎの場合は「上限値」ラベルを付与して経路を出力し、当該処理を終了する。Ｍ＝Ｎ以外の場合はステップ４０４０に移行する。
【００８３】
ステップ４０４０）  ループ最大出現回数とユーザ指定ループ最大通過数に１を加算した値と等しければ（Ｍ＝Ｎ＋１）、ステップ４０５０に移行し、等しくない場合はステップ４０６０に移行する。
【００８４】
ステップ４０５０）  Ｍ＝Ｎ＋１である場合は「異常値」ラベルを付与して経路を出力し、当該処理を終了する。
【００８５】
ステップ４０６０）  ループ最大出現回数とユーザ指定ループ最大通過数から１を引いた値とが等しければ（Ｍ＝Ｎ−１）ステップ４０７０に移行し、等しくなければ当該処理を終了する。
【００８６】
ステップ４０７０）  Ｍ＝Ｎ−１である場合は「近傍値」ラベルを付与して経路を出力し、当該処理を終了する。
【００８７】
以下、図１０の処理の説明に戻る。
【００８８】
ステップ２４０）  次に、処理フロー図から抽出されたテストパスから、入力値に対する制約（図５（３））、処理フロー図のDB検索条件に記述された制約（図５（２））を抽出する。入力値に対する制約の制約種類タグに「入力条件タグ」を設定する。DB検索条件に記述された制約の制約種類タグは「検索条件タグ」を設定する。テストパスから制約を抽出する処理については、図１４にて後述する。
【００８９】
ステップ２５０）  上記のステップ２１０，２２０，２４０で抽出された変数及び制約を取得し、これらを纏めた制約集合をメンバとしてもつテストケース（オリジナルテストケース）ａを作成し、テストケース記憶部１６０に格納する。
【００９０】
次に、上記のステップ２４０のテストパスから制約を抽出する処理について説明する。
【００９１】
図１４は、本発明の一実施の形態における図１０のＳ２４０の詳細フローチャートであり、図１５は、DB検索条件から制約への変換例を示す。
【００９２】
まず、テストパスの各ノードに対して以下の処理を行う。
【００９３】
ステップ６００）  テストケース抽出部１１０は、ステップ２３０で抽出されたテストパスの各ノードにDB検索条件があるかを、処理フロー図（図１）を参照して判定し、ある場合にはステップ６１０に移行し、ない場合は次のノードの処理に移行する。
【００９４】
ステップ６１０）  ノードにDB検索条件がある場合は、当該DB検索条件の"Where句条件群にある制約"を抽出する。図１５の例では、設計情報
WHERE (ID>=検索ID)
AND(名前subString社員名)
が抽出される。
【００９５】
ステップ６２０）  DB検索条件の検索結果レコード件数（検索ヒット数）におけるMin count（図１）を、Min Count<=Count(From TableId)制約、Max Count（図１）を、MAX>=Count (From TableId)制約へと変換して出力する。
【００９６】
ここまでの処理をノード数分繰り返す。
【００９７】
ステップ６３０）  次に、各テストパスの各エッジに対する処理として、テストケースａの処理フロー図（図１）を参照してエッジガード条件があるかを判定し、ある場合には、エッジガード条件から制約（整数制約、文字列制約）を抽出する。当該処理をテストパスの各ノードに対して行う。
【００９８】
上記の処理から検索ヒット数、入力値、DB初期状態の依存関係に関する制約、DB初期状態に対する制約が抽出される。これにより、処理の分岐を制御できるような条件（図５（１）（２）（３））を設計書から漏れなく抽出して集約しているため、これらの制約を後述する処理により連立不等式に変換し、既存技術で解くことができる。
【００９９】
次に、DBレコード件数決定部１２０における、図９のステップ１２０のDBレコード件数の値を決定する処理について説明する。
【０１００】
図１６は、本発明の一実施の形態における図９のＳ１２０の詳細フローチャートである。
【０１０１】
ステップ３１０）  DBレコード件数決定部１２０は、テストケース記憶部１６０からテストケースａを読み込み、テストケースの各DBテーブル変数に対して以下のステップ３７０までの処理を行う。
【０１０２】
ステップ３２０）  ユーザから指定されたDBレコード件数デフォルト値を取得する。なお、当該デフォルト値はメモリ（図示せず）に予め記憶されているものとする。
【０１０３】
ステップ３３０）  ステップ３１０で読み込んだテストケースａに含まれるDBテーブル変数、制約集合を取得し、制約の中でレコード件数参照を含む制約を全て取得し、出力する。図６の例では、「レコード件数参照＝Count(DBテーブル変数)」を出力する。
【０１０４】
ステップ３４０）  上記のレコード件数に関する制約が１つ以上存在する場合は、図８（Ａ）に示すテストケースの制約集合の中からDBレコード変数及びDBテーブル変数のレコード件数変数に関する制約を取得する。図８（Ａ）の例では、"DBレコード変数＝Id DBフィールド変数＋"、"DBレコード件数変数＝Id 整数型変数"を取得する。DBレコード変数のDBレコード件数に関する制約を解き、レコード件数の値を決定する。このとき、DBレコード変数のレコード件数に関する制約は、整数の不等式となっているため、これらを連立させ連立不等式として既存技術（SMT Arithmetic Theory, シンプレックス法）を用いて解き、制約を満たすレコード件数の値を求める。ステップ３６０に移行する。
【０１０５】
ステップ３５０）  制約集合にレコード件数に関する制約がない場合は、ユーザ指定DBレコード件数デフォルト値をレコード件数の値として設定する。このとき、テストケースに含まれるテストパスから入力変数に対する制約（図５（３））と、DB検索条件に記述された制約（図５（２））を抽出する。
【０１０６】
ステップ３６０）  テストケース記憶部１６０のテストケース領域からDBテーブル変数を取得し、当該DBテーブル変数の件数の値の分だけDBレコード変数を生成し、テストケース領域のDBテーブル変数のメンバとして追加する。
【０１０７】
ステップ３６５）  ステップ３６０で生成されたDBレコード変数のうち、検索条件に一致しないDBレコード変数の全バリエーションを生成し、DBテーブル変数のメンバとしてテストケース記憶部１６０のDBテーブル変数のメンバとして追加する。当該処理により、論理積の各項の条件の否定に対してDBレコード変数を生成することが可能となるため、検索条件で一致するレコードに加えて、一致しないレコードについても全バリエーションを生成することができる。詳細については、図１７で後述する。
【０１０８】
ステップ３７０）  テストケース記憶部１６０から制約集合を取得し、DBテーブルのカラムに対する制約（図６（Ａ）「カラム参照」）を、DBフィールド変数への制約として展開する。このとき、カラム全称参照（∀）を含む制約（図６（Ａ））を選び出し、DBフィールド変数（図８（Ａ））への制約として展開する。詳細は図１８にて後述する。
【０１０９】
ステップ３８０）  テストケースの各DBテーブル変数に対する上記の処理が終了したら、テストケース記憶部１６０から制約集合を取得し、外部キーに関する制約をテストケース記憶部１６０の制約集合に追加する。このとき、カラム存在参照を含む制約を選び出し、DBフィールド変数への制約として展開する。詳細は図１９にて後述する。
【０１１０】
図１７は、本発明の一実施の形態における図１６のＳ３６５の詳細フローチャートである。
【０１１１】
ステップ１２１０）  DBレコード件数決定部１２０は、DBテーブル変数を取得する。
【０１１２】
ステップ１２２０）  テストケース記憶部１６０の制約集合（図６（Ａ））から、制約種類タグが「検索条件タグ」であり、かつ、上記で取得したＤＢテーブル変数に対するＤＢテーブルのカラムの全称参照が含まれる制約を抽出する。
【０１１３】
ステップ１２３０）  DB検索条件を構成する制約の中から任意に複数の制約を選び出し、否定するパターンの全バリエーションを生成する。ｎ個の制約があったときバリエーション数は、２のｎ乗−１個となる。
【０１１４】
ステップ１２４０）  ステップ１２３０で選択されたDB検索条件を構成する制約を複製する。
【０１１５】
ステップ１２５０）  ステップ１２４０で複製された制約のうち、パターンで否定になっている制約の比較演算子を、文字列比較演算子であれば図８（D）に示す文字列比較演算子テーブル、整数比較演算子であれば、図８（E）に示す整数比較演算子not変換テーブルに基づいて、その比較演算子を否定したものに置換する。
【０１１６】
ステップ１２６０）  １つのバリエーションに対するDBレコード変数を１つ生成し、テストケース記憶部１６０のDBテーブル変数に追加する。
【０１１７】
ステップ１２７０）  ステップ１２５０において比較演算子を置換した制約に含まれる「カラム全称参照」を、このカラムに対するDBフィールド変数（入力されたDBレコード変数のメンバ）への参照に置換する。
【０１１８】
ステップ１２８０）  DBフィールド変数ヘの参照に置換した制約を、テストケース記憶部１６０内のテーブル変数が属するテストケースの制約集合へ追加する。
【０１１９】
上記のステップ１２４０〜ステップ１２８０の処理をステップ１２３０で生成したパターン数分繰り返す。これにより、各DB検索条件を構成する制約に対応するDBレコード変数が生成されることになる。例えば、論理積の各条件を否定したバリケーションが３つあれば、それぞれの条件に対応するDBレコード変数を３つ生成し、DBテーブル変数に追加する。また、上記のステップ１２７０、１２８０の処理を複製した制約数分繰り返す。
【０１２０】
上記の図１６のステップ３７０のDBテーブルのカラムに対する制約をDBフィールド変数への制約として展開する処理について説明する。
【０１２１】
図１８は、本発明の一実施の形態における図１６のＳ３７０の詳細フローチャートである。
【０１２２】
ステップ７１０）  DBレコード件数決定部１２０は、制約集合を取得し、カラム全称参照を含む制約を選び出す。以下の処理を選び出された制約の数だけ繰り返す。
【０１２３】
ステップ７２０）  ステップ７１０で選び出された制約が一意制約でない場合は、DBテーブルのカラムに対する制約を、DBフィールド変数への制約として展開する。このとき、カラム全称参照（図６（Ａ））で参照しているDBテーブルに対応するDBテーブル変数のDBレコード件数変数の値（図６（Ａ））「レコード件数参照」）の分だけ制約を複製する。そして、複製した制約のカラム全称参照部分をDBテーブル変数が保持する各DBレコード変数のカラムに対応するDBフィールド変数で置き換え、DBフィールド変数を含む制約を出力する。
【０１２４】
ステップ７３０）  ステップ７１０で選び出されたカラム全称参照を含む制約が一意制約であり、カラム型がInt型（整数型）である場合は、整数型の一意制約をDBフィールド変数への制約として展開する。このとき、"distinct ∀ columX"という一意制約に対し、columX、DBフィールド変数をそれぞれfieldX1, fieldX2,…, fieldXnとする。fieldXi＞fieldX(i+1)(ここで、i = 1〜n−1)という整数制約を生成し、ｘ＜ｙという形の整数制約を出力する。
【０１２５】
ステップ７４０）  ステップ７１０で選び出された制約が一意制約であり、カラム型がString型（文字列型）である場合は、文字列型の一意制約を、DBフィールド変数への制約として展開する。このとき、カラムに対応する各DBフィールド変数（文字列型）に対して、"id1 subString c1, id1 subString c2, …, idn substring cn"という文字列制約を追加し、「x substring c」という形の文字列制約を出力する。ここで、c1〜cnは定数文字列であり、これらは一意になるように文字列の値を決めておく。例えば、c1="01"、c2="02"などとすればよい。
【０１２６】
次に、図１６のＳ３８０の外部キーに関する制約を追加する処理について説明する。
【０１２７】
図１９は、本発明の一実施の形態におけるＳ３８０の詳細フローチャートである。
【０１２８】
ステップ８１０）  DBレコード件数決定部１２０は、テストケース記憶部１６０からテストケースａを読み込む。
【０１２９】
ステップ８２０）  テストケースａに含まれる制約集合からカラム存在参照を含む制約を選び出す。以下の処理を選び出された制約の数だけ繰り返す。
【０１３０】
ステップ８３０）  各カラム存在参照（∃）を含む制約のカラム型がInt(整数型)（図６（Ａ））である場合は、外部キーに関する制約をDBフィールド変数に対する制約として展開し、ｘ==yという形の整数制約を出力する。ここで、制約を展開するとは、入力された整数型外部キーに関する∃columX == ∃columYという制約に対し、columX, columYに対応するDBフィールド変数をそれぞれ、
fieldX1, FieldX2, …，fieldXn, filedY1, fieldY2, …，fieldXm
とする。ここで、fieldXi == any FieldY (但し、i = 1〜m, any FieldYmのいずれか)という整数制約を生成し、整数変数同士の比較という制約に変形することを指す。
【０１３１】
ステップ８４０）  各カラム存在参照を含む制約のカラム型がString型（文字列型）（図６（Ａ））である場合は、文字列型の外部キーに関する制約をDBフィールド変数に対する制約として展開する。この制約の展開とは、入力された文字列型外部キーに関する∃columX == ∃columYという制約に対し、columX, columYに対応するDBフィールド変数をそれぞれ、
fieldX1, fieldX2, …, filedXn, fieldY1, fieldY2, …, fieldXm
とする。ここで、fieldXi equalsString anyFieldY（但し、i = 1〜m, anyFieldYはfieldY1〜fieldYmのいずれ）という整数制約を生成し、文字列変数同士の比較という制約に変形することを指す。
【０１３２】
上記のDBレコード件数決定部１２０の、図５の条件（３）（DB初期状態に対する制約）に含まれる制約のうち、DBレコードの主キー、外部キーに関する制約を選び出し、整数変数同士の比較、文字列変数同士の比較という種類の制約に変形させることにより、主キー、外部キー制約を、整数型変数同士の比較、文字列型同士の比較という制約に変換する。図５の条件（１）、条件（２）の制約と連立させて解いているため、DB定義を満たし、かつ、処理の分岐を制御できるＤＢ初期状態値を生成できる。
【０１３３】
次に、整数・文字列長決定部１３０の図９のＳ１３０の処理について説明する。
【０１３４】
図２０は、本発明の一実施の形態における図９のＳ１３０の詳細フローチャートである。
【０１３５】
ステップ４１０）  整数・文字列長決定部１３０は、テストケース記憶部１６０からテストケースｂを読み込む。
【０１３６】
ステップ４２０）  取得したテストケースｂに含まれる制約集合から文字列型変数同士の包含関係に関係する文字列制約を選び出す。文字列制約の例を図２１（ａ）に示す。
【０１３７】
ステップ４３０）  ステップ４２０で選択された文字列制約における左側の文字列因子を文字列親ノードとし、右側の文字列因子を文字列子ノードとする文字列包含関係木を作成する。文字列演算子別子ノード群は、文字列演算子が図８（D）に示す文字列比較演算子テーブルの前方一致、部分一致、後方一致、等価に登録されている順に並べ、文字列包含関係木リストを作成する。文字列包含関係木リストの例を図２１（ｂ）に示す。
【０１３８】
ステップ４４０）  文字列包含関係木リストを取得すると、空のリストを生成し、各文字列包含関係木リストに対し、深さ優先順で探索を行い、各文字列親子ノードをリストに入れていき、文字列親子ノードリストを作成する。文字列親子ノードリストの例を図２１（ｃ）に示す。
【０１３９】
ステップ４５０）  ステップ４４０において生成された文字列親子ノードリストの各文字列親子ノードに対して、当該文字列親子ノードリストから文字列変数の文字列長に関する制約を抽出する。抽出例を図２１（ｄ）に示す。図２１の例において、同図（ｃ）の文字列C、Ｄの文字列長の関係はC>=Dであり、文字列A，B，Cの文字列長の関係はＡ>=C＋Bであり、文字列EとＦの文字列長の関係はE＝Fであることから、文字列長に関する制約として、
Length(A) >= Length(C)+Length(B)
Length(C) >= Length(D)
Length(E )== Length(F)
を得る（図６（Ｂ））。当該ステップ４５０の詳細については図２２で後述する。
【０１４０】
ステップ４６０）  上記の制約集合の中から整数制約（文字列長に関する制約も整数制約であるのでこれに含まれる）を全て選び出す。
【０１４１】
ステップ４７０）  選び出された整数制約の整数の不等式となっているため、これを連立不等式として既存技術（SMT Arithmetic Theory, シンプレックス法）を用いて解き、制約を満たすレコード件数の値を求める。当該シンプレックス法の他に、SMTやSolver等を用いてもよい。これらの解法は高速であるため、実用的な時間で制約を解き、入力値とDB初期状態の組み合わせを特定できる。
【０１４２】
次に、上記のステップ４５０の動作を説明する。
【０１４３】
図２２は、本発明の一実施の形態における図２０のＳ４５０の詳細フローチャートである。
【０１４４】
ステップ９１０）  整数・文字列長決定部１３０は、ステップ４４０で生成された文字列親子ノードリストを読み込む。
【０１４５】
ステップ９２０）  読み込まれた文字列親子ノードリストの文字列親子ノードの文字列因子をs0、文字列比較演算子が文字列比較演算子テーブルの等価に属する文字列比較演算子別ノード群の文字列子ノードの文字列因子をs１とおく。Length(s0)==Length(s1)という整数制約を全ての文字列子ノードに対して生成する。
【０１４６】
ステップ９３０）  次に、文字列同士の部分一致に関する文字列長制約（図６（Ａ））を抽出する。具体的には、ステップ９１０で読み込まれた文字列親子ノードのうち、文字列親ノードの文字列因子をs0、文字列比較演算子が文字列比較演算子テーブル（図８（D））の前方一致に含まれる文字列比較演算子別ノード群の文字列子ノードの文字列因子をshとする。文字列比較演算子が文字列比較演算テーブルの部分一致に含まれる文字列比較演算子別ノード群の文字列子ノードの文字列因子をs１，s２，…，snとする。文字列比較演算子が文字列比較演算子テーブル（図８（D））の前方一致に含まれる文字列比較演算子別ノード群の文字列子ノードの文字列因子をstとおき、
Length(s0)>=Length(sh)+Length(s1)+…+Length(sn)+Length(st)
という整数制約を生成し、これを文字列長に関する整数制約（図６（Ｂ））としてテストケース記憶部１６０に格納する。
【０１４７】
上記の整数・文字列長決定部１３０の処理により、入れ子の外側の配列から順に、その配列の長さを決めていくことにより、最終的に整数に関する制約について連立不等式として解ける状態になり、配列の要素を求めることが可能となり、分割して管理されている複雑なデータ構造（入れ子の配列）に対して適切にテストデータを生成することが可能となる。
【０１４８】
また、文字列の長さに関する制約を残さず抽出することで、文字列の長さを先に求めることができ、文字決定部１４０において解ける状態になるため、文字列同士の包含関係を満たしたテストデータを生成することが可能となる。
【０１４９】
次に、文字決定部１４０における図９のＳ１４０の処理を詳細に説明する。
【０１５０】
図２３は、本発明の一実施の形態における図９のＳ１４０の詳細フローチャートであり、図２４は、本発明の一実施の形態における文字決定部の処理を示す。
【０１５１】
ステップ５１０）  文字決定部１４０は、テストケース記憶部１６０から読み込んだテストケースｃの変数集合から文字列型変数を選ぶ。
【０１５２】
ステップ５２０）  ステップ５２０で選択された文字列型変数の文字列長変数の値の分だけ文字列型変数を生成し、文字列型変数のメンバとする。文字列型変数のSymbolには全ての文字列型変数で異なる一意性のある記号（図２４では「σ１」、「σ２」を割り当てる（図２４（a））。
【０１５３】
ステップ５３０）  文字列親子ノードリスト（図２４（ｃ））を読み込む。なお、文字列親子ノードリストは、対応する文字型変数のSymbol（図２４の例では「σ」）が揃えてある。
【０１５４】
ステップ５４０）  文字列親子ノードリストの各文字列親子ノードに対して、文字列親子ノード（図２４（ｃ））と文字列子ノードの対応する文字を同じ変数で揃える（図２４（ｄ））。当該処理は、文字列変数同士の対応する位置に存在する文字を一致させる処理であるため、文字列同士の包含関係を満たしたテストデータを生成することができる。詳細については、図２５で後述する。
【０１５５】
ステップ５５０）  文字変数に具体的な文字値を割り当てる。例えば、"a"〜"ｚ"の範囲のアルファベットからランダムに選んだ文字を当てはめていくという方法がある。このようにして割り当てられた文字変数の値をテストケース記憶部１６０に出力する。
【０１５６】
次に、上記の図２３のＳ５４０の処理について説明する。
【０１５７】
図２５は、本発明の一実施の形態における図２３のＳ５４０の詳細フローチャートである。
【０１５８】
ステップ１０１０）  文字列決定部１４０は、文字列親子ノードを読み込む。
【０１５９】
ステップ１０２０）  文字列現在位置を０に設定する。
【０１６０】
ステップ１０３０）  読み込まれた文字列親子ノードの各文字列比較演算子別子ノード群に対して、当該文字列比較演算子ノード群の各文字列子ノードの文字列比較演算子の種類が、前方一致または部分一致、等価、後方一致のいずれであるかを判定する。前方一致または部分一致の場合はステップ１０４０へ、等価の場合はステップ１０５０へ、後方一致の場合はステップ１０６０の処理に移行する。以下、ステップ１０８０までの処理を文字列比較演算子別子ノード群の各文字列子ノードに対して行う。
【０１６１】
ステップ１０４０）  前方一致、部分一致要の文字列型変数ペアリストを生成する。詳しくは、文字列親ノードの文字列をps、文字列子ノードの文字列をcsとおき、
[(ps[文字列現在位置]，cs[0］），…，(ps[文字列現在位置＋１]，cs[Length(cs)-1])
という文字列変数ペアリストを作成する。そして、文字列現在位置にLength(cs)を加え、ステップ１０６５に移行する。
【０１６２】
ステップ１０５０）  等価用の文字型変数ペアリストを作成する。詳しくは、文字列親ノード及び文字列子ノードを取得し、文字列親ノードの文字列をps、文字列子ノードのm時列をcsとおき、
[ps[0], cs[0], …, (ps[Length(ps)−1], cs[Length(cs)−1])
という文字列変数ペアリストを作成する。そして文字列現在位置にLength(cs)を加え、ステップ１０６５の処理に移行する。
【０１６３】
ステップ１０６０）  後方一致用の文字列型変数のペアリストを作成する。詳しくは、文字列親ノード及び文字列子ノードを取得し、文字列親ノードの文字列をps、文字列子ノードの文字列をcsとおき、
[(ps)[Length(ps)−Length(cs)], cs[0]], …, (ps[Length(ps)−1], cs[Length(cs)−1])
という文字列変数ペアリストを作成し、ステップ１０６５の処理に移行する。
【０１６４】
ステップ１０６５）  テストデータ生成不可フラグを用意し、"true"で初期化する。
【０１６５】
ステップ１０７０）  上記のステップ１０４０，１０５０，１０６０で生成された文字型変数ペアリストの各文字型変数ペアの文字を揃える。詳しくは、文字列比較演算子、及び、ステップ１０６０で生成された文字型変数ペアリストを取得し、文字列比較演算子に基づき文字列型変数ペアの文字を揃える。詳細については図２６、図２７で後述する。
【０１６６】
ステップ１０８０）  テストデータ生成不可フラグの値が"true"または、"false"かを判定し、"true"の場合は、現在テストデータ生成を試みているテストケースにおいて、テストデータ生成不可であることを示すエラーメッセージを出力する。
【０１６７】
図２６は、本発明の一実施の形態における図２５のＳ１０７０の詳細フローチャートである。
【０１６８】
ステップ１１１０）  ステップ１０４０，１０５０，１０６０で生成された文字型変数ペアを読み込む。
【０１６９】
ステップ１１１５）  ステップ１０１０で読み込まれた文字列親子ノードのメンバである各文字列比較演算子別子ノード群のメンバの文字列比較演算子を抽出する。
【０１７０】
ステップ１１２０）  テストケース記憶部１６０に格納されている文字列比較演算子テーブル（図８（Ｄ））を参照し、ステップ１１１５で読み込まれた文字列比較演算子が"通常比較"または"否定比較"かを判定する。"通常比較"の場合は、ステップ１１２５に移行し、"否定比較"の場合は、ステップ１１６０に移行する。
【０１７１】
ステップ１１２５）  文字列変数ペアの組は「文字列変数同士」、「文字列変数と定数文字列（もしくは値の決まった文字型変数）」、「定数文字同士」のいずれであるかを判定する。
「文字列変数同士」の場合はステップ１１３０に移行し、文字列変数と定数文字列（もしくは値の決まった文字型変数）」の場合はステップ１１４０に移行し、「定数文字同士」の場合はステップ１１５０に移行する。
【０１７２】
ステップ１１３０）  文字列変数ペアの組が「文字列変数同士」の場合は、文字型変数を揃え、当該処理を終了する。
【０１７３】
ステップ１１４０）  文字列変数ペアの組が「文字列変数と定数文字列（もしくは値の決まった文字型変数）」である場合は、文字列変数の値を定数文字に置き換え、当該処理を終了する。
【０１７４】
ステップ１１５０）  文字列変数ペアの組が「定数文字同士」の場合は、定数同士が等価であるかを確認し、等価でない場合は、テストデータ生成不可エラーを出力し、当該処理を終了する。
【０１７５】
ステップ１１６０）  ステップ１１２０において、文字列比較演算子の種類が"否定比較"である場合は、文字型変数の組が、「文字列変数同士」、「文字型変数と定数文字列（もしくは値の決まった文字型変数）」、「定数文字同士」のいずれであるかを判定し、「文字列変数同士」である場合はステップ１１７０に移行し、「文字型変数と定数文字列（もしくは値の決まった文字型変数）」である場合はステップ１１８０に移行し、「定数文字同士」である場合はステップ１１９０に移行する。
【０１７６】
ステップ１１７０）  文字型変数の組が「文字列変数同士」である場合は、文字型変数を揃え、当該処理を終了する。具体的には、文字列変数ペアを構成する２つの文字型変数が異なる文字であるというチェック（テストデータ生成フラグ="false"）をつける。
【０１７７】
ステップ１１８０）  文字型変数の組が「文字型変数と定数文字列（もしくは値の決まった文字型変数）」である場合は、文字型変数の値を定数文字と異なる文字に置き換え、当該処理を終了する。
【０１７８】
ステップ１１９０）  文字型変数の組が「定数文字同士」である場合は、定数同士が非等価であることを確認し、テストデータ生成不可フラグを"false"にし、当該処理を終了する。なお、この処理以前のテストデータ生成不可フラグは、ステップ１０６５において"true"で初期化されている。
【０１７９】
以下に、上記のステップ１０７０、ステップ１１７０の定数文字の非等価について説明する。
【０１８０】
図２７は、本発明の一実施の形態におけるＳ１０７０とＳ１１７０の定数文字の非等価を説明するための図である。ここでは、前方一致の否定比較"Ａ notHeadSubString Ｂ"を例とする。なお、テストデータ生成不可フラグの初期値は"true"であるとする。
【０１８１】
図２７の例１では、ＡとＢの対応箇所で１箇所でも非等価な文字があれば、ＡとＢは非等価な文字となり、テストデータ生成不可フラグは"false"となる。ステップ１１７０の１回目の処理では、ａ１＝"あ"、ｂ１="あ"で等価であるので何も行わないが、２回目の処理では、ａ２＝"い"、ｂ＝"う"であり非等価であるので、データ生成不可フラグを"false"とする。
【０１８２】
図２７の例２では、ＡとＢの対応箇所で１箇所でも非等価な文字がない場合（全て等価だった場合）は、ＡとＢは等価な文字列となるため、テストデータ生成不可フラグは"true"となり、ステップ１０７でテストデータ生成不可エラーが出力される。ステップ１１７０の１回目の処理では、ａ１＝"あ"、ｂ１＝"あ"で等価で何も行わない。また、１回目の処理でもａ２＝"い"、ｂ２="い"で等価であるので何も行わない。このとき、テストデータ不可フラグは"true"のままとなる。
【０１８３】
上記の文字決定部１４０の、図５に示す条件（１）、条件（２）、条件（３）に含まれる制約のうち、文字型変数同士の包含関係に基づき、文字型変数同士の対応する位置に存在する文字がそれぞれ一致するように文字を決定することにより、文字型変数同士の対応する位置に存在する文字が一致するようになるため、文字列同士の包含関係を満たしたテストデータを生成することが可能となる。
【０１８４】
なお、上記のテストデータ生成装置の各構成の動作をプログラムとして構築し、テストデータ生成装置として利用されるコンピュータにインストールして実行させる、または、ネットワークを介して流通させることが可能である。
【０１８５】
本発明は上記の実施の形態に限定されることなく、特許請求の範囲内において種々変更・応用が可能である。
【符号の説明】
【０１８６】
１０  ユーザ端末
１００  テストデータ生成装置
１１０  テストケース抽出部
１２０  DBレコード件数決定部
１３０  整数・文字列長決定部
１４０  文字決定部
１５０  テストデータ出力部
【図１】
0005514146.tif 000002
【図２】
0005514146.tif 000003
【図３】
0005514146.tif 000004
【図４】
0005514146.tif 000005
【図５】
0005514146.tif 000006
【図６】
0005514146.tif 000007
【図７】
0005514146.tif 000008
【図８】
0005514146.tif 000009
【図９】
0005514146.tif 000010
【図１０】
0005514146.tif 000011
【図１１】
0005514146.tif 000012
【図１２】
0005514146.tif 000013
【図１３】
0005514146.tif 000014
【図１４】
0005514146.tif 000015
【図１５】
0005514146.tif 000016
【図１６】
0005514146.tif 000017
【図１７】
0005514146.tif 000018
【図１８】
0005514146.tif 000019
【図１９】
0005514146.tif 000020
【図２０】
0005514146.tif 000021
【図２１】
0005514146.tif 000022
【図２２】
0005514146.tif 000023
【図２３】
0005514146.tif 000024
【図２４】
0005514146.tif 000025
【図２５】
0005514146.tif 000026
【図２６】
0005514146.tif 000027
【図２７】
0005514146.tif 000028