(57)【特許請求の範囲】
【請求項１】
プログラムのテストに用いられるデータベース内のテストデータについての制約を表す第１の制約データを格納する第１データ格納部に格納されている前記第１の制約データに含まれる、前記テストデータに含まれるべきレコードの選択に関する制約であるレコード選択制約に従って選択したレコードが満たすべき制約であるレコード単位制約についての第１の表現パターンを、未解釈関数で置換することによって第２の制約データを生成し、第２データ格納部に格納する第１制約生成ステップと、
前記第２データ格納部に格納されている前記第２の制約データに対する充足可能性判定処理を充足可能性判定処理部に実施させ、前記第１の制約データについての第１の充足値を前記充足可能性判定処理部から取得し、第３データ格納部に格納するステップと、
前記第３データ格納部に格納されている前記第１の充足値と、前記第１の制約データに含まれる第１の表現パターンと、前記第１の制約データに含まれる、前記第１の表現パターン以外の制約についての第２の表現パターンとから、前記レコード単位制約についての第３の制約データを生成し、第４データ格納部に格納する第２制約生成ステップと、
前記第４データ格納部に格納されている前記第３の制約データに対する充足可能性判定処理を充足可能性判定処理部に実施させ、前記第３の制約データについての第２の充足値を前記充足可能性判定処理部から取得し、第５データ格納部に格納するステップと、
を、コンピュータに実行させるためのテストデータ生成プログラム。
【請求項２】
前記第１の制約データに含まれる文字列変数を数値型の変数に変換する変換ステップと、
前記第５データ格納部に格納されている前記第２の充足値に含まれ且つ前記変換ステップで変換された、前記数値型の変数の値を、文字列に変換するステップと、
を、さらに前記コンピュータに実行させるための請求項１記載のテストデータ生成プログラム。
【請求項３】
前記第２制約生成ステップが、
前記第１の充足値に含まれる前記未解釈関数の入出力対応データから、前記第１の表現パターンの各々の真偽を特定し、前記第１の表現パターンの各々と対応する真偽との組み合わせについての制約を生成する第１生成ステップと、
前記第１の充足値から、前記第２の表現パターンの各々の真偽を特定し、前記第２の表現パターンの各々と対応する真偽との組み合わせについての制約を生成する第２生成ステップと、
前記第１の充足値に含まれる前記データベース内の各レコードの値を表す制約と、前記第１生成ステップ及び前記第２生成ステップで生成された制約とを含む制約データを生成するステップと、
を含む請求項１又は２記載のテストデータ生成プログラム。
【請求項４】
前記第１生成ステップが、
前記第１の表現パターンの各々と対応する真偽との組み合わせについての制約を、第１の表現パターンに関連する制約定義に従って展開するステップ
をさらに含む請求項３記載のテストデータ生成プログラム。
【請求項５】
プログラムのテストに用いられるデータベース内のテストデータについての制約を表す第１の制約データを格納する第１データ格納部に格納されている前記第１の制約データにおいて、前記テストデータに含まれるべきレコードの選択に関する制約であるレコード選択制約に従って選択したレコードが満たすべき制約であるレコード単位制約についての第１の表現パターンを、未解釈関数で置換することによって第２の制約データを生成し、第２データ格納部に格納する第１制約生成ステップと、
前記第２データ格納部に格納されている前記第２の制約データに対して充足可能性判定処理を実施し、前記第１の制約データについての第１の充足値を取得し、第３データ格納部に格納するステップと、
前記第３データ格納部に格納されている前記第１の充足値と、前記第１の制約データに含まれる第１の表現パターンと、前記第１の制約データに含まれる、前記第１の表現パターン以外の制約についての第２の表現パターンとから、前記レコード単位制約についての第３の制約データを生成し、第４データ格納部に格納する第２制約生成ステップと、
前記第４データ格納部に格納されている前記第３の制約データに対して充足可能性判定処理を実施し、前記第３の制約データについての第２の充足値を取得し、第５データ格納部に格納するステップと、
を含み、コンピュータにより実行されるテストデータ生成方法。
【請求項６】
プログラムのテストに用いられるデータベース内のテストデータについての制約を表す第１の制約データを格納する第１データ格納部に格納されている前記第１の制約データにおいて、前記テストデータに含まれるべきレコードの選択に関する制約であるレコード選択制約に従って選択したレコードが満たすべき制約であるレコード単位制約についての第１の表現パターンを、未解釈関数で置換することによって第２の制約データを生成し、第２データ格納部に格納する手段と、
充足可能性判定処理部と、
前記第２データ格納部に格納されている前記第２の制約データに対して充足可能性判定処理を前記充足可能性判定処理部に実施させ、前記第１の制約データについての第１の充足値を前記充足可能性判定処理部から取得し、第３データ格納部に格納する処理手段と、
前記第３データ格納部に格納されている前記第１の充足値と、前記第１の制約データに含まれる第１の表現パターンと、前記第１の制約データに含まれる、前記第１の表現パターン以外の制約についての第２の表現パターンとから、前記レコード単位制約についての第３の制約データを生成し、第４データ格納部に格納する手段と、
を有し、
前記処理手段は、
前記第４データ格納部に格納されている前記第３の制約データに対して充足可能性判定処理を前記充足可能性判定処理部に実施させ、前記第３の制約データについての第２の充足値を前記充足可能性判定処理部から取得し、第５データ格納部に格納する、
テストデータ生成装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本技術は、テストデータの生成技術に関する。
【背景技術】
【０００２】
業務アプリケーションの振る舞いをテストするためのテストデータは、テスト項目に関する前提条件、テストに用いるデータベース（ＤＢ）におけるテーブルの相関関係等の様々な制約を同時に満たす画面入力データ及びＤＢデータが含まれる。また、このようなテストデータの大部分は、データベースのデータであるため、テーブル構造に関する制約を満たすテストデータを生成することは、大きな問題の一つである。
【０００３】
近年、コンピュータの性能向上や、ＳＡＴ（SATisfiability problem）やＳＭＴ（Satisfiability Modulo Theories）といった論理式の充足可能性問題に関する研究の進歩を背景として、論理式の充足可能性問題を解くソルバ（ＳＡＴソルバ、ＳＭＴソルバ）等を用い、データが満たすべき条件の充足解を求めることによって、テストデータを生成する技術が登場してきている。特に、テーブルデータ生成においては、テーブルのレコード数上限を定めて制約を決定可能な問題に変換し、ＳＭＴソルバを用いて解くというアプローチがある。
【０００４】
一般に、充足可能性判定に要する計算量は、式の大きさ等で定量的に表現される制約の複雑さに対して、指数関数的なオーダーで急激に増加する。従来技術における充足可能性判定の対象となる制約では、どのレコードが条件を満たすかというレコードの選択に関する制約と、選択したレコードが満たすべき制約の組み合わせを同時に解くことになる。そのため、選択したレコードが満たすべき制約が単純な等価関係や大小関係のみである場合に適用範囲を狭めれば、大規模なデータを生成することができる。すなわち、文字列の詳細に立ち入らずに処理できるため、レコードの選択に関する制約と選択したレコードが満たすべき制約が組み合わさっても複雑度は比較的低いままとなる。  
【０００５】
しかしながら、テストデータ生成の実際の制約において、文字列の前方一致や部分一致をはじめとする複雑な制約が出現することは珍しくない。すなわち、前方一致や部分一致といった制約を解くためには、文字列データを配列で表現する等、文字列の詳細に立ち入った形で解くことになる。そうすると、選択したレコードが満たすべき制約の複雑さが増すため、レコードの選択と組み合わせた全体の制約は一層複雑になり、充足値を求めるのに膨大な時間計算量がかかってしまうという問題がある。
【先行技術文献】
【非特許文献】
【０００６】
【非特許文献１】「Decision Procedures: An Algorithmic Point of View」、Daniel Kroening他、ISBN:978-3540741046
【非特許文献２】「SMT Solverを利用したWebアプリケーション用テストデータの生成」、藤原他、情報処理学会第72回全国大会、１−２８１−２８２
【非特許文献３】「Path Feasibility Analysis for String-Manipulating Programs」、Nikolaj Bjorner et al.
【発明の概要】
【発明が解決しようとする課題】
【０００７】
従って、本技術の目的は、一側面において、テストデータを高速に生成するための技術を提供することである。
【課題を解決するための手段】
【０００８】
本テストデータ生成方法は、（Ａ）プログラムのテストに用いられるデータベース内のテストデータについての制約を表す第１の制約データを格納する第１データ格納部に格納されている第１の制約データに含まれる、テストデータに含まれるべきレコードの選択に関する制約であるレコード選択制約に従って選択したレコードが満たすべき制約であるレコード単位制約についての第１の表現パターンを、未解釈関数で置換することによって第２の制約データを生成し、第２データ格納部に格納する第１制約生成ステップと、（Ｂ）第２データ格納部に格納されている第２の制約データに対する充足可能性判定処理を充足可能性判定処理部に実施させ、第１の制約データについての第１の充足値を充足可能性判定処理部から取得し、第３データ格納部に格納するステップと、（Ｃ）第３データ格納部に格納されている第１の充足値と、第１の制約データに含まれる第１の表現パターンと、第１の制約データに含まれる、第１の表現パターン以外の制約についての第２の表現パターンとから、レコード単位制約についての第３の制約データを生成し、第４データ格納部に格納する第２制約生成ステップと、（Ｄ）第４データ格納部に格納されている第３の制約データに対する充足可能性判定処理を充足可能性判定処理部に実施させ、第３の制約データについての第２の充足値を充足可能性判定処理部から取得し、第４データ格納部に格納するステップとを含む。
【発明の効果】
【０００９】
テストデータを高速に生成することができるようになる。
【図面の簡単な説明】
【００１０】
【図１】図１は、実施の形態に係る具体例において想定される商品検索画面の一例を示す図である。
【図２】図２は、本実施の形態に係る具体例における商品検索結果画面の一例を示す図である。
【図３】図３は、本実施の形態に係る具体例における商品発注画面の一例を示す図である。
【図４】図４は、元制約データの一例を示す図である。
【図５】図５は、prefix関数に対応する具体的な制約データを示す図である。
【図６】図６は、本技術の実施の形態に係るテストデータ生成装置の機能ブロック図である。
【図７】図７は、画面定義データの一例を示す図である。
【図８】図８は、テーブル定義データの一例を示す図である。
【図９】図９は、制約語彙定義データの一例を示す図である。
【図１０】図１０は、テストデータ生成装置の処理フローを示す図である。
【図１１】図１１は、未解釈関数割当処理の処理フローを示す図である。
【図１２】図１２は、表現抽出処理の処理フローを示す図である。
【図１３】図１３は、表現抽出リストの一例を示す図である。
【図１４】図１４は、未解釈関数パターンの一例を示す図である。
【図１５】図１５は、未解釈関数割当情報の一例を示す図である。
【図１６】図１６は、制約変換処理の処理フローを示す図である。
【図１７】図１７は、制約変換処理を説明するための図である。
【図１８】図１８は、制約変換処理の処理後の制約データ（＝レコード選択部分制約データ）を示す図である。
【図１９】図１９は、ＳＭＴソルバからの１回目の処理結果（商品マスタテーブルのデータ）の一例を示す図である。
【図２０】図２０は、ＳＭＴソルバからの１回目の処理結果（在庫状況テーブルのデータ）の一例を示す図である。
【図２１】図２１は、ＳＭＴソルバからの１回目の処理結果（未解釈関数入出力情報）の一例を示す図である。
【図２２】図２２は、ＳＭＴソルバからの１回目の処理結果に相当する商品検索画面を示す図である。
【図２３】図２３は、テストデータ生成処理の処理フローを示す図である。
【図２４】図２４は、レコード単位部分制約生成処理の処理フローを示す図である。
【図２５】図２５は、割当関数入出力情報生成処理の処理フローを示す図である。
【図２６】図２６は、未解釈関数の値の取得方法を模式的に示す図である。
【図２７】図２７は、割当関数入出力情報リストの一例を示す図である。
【図２８】図２８は、代表値関係情報構成処理の処理フローを示す図である。
【図２９】図２９は、代表値関係情報構成処理にて抽出された関係式の一例を示す図である。
【図３０】図３０は、代表値関係情報の一例を示す図である。
【図３１】図３１は、レコード単位部分制約生成処理の処理フローを示す図である。
【図３２】図３２は、レコード単位部分制約データの一例を示す図である。
【図３３】図３３は、ＳＭＴソルバからの２回目の処理結果に相当する商品検索画面を示す図である。
【図３４】図３４は、ＳＭＴソルバからの２回目の処理結果（商品マスタテーブルのデータ）の一例を示す図である。
【図３５】図３５は、ＳＭＴソルバからの２回目の処理結果（在庫状況テーブルのデータ）の一例を示す図である。
【図３６】図３６は、文字列変換後の商品検索画面の一例を示す図である。
【図３７】図３７は、文字列変換後の商品マスタテーブルの一例を示す図である。
【図３８】図３８は、文字列変換後の在庫状況テーブルの一例を示す図である。
【図３９】図３９は、コンピュータの機能ブロック図である。
【発明を実施するための形態】
【００１１】
以下、本技術の実施の形態を詳細に説明するが、実施の形態の説明が分かりやすくなるように、以下に示すような具体例に沿って処理を説明するものとする。すなわち、在庫管理システムの一部についてテストを行うことを想定する。より具体的には、図１に示すように、商品検索画面において商品名の入力欄に、例えば「ＡＢＣ」といった商品名についての文字列を入力し、検索ボタンをクリックして、在庫管理システムに商品検索を行わせる場合のテストを想定する。ここで、商品名「ＡＢＣ」に完全一致する商品名の在庫データだけを抽出するのであれば従来技術でも十分対応可能であるが、入力された文字列に前方一致する商品名についても抽出する場合には、以下で述べるような本実施の形態を用いる方が、高速にテストデータを生成することができる。本具体例では、前方一致を取り扱うことにする。
【００１２】
本具体例の在庫管理システムは、商品名及び単価を保持する商品マスタテーブルと、商品名及び在庫数を保持する在庫状況テーブルとをデータベースとして管理している。このような在庫管理システムは、例えば図１のような検索の指示に応じて、（Ａ）複数の商品が抽出されて在庫もある場合に図２に示すような商品検索結果画面を出力する、（Ｂ）１つの商品のみが抽出されて在庫もある場合に図３に示すような商品発注画面を出力する、（Ｃ）１つの商品も抽出されず又は１つの商品のみ抽出されたが在庫がない場合エラー画面を出力する、のいずれかの処理を実施する。それぞれについてテストデータを生成することになるが、本具体例では、（Ｂ）の場合のためのテストデータを生成することにする。
【００１３】
この場合のテスト項目は以下のとおりである。
商品検索画面で検索ボタン押下時に、
（１）入力された商品名に前方一致する商品が商品マスタテーブルにただ１件存在し、且つ
（２）当該商品に対応する在庫状況テーブルの在庫数が１以上の場合、該当する商品の発注画面が表示される。
【００１４】
また、商品マスタテーブル及び在庫状況テーブルについてのＥＲ（多重度）制約は、以下のとおりである。
（３）商品マスタテーブルの全てのレコードに対して、商品が対応する在庫状況テーブルのレコードが０件又は１件存在し、且つ
（４）在庫状況テーブルの全てのレコードに対して、商品が対応する商品マスタテーブルのレコードが１件存在する。
【００１５】
従来技術によれば、このようなテスト項目及びＥＲ制約に応じた制約データを自動的に生成することができ、本具体例については例えば図４に示すような制約データが得られる。なお、ここでは商品マスタテーブルの最大レコード数が３に設定されており、在庫状況テーブルの最大レコード数が２に設定されている。但し、prefix(X,Y)は、ＹがＸに前方一致するという論理関数を表している。
【００１６】
図４の例では、（１）及び（２）に関する制約の組み合わせが３セット、（３）に関する制約が３セット、（４）に関する制約が２セット含まれている。（１）及び（２）に関する制約の組み合わせについてはＯＲ条件で連結されており、（３）に関する制約はＡＮＤ条件で連結されており、（４）に関する制約もＡＮＤ条件で連結されている。さらに、（１）及び（２）に関する制約の組み合わせ全体と、（３）に関する制約と、（４）に関する制約とは、ＡＮＤで連結されている。
【００１７】
（１）及び（２）に関する制約の組み合わせの最初のものは、（入力された商品名が、商品マスタテーブルの０番目のレコードにおける商品カラムの値と一致しており）、且つ（商品マスタテーブルの０番目のレコードにおける商品カラムの値と在庫状況テーブルの０番目のレコードにおける商品カラムの値と一致し且つ在庫状況テーブルの０番目のレコードにおける在庫数が１以上であるか、又は商品マスタテーブルの０番目のレコードにおける商品カラムの値と在庫状況テーブルの１番目のレコードにおける商品カラムの値と一致し且つ在庫状況テーブルの１番目のレコードにおける在庫数が１以上である）、という制約を表している。以下、商品マスタテーブルの１番目が該当する場合と、２番目が該当する場合とについて制約が規定されている。
【００１８】
（３）に関する制約の最初のものは、商品マスタテーブルの０番目のレコードにおける商品カラムの値と在庫状況テーブルの０番目のレコードにおける商品カラムの値とが一致しているという論理が偽であるか、又は商品マスタテーブルの０番目のレコードにおける商品カラムの値と在庫状況テーブルの１番目のレコードにおける商品カラムの値とは一致しているという論理が偽である、という制約を規定している。これは、（３）の制約が「０件又は１件」という条件となっているためである。以下、商品マスタテーブルの１番目のレコード、２番目のレコードについての制約が規定されている。
【００１９】
（４）に関する制約の最初のものは、在庫状況テーブルの０番目のレコードにおける商品カラムの値と商品マスタテーブルの０番目のレコードにおける商品カラムの値が一致するか、在庫状況テーブルの０番目のレコードにおける商品カラムの値と商品マスタテーブルの１番目のレコードにおける商品カラムの値が一致するか、又は在庫状況テーブルの０番目のレコードにおける商品カラムの値と商品マスタテーブルの２番目のレコードにおける商品カラムの値が一致するか、という制約を規定している。以下、在庫状況テーブルの１番目のレコードについての制約も規定されている。
【００２０】
なお、図４では、分かりやすいようにprefixという論理関数を導入しているが、実際には、各prefixの論理関数は図５のように展開される制約となる。具体的には、prefix(商品名，商品マスタ[0].商品）、すなわち、入力商品名と商品マスタテーブルの０番目のレコードにおける商品カラムの値との前方一致という制約を展開すると図５のようになる。但し、図５において、length(X)は、文字列Ｘの長さを出力する関数である。ここでは最大文字数を５に限定している。
【００２１】
図５に示した制約は、以下のような事項を規定したものである。
（商品名の長さが１で、商品マスタ[0].商品の１文字目に一致）ｏｒ
（商品名の長さが２で、商品マスタ[0].商品の１及び２文字目に一致）ｏｒ 
（商品名の長さが３で、商品マスタ[0].商品の１乃至３文字目に一致）ｏｒ 
（商品名の長さが４で、商品マスタ[0].商品の１乃至４文字目に一致）ｏｒ 
（商品名の長さが５で、商品マスタ[0].商品の１乃至５文字目に一致）
【００２２】
このように制約データには、どのレコードが条件を満たすのかというレコードの選択に関する制約（レコード選択制約と呼ぶ）と、選択したレコードが満たすべき制約（レコード単位制約）とが含まれている。本具体例では、prefixという論理関数で表している部分がレコード単位制約を表しており、それ以外の部分がレコード選択制約となっている。このprefixは、本具体例でも９つ含まれており、これを全て展開すると、非常に複雑な制約になることが分かる。
【００２３】
このように、レコード選択制約とレコード単位制約とを同時に解こうとすると、制約が複雑化してしまい、ＳＭＴソルバの処理時間が長くなってしまう。
【００２４】
本実施の形態では、以下で詳細に述べるように、レコード選択制約を先に解いて、その結果を用いてレコード単位制約を再構成して解くという手法を採用する。このように、１回に解くべき制約を単純化して、個々の制約についての処理時間を短縮することで、全体としての処理時間をも短縮する。以下、このような手法を実際に行う際の構成及び処理について説明する。
【００２５】
図６に、本技術の実施の形態に係るシステムの概要を示す。本実施の形態に係るテストデータ生成装置１００は、元制約データ格納部１０３と、型情報格納部１０４と、制約語彙定義格納部１０５と、未解釈関数割当部１０６と、第１データ格納部１０７と、制約変換部１０８と、第２データ格納部１０９と、ＳＭＴソルバインタフェース部１１０と、第３データ格納部１１１と、充足値反映部１１２と、第４データ格納部１１３と、制約構成部１１４と、第５データ格納部１１５と、第６データ格納部１１６と、充足値変換部１１７と、第７データ格納部１１８とを有する。
【００２６】
未解釈関数割当部１０６は、元制約データ格納部１０３と型情報格納部１０４と制約語彙定義格納部１０５とに格納されているデータを用いて処理を行い、第１データ格納部１０７に処理結果を格納する。制約変換部１０８は、型情報格納部１０４と第１データ格納部１０７と元制約データ格納部１０３とに格納されているデータを用いて処理を行い、第２データ格納部１０９に処理結果を格納する。ＳＭＴソルバインタフェース部１１０は、第２データ格納部１０９に格納されているデータをＳＭＴソルバ２００に出力し、ＳＭＴソルバ２００から受け取った処理結果を第３データ格納部１１１に格納する。また、ＳＭＴソルバインタフェース部１１０は、第５データ格納部１１５に格納されているデータをＳＭＴソルバ２００に出力し、ＳＭＴソルバ２００から受け取った処理結果については第６データ格納部１１６に格納する。
【００２７】
充足値反映部１１２は、元制約データ格納部１０３と第１データ格納部１０７と第３データ格納部１１１とに格納されているデータを用いて処理を行い、処理結果を第４データ格納部１１３に格納する。制約構成部１１４は、第３データ格納部１１１と第４データ格納部１１３と制約語彙定義格納部１０５と元制約データ格納部１０３とに格納されているデータを用いて処理を行い、処理結果を第５データ格納部１１５に格納する。充足値変換部１１７は、第６データ格納部１１６に格納されているデータを用いて処理を行い、処理結果を第７データ格納部１１８に格納する。
【００２８】
元制約データ格納部１０３には、例えば、図４に示されているような元制約データが格納されているものとする。また、型情報格納部１０４には、商品検索画面の画面定義データと、商品マスタテーブル及び在庫状況テーブルのテーブル定義データとが格納される。型情報格納部１０４には、例えば図７に示すような画面定義データが格納される。図７の例では、定義されている画面の名称（「商品検索画面」）と、入力欄の項目名（「商品名」）と、当該項目の型（「文字列」）と、桁数（「５」）とが定義されている。
【００２９】
また、型情報格納部１０４には、例えば図８に示すようなテーブル定義データも格納されている。図８の例では、テーブル名と、テーブル毎に、テーブルに含まれるカラムとカラムの型及び桁と、が登録されるようになっている。
【００３０】
さらに、制約語彙定義格納部１０５には、例えば図９に示すような制約語彙定義データが格納されている。図９の例では、元制約データで用いられているprefixの具体的な定義が規定されている。ここではＸの文字数がＹの文字数以上の場合（語彙名prefix1）と、Ｘの文字数がＹの文字数未満の場合（語彙名prefix2）が規定されている。これらは、前方一致を規定している。
【００３１】
また、ＳＭＴソルバ２００は、述語論理式の充足可能性判定問題を解く機構であり、テストデータ生成装置１００に含まれる場合もあれば、別装置にて実装される場合もある。ＳＭＴソルバ２００は、Ｙｉｃｅｓ（http://yices.csl.sri.com/）、ＣＶＣ３（http://www.cs.nyu.edu/acsys/cvc3/）、Ｚ３（http://research.microsoft.com/en-us/um/redmond/projects/z3/）などが既に実装されており、Daniel Kroening et. al.,"Decision Procedures: An Algorithmic Point of View", ISBN：978-3540741046 にも詳細が記載されているので、ここではこれ以上述べない。
【００３２】
次に、図１０乃至図３８を用いてテストデータ生成装置１００の処理内容について説明する。まず、未解釈関数割当部１０６は、元制約データ格納部１０３と型情報格納部１０４と制約語彙定義格納部１０５とに格納されているデータを用いて、未解釈関数割当処理を実施する（図１０：ステップＳ１）。未解釈関数割当処理については、図１１乃至図１５を用いて説明する。
【００３３】
未解釈関数割当部１０６は、制約語彙定義格納部１０５に格納されている制約語彙定義データに含まれている制約語彙定義のうち、未処理の制約語彙定義を１つ特定する（図１１：ステップＳ１１）。そして、未解釈関数割当部１０６は、表現抽出処理を実施する（ステップＳ１３）。表現抽出処理については、図１２を用いて説明する。
【００３４】
未解釈関数割当部１０６は、ステップＳ１１で特定された制約語彙定義におけるシグニチャに合致する式を、元制約データ格納部１０３に格納されている元制約データから抽出する（図１２：ステップＳ３１）。例えば図９に示したprefix1がステップＳ１１で特定されたものとする。そして、このprefix1のパターンにおける引数Ｘ及びＹは共に文字列型であるから、図４に示されている元制約データから、prefix1のパターンと同じ表記prefixの式あって、引数が共に文字列型となっている式を抽出する。この場合、型情報格納部１０４に格納されているデータから、画面定義における商品名の型が「文字列」であり、商品マスタテーブルの商品カラムの型が「文字列」であることが分かる。そうすると、prefix1のパターンのシグニチャに合致すると判断できるので、prefix(商品名，商品マスタ[0].商品)、prefix(商品名，商品マスタ[1].商品)及びprefix(商品名，商品マスタ[2].商品)が抽出される。
【００３５】
そして、未解釈関数割当部１０６は、ステップＳ３１で式が抽出されたか確認する（ステップＳ３３）。抽出されない場合には元の処理に戻る。一方、ステップＳ３１で式が抽出された場合には、未解釈関数割当部１０６は、抽出された式のうち未処理の式を１つ特定する（ステップＳ３５）。そして、未解釈関数割当部１０６は、特定された抽出式の引数と制約語彙定義の条件とを比較する（ステップＳ３７）。図４に示されている元制約データから抽出されたprefix(商品名，商品マスタ[0].商品)が、特定された制約語彙定義prefix1の条件に合致するか否かは、型情報格納部１０４に格納されているデータを基に判断する。具体的には、画面定義における商品名の桁数は文字列「５」であり、商品マスタテーブルの商品カラムの桁数は文字列「５」であるから、特定された制約語彙定義の「条件」maxlength(商品名（５））＝maxlength（商品マスタ．商品（５））が満たされていることが分かる。従って、prefix(商品名，商品マスタ[0].商品)の引数は、特定された制約語彙定義の条件を満たしていると判断される。
【００３６】
条件を満たしていない場合にはステップＳ４３に移行する。一方、条件を満たしている場合には、未解釈関数割当部１０６は、特定された抽出式を表現抽出リストに追加する（ステップＳ４１）。そして、未解釈関数割当部１０６は、未処理の抽出式が存在しているか判断し（ステップＳ４３）、未処理の抽出式が存在している場合にはステップＳ３５に戻る。一方、未処理の抽出式が存在していない場合には、元の処理に戻る。
【００３７】
図１２の処理を図４に示した元制約データに対して行うと、表現抽出リストは図１３に示すようなリストとなる。
【００３８】
図１１の処理の説明に戻って、未解釈関数割当部１０６は、元制約データに該当表現が存在するかを、表現抽出リストで判断する（ステップＳ１５）。表現抽出リストに式が登録されていない場合には、該当表現が存在しないと判断してステップＳ２１に移行する。一方、表現リストに式が登録されている場合には、未解釈関数割当部１０６は、特定された制約語彙定義から、未解釈関数パターンを生成し、第１データ格納部１０７に格納する（ステップＳ１７）。例えば、本具体例では、図１４に示すような未解釈関数パターンのデータが生成され、第１データ格納部１０７に格納される。図１４の例では、パターンＩＤと、制約語彙定義におけるパターン（又は語彙名）と、当該パターンに割り当てられた未解釈関数とが登録されるようになっている。すなわち、ステップＳ１７では、特定された制約語彙定義に対して、１つの未解釈関数を割り当てる。
【００３９】
このような未解釈関数（uninterpreted function）を導入することによって、ＳＭＴソルバ２００は、具体的に制約語彙定義におけるパターンを制約として解くのではなく、他の制約を満たすように未解釈関数の入出力関係を特定するようになる。
【００４０】
未解釈関数は、特定の入力に対する出力の対応関係のみで定義される関数であり、入力から出力を特定する対応表を表現しているともいえる。入力から出力を計算するロジックを無視して関数（すなわち、ここでは制約）を抽象化するために用いられる。例えば、整数ｘを入力として、整数を出力する未解釈関数ufunc(x)を想定した場合、ufunc(10)=100である場合には、計算ロジックは不明でも、未解釈関数ufuncに対して１０を入力すると１００を出力する関数であると解釈される。
【００４１】
ここで、func(x)=x*xである場合に、「x＝y」且つ「func(x)≠func(y)」という制約が充足可能であるか判定することを想定する。この際、「func(x)≠func(y)」についてfuncの定義をそのまま展開して「x*x ≠ y*y」としなくても、funcの代わりに未解釈関数ufuncを代わりに用いて「ufunc(x)≠ufunc(y)」とするだけでも充足不能であることを判定できる。funcの形が複雑であれば、未解釈関数ufuncを用いた方が充足不能であることを早期に判定できる可能性がある。
【００４２】
未解釈関数は、このような数値型の変数だけではなく、文字列の変数にも適用できる。例えば、Ｐ（Ａ，Ｂ）を、整数Ａと整数Ｂを入力として真偽（true or false）を出力する未解釈関数とする。また、prefix(Ｘ，Ｙ）を上で述べたようにＹがＸの前方一致であるか否かを判断する関数であるとする。ここで「prefix(Sa,Sb)」且つ「Sa = Sb」且つ「prefix(Sc,Sd)」という制約の充足値を求めることを考える。このような場合にも、Ｐ（Ａ，Ｂ）という未解釈関数を導入すると共に、Sa，Sb，Sc，Sdの代わりにａ，ｂ，ｃ，ｄといった整数型の代表値を導入する。そうすると、上で述べた制約は「Ｐ（ａ，ｂ）ＡＮＤ  ｂ＝ｄ  ＡＮＤ  Ｐ（ｃ，ｄ）」という制約に書き換えられる。このような制約をＳＭＴソルバ２００に入力すると、「ａ＝１００，ｂ＝２００，ｃ＝１００，ｄ＝２００，Ｐ（１００，２００）は真（ｔｒｕｅ）」という解が得られる。このような結果を得れば、「prefix(Sa,Sb) AND Sb = Sd AND Sa = Sc」というように制約が再構成されて、充足値「Sa = Sc = "abc", Sb = Sd ="abcd"」が得られるようになる。このように、未解釈関数による抽象化は有用である。
【００４３】
処理の説明に戻って、未解釈関数割当部１０６は、抽出された表現に対する未解釈関数割当情報を生成し、第１データ格納部１０７に格納する（ステップＳ１９）。例えば、本具体例では、図１５に示すような未解釈関数割当情報が生成され、第１データ格納部１０７に格納される。図１５の例では、割当ＩＤと、抽出式と、パターンＩＤとが登録されるようになっている。このように、表現抽出リストに登録された式に対して、ＩＤを割り当てると共に、未解釈関数パターンで割り当てられた該当パターンＩＤが対応付けられている。
【００４４】
そして、未解釈関数割当部１０６は、制約語彙定義格納部１０５に登録されている制約語彙定義のうち、未処理の制約語彙定義が存在しているか判断し（ステップＳ２１）、未処理の制約語彙定義が存在している場合には、ステップＳ１１に戻る。一方、未処理の制約語彙定義が存在していない場合には、元の処理に戻る。
【００４５】
以上のような処理を実施することで、レコード単位制約に関連して定義されている制約語彙定義のパターン毎に、元制約データにおける当該パターンの出現形態が確認される。
【００４６】
図１０の処理の説明に戻って、制約変換部１０８は、第１データ格納部１０７と元制約データ格納部１０３とに格納されているデータを用いて、制約変換処理を実施する（ステップＳ３）。この制約変換処理については、図１６乃至図１８を用いて説明する。
【００４７】
まず、制約変換部１０８は、第１データ格納部１０７に格納されている未解釈関数割当情報における未処理のパターンを１つ特定する（図１６：ステップＳ５１）。そして、制約変換部１０８は、特定されたパターンに該当する式を元制約データから抽出し（ステップＳ５３）、抽出された式を、特定されたパターンに対応する未解釈関数で置換する（ステップＳ５５）。
【００４８】
例えば図１５の未解釈関数割当情報における最初のパターンを処理する場合には、図１７に示すように、太線で囲まれた部分が抽出され、未解釈関数パターンに従って未解釈関数Ｐ（Ｘ，Ｙ）で置換される。より具体的には、prefix(商品名，商品マスタ[0].商品)については、Ｐ(商品名，商品マスタ[0].商品)に置換される。未解釈関数割当情報の残りのパターンについても、同様に未解釈関数で置換される。
【００４９】
そして、制約変換部１０８は、未処理のパターンが、未解釈関数割当情報に存在しているか確認する（ステップＳ５７）。未処理のパターンが未解釈関数割当情報に存在している場合にはステップＳ５１に戻る。一方、未処理のパターンが存在しない場合には、図１８に示すような処理後の制約データが生成されたことになる。図１８の例では、prefix関数は用いられておらず、未解釈関数Ｐに置換されている。
【００５０】
その後、制約変換部１０８は、処理後の元制約データの各文字列型変数を、数値型変数に置換して、この処理の後の元制約データを、レコード選択部分制約データとして、第２データ格納部１０９に格納する（ステップＳ５９）。そして元の処理に戻る。
【００５１】
例えば、「商品名」「商品マスタ．商品」「在庫状況．商品」といった文字列型の変数については、同名の数値型変数に置換しておく。同名の数値型変数を置換することで、表記としては図１８のデータはそのまま、レコード選択部分制約となる。
【００５２】
このようにすれば、レコード単位制約を未解釈関数で置換して抽象化することで、レコード単位制約を同時に解くことがないように変換した制約データであるレコード選択部分制約が生成されたことになる。
【００５３】
図１０の処理の説明に戻って、ＳＭＴソルバインタフェース部１１０は、第２データ格納部１０９に格納されているレコード選択部分制約のデータを、ＳＭＴソルバ２００に出力し、ＳＭＴソルバ２００に、充足可能性判定処理を実施させる（ステップＳ５）。ＳＭＴソルバ２００は、レコード選択部分制約に対して充足可能性判定処理を実施して、充足可能であるならば充足値を算出し、ＳＭＴソルバインタフェース部１１０に出力する。ＳＭＴソルバインタフェース部１１０は、ＳＭＴソルバ２００から、第１回目の処理結果を受け取り、第３データ格納部１１１に格納する。充足不能の場合には、充足不能を表すデータが第３データ格納部１１１に格納される。
【００５４】
例えば充足値反映部１１２は、第３データ格納部１１１に格納されている、ＳＭＴソルバ２００の第１回目の処理結果に充足値が含まれているか否かによって、レコード選択部分制約が充足可能であったか判断する（ステップＳ７）。レコード選択部分制約が充足不能であった場合には、端子Ｂを介して処理を終了する。ユーザに対して充足不能を表すデータを出力するようにしてもよい。一方、ＳＭＴソルバ２００の第１回目の処理結果に充足値が含まれている場合には、端子Ａを介して、図２３の処理に移行する。
【００５５】
本具体例では、第１回目の処理結果として、第３データ格納部１１１に、図１９乃至図２２に示すようなデータが格納されるものとする。
【００５６】
例えば、商品マスタテーブルのデータとして図１９のようなデータがＳＭＴソルバ２００から得られる。図１９の例では、商品名と単価の組み合わせが３つ含まれている。商品マスタ．商品は、上でも述べたように数値型変数に置換されているので、「１００」「２００」「４００」といった数値になっている。単価については、非負の数値型変数のままである。
【００５７】
また、在庫状況テーブルのデータとして図２０のようなデータがＳＭＴソルバ２００から得られる。図２０の例では、商品名と在庫数の組み合わせが２つ含まれている。在庫状況．商品は、上でも述べたように数値型変数に置換されているので、非負の数値型変数のままである。
【００５８】
さらに、未解釈関数の入出力関係を表す未解釈関数入出力情報として図２１に示すようなデータがＳＭＴソルバ２００から得られる。図２１の例では、未解釈関数Ｐ（Ｘ，Ｙ）のＸ及びＹに具体的な値を入れた場合に出力される論理値（false又はtrue）が示されている。ここでは（３００，１００）は偽（ｆａｌｓｅ）であり、（３００，２００）は偽（ｆａｌｓｅ）であり、（３００，４００）は真（ｔｒｕｅ）である。
【００５９】
なお、Ｘ＝３００は、商品検索画面における商品名の値（数値変数の値）であり、模式的に示せば、テストデータとして、図２２のような商品検索画面が想定される。すなわち、商品名の入力欄に、３００という商品名に対応する値が設定される。
【００６０】
このような第１回目の処理結果は、全体として、レコード単位制約の部分を除き元制約データについての制約を全て満たしている。
【００６１】
すなわち、
（１）入力された商品名に前方一致する商品が商品マスタテーブルにただ１件存在する
という制約については、未解釈関数入出力情報から、入力された商品名「３００」と商品マスタテーブルの商品名「１００」との組み合わせについては「偽」、入力された商品名「３００」と商品マスタテーブルの商品名「２００」との組み合わせについては「偽」、入力された商品名「３００」と商品マスタテーブルの商品名「４００」については「真」とあるので、満たされている。但し、レコード単位制約についての「前方一致」については抽象化されている。
【００６２】
さらに、
（２）当該商品に対応する在庫状況テーブルの在庫数が１以上の場合、該当する商品の発注画面が表示される
という制約については、入力された商品名「３００」と商品マスタテーブルの商品名「４００」については「真」であるから、在庫状況テーブルにおける２番目のレコードから在庫数「２００」が特定され、発注画面が表示されるので、満たされる。
【００６３】
さらに、
（３）商品マスタテーブルの全てのレコードに対して、商品が対応する在庫状況テーブルのレコードが０件又は１件存在する
という制約については、商品マスタテーブルの商品名「１００」「２００」「３００」に対して、在庫状況テーブルの商品名「１００」「４００」となっているので、満たされている。
【００６４】
また、
（４）在庫状況テーブルの全てのレコードに対して、商品が対応する商品マスタテーブルのレコードが１件存在する
という制約についても、在庫状況テーブルの商品名は、商品マスタテーブルの商品名に全て存在しているので、満たされている。
【００６５】
図２３の処理の説明に移行して、充足値反映部１１２及び制約構成部１１４は、レコード単位部分制約生成処理を実施する（図２３：ステップＳ６１）。このレコード単位部分制約生成処理については、図２４乃至図３２を用いて説明する。
【００６６】
まず、充足値反映部１１２は、第１データ格納部１０７と第３データ格納部１１１と元制約データ格納部１０３とに格納されているデータを用いて、割当関数入出力情報生成処理を実施する（図２４：ステップＳ７１）。割当関数入出力情報生成処理については、図２５乃至図２７を用いて説明する。
【００６７】
まず、充足値反映部１１２は、第１データ格納部１０７に格納されている未解釈関数割当情報における未処理の制約を１つ特定する（図２５：ステップＳ８１）。例えば、未解釈関数割当情報（図１５）における最初の制約「prefix(商品名，商品マスタ[0].商品)」が特定された場合を想定する。
【００６８】
そして、充足値反映部１１２は、特定された制約に対応する未解釈割当関数を、パターンＩＤを用いて未解釈関数パターン情報（図１４）から特定する（ステップＳ８３）。本具体例では未解釈割当関数Ｐ（Ｘ，Ｙ）しか存在しないが、複数ある場合にはその中からパターンＩＤで特定する。その後、充足値反映部１１２は、特定された制約で利用されている変数の値を、第３データ格納部１１１に格納されている第１回目の処理結果から特定し、対応する未解釈関数の値を取得する（ステップＳ８５）。
【００６９】
「prefix(商品名，商品マスタ[0].商品)」の場合には、入力される商品名は第１回目の処理結果（図２２）から「３００」と特定され（図２６（１））、商品マスタ[0].商品についても第１回目の処理結果（図１９）から「１００」と特定される（図２６（２））。そして、未解釈関数パターン情報（図１４）から、Ｐ（３００，１００）という未解釈関数が構成されるので（図２６（３）乃至（５））、未解釈関数入出力情報（図２１）の最初のレコードから、偽「false」を変数値として特定する。
【００７０】
そして、充足値反映部１１２は、ステップＳ８１で特定された制約と、ステップＳ８５で取得された当該パターンの値とを対応付けて割当関数入出力情報リストに登録する（ステップＳ８７）。その後、充足値反映部１１２は、第１データ格納部１０７に格納されている未解釈関数割当情報において未処理のパターンが存在するか判断する（ステップＳ８９）。未処理の制約が存在する場合には、ステップＳ８１に戻る。一方、未処理の制約が存在しない場合には、元の処理に戻る。
【００７１】
このような処理を実施すれば、図２７に示すような割当関数入出力情報リストが生成されて、第４データ格納部１１３に格納される。図２７の例では、パターン（未解釈関数パターン情報におけるパターン）と、元制約中の表現（未解釈関数割当情報における制約）と、値とが対応付けられている。
【００７２】
このようにして、今回生成するテストデータに従って行われるテストにおいて、データベースのいずれのレコードが用いられるのかが明らかになる。図２７の例では、「prefix(商品名，商品マスタ[2].商品)」のみが真であるので、商品テーブルの３番目のレコードが抽出されることになる。
【００７３】
図２４の処理の説明に戻って、充足値反映部１１２は、代表値関係情報構成処理を実施する（ステップＳ７３）。この代表値関係情報構成処理については、図２８乃至図３０を用いて説明する。
【００７４】
まず、充足値反映部１１２は、未解釈関数を割り当てられなかった変数間の関係式を、元制約データ格納部１０３に格納されている元制約データから抽出する（図２８：ステップＳ９１）。図４のような元制約データのうち、未解釈関数が割り当てられたのは、prefix関数が用いられている部分のみであるから、他の関係式が本ステップで抽出される。ステップＳ９１では、図２９のようなデータが抽出される。図２９の例では、Ｘ＝Ｙのパターンと、Ｘ≧Ｙのパターンが存在しており、それぞれに元制約中の表現パターンが抽出されて、登録されている。なお、Ｘ＝ＹパターンのＸ及びＹは文字列型の変数であるが、数値型の変数に変換して第１回目の充足可能性判定処理が実施されている。
【００７５】
そして、充足値反映部１１２は、ステップＳ９１で１つでも関係式が抽出されたか判断する（ステップＳ９３）。１つも関係式が抽出されていない場合には、これ以上処理を行わないので、元の処理に戻る。一方、１つでも関係式が抽出される場合には、充足値反映部１１２は、抽出された関係式のうち未処理の関係式を１つ特定する（ステップＳ９５）。次に、充足値反映部１１２は、特定された関係式が代表値関係情報に既に登録されているか判断する（ステップＳ９７）。特定された関係式が代表値関係情報に既に登録済みである場合には、ステップＳ１０３に移行する。一方、特定された関係式が未登録であれば、充足値反映部１１２は、特定された関係式内の変数に、第３データ格納部１１１に格納されている第１回目の処理結果に含まれる該当値を代入して、特定された関係式の結果を算出する（ステップＳ９９）。図２９の第１行目を一例にすると、「商品マスタ[0].商品＝在庫状況[0].商品」であるが、第１回目の処理結果からすると商品マスタ[0].商品の値は「１００」で、在庫状況[0].商品の値は「１００」であるので、関係式の結果は「真（true）」となる。
【００７６】
そして、充足値反映部１１２は、特定された関係式及び算出された結果を、代表値関係情報に登録する（ステップＳ１０１）。この代表値関係情報は、第４データ格納部１１３に格納される。その後、充足値反映部１１２は、未処理の関係式が存在するか判断し（ステップＳ１０３）、未処理の関係式が存在する場合にはステップＳ９５に戻る。一方、未処理の関係式が存在しない場合には、元の処理に戻る。
【００７７】
このような処理を実施すれば、図３０に示すような代表値関係情報が得られる。図３０の例では、パターンと、元制約中表現の表現パターンと、値とが対応付けて登録されている。
【００７８】
図２４の処理に戻って、次に、制約構成部１１４は、第３データ格納部１１１と第４データ格納部１１３と元制約データ格納部１０３と制約語彙定義格納部１０５とに格納されているデータを用いて、レコード単位部分制約生成処理を実施する（ステップＳ７５）。このレコード単位部分制約生成処理については、図３１及び図３２を用いて説明する。
【００７９】
まず、制約構成部１１４は、割当関数入出力情報（図２７）において、未処理の表現パターンを１つ特定する（図３１：ステップＳ１１１）。そして、制約構成部１１４は、特定された表現パターンについて、制約語彙定義から対応する条件を生成する（ステップＳ１１３）。例えば、図２７の第１行目のprefix(商品名，商品マスタ[0].商品)について処理する場合には、図９に示したprefix1のパターンに従って条件を生成する。具体的には、図５に示すような条件に展開する。このような展開については、従来技術と同様であるからここでは説明を省略する。
【００８０】
そして、制約構成部１１４は、特定された表現パターンの値を、生成された条件の値として制約を生成し、連言で追加する（ＡＮＤで連結する）（ステップＳ１１５）。
【００８１】
その後、制約構成部１１４は、未処理の表現パターンが割当関数入出力情報に存在しているか判断する（ステップＳ１１７）。未処理の表現パターンが存在している場合にはステップＳ１１１に戻る。一方、未処理の表現パターンが存在しない場合には、代表値関係情報（図３０）についての処理に移行する。
【００８２】
なお、図２７に示した割当関数入出力情報の場合、表現パターンprefix(商品名，商品マスタ[0].商品)の値は偽「false」であるから、「not prefix(商品名，商品マスタ[0].商品)」となる。また、表現パターンprefix(商品名，商品マスタ[1].商品)の値も偽「false」であるから、「not prefix(商品名，商品マスタ[1].商品)」を、「not prefix(商品名，商品マスタ[0].商品)」に対してＡＮＤで連結する。さらに、表現パターンprefix(商品名，商品マスタ[2].商品)の値は真「true」であるから、「prefix(商品名，商品マスタ[2].商品)」をさらにＡＮＤで連結する。すなわち、図３２において破線で囲まれた制約Ａが形成される。但し、prefix関数の部分は、実際には図５のような形で展開されている。
【００８３】
次に、制約構成部１１４は、代表値関係情報において、未処理の表現パターンを１つ特定する（ステップＳ１１９）。そして、制約構成部１１４は、特定された表現パターンとその値とから制約を生成し、連言で追加する（ＡＮＤで連結する）（ステップＳ１２１）。
【００８４】
図３０の例では、表現パターン「商品マスタ[0].商品＝在庫状況[0].商品」とその値「真（true）」とから、「（「商品マスタ[0].商品＝在庫状況[0].商品）」という制約を生成し、ＡＮＤで連結する。また、表現パターン「商品マスタ[0].商品＝在庫状況[1].商品」とその値「偽（false）」とから、「not （「商品マスタ[0].商品＝在庫状況[1].商品）」という制約を生成し、ＡＮＤで連結する。
【００８５】
その後、制約構成部１１４は、代表値関係情報に未処理の表現パターンが存在するか判断する（ステップＳ１２３）。未処理の表現パターンが存在する場合にはステップＳ１１９に戻る。一方、未処理の表現パターンが存在しない場合には、第３データ格納部１１１に格納されている第１回目の処理結果のデータベースのデータのうち数値型変数の値についての制約を生成する処理に移行する。
【００８６】
図３０のような代表値関係情報の場合には、図３２において一点鎖線で囲まれる制約Ｂが形成される。
【００８７】
その後、制約構成部１１４は、データベースのデータのうち数値型変数とその値とを制約として生成し、連言で追加する（ＡＮＤで連結する）（ステップＳ１２５）。元々数値型変数というのは、在庫状況テーブルの在庫数及び商品マスタテーブルの単価であり、それらの値は図１９及び図２０に示すような値として算出されている。従って、在庫状況[0].在庫数＝１００、在庫状況[1].在庫数＝２００、商品マスタ[0].単価＝１０００、商品マスタ[1].単価＝２０００、商品マスタ[2].単価＝３０００という制約が生成され、ＡＮＤで連結される。そうすると、図３２において点線で囲まれる制約Ｃが形成される。
【００８８】
このような処理を実施することで、図３２（一部は図５のような制約で展開されている）のような制約データがレコード単位部分制約として生成され、第５データ格納部１１５に格納される。
【００８９】
図３２に示したレコード単位部分制約は、図４に示した元制約を満たすことが確認された、レコード選択部分制約についての充足値で、元制約を間接的に反映させて、レコード単位制約のための制約として再構成したものである。すなわち、このようなレコード単位部分制約に充足値が存在する場合には、その充足値が元制約をも充足するように、レコード単位部分制約が生成されている。従って、一部はそのまま対応している部分はあるが、表現として図４と図３２を比較することは意味がない。
【００９０】
図２３の処理の説明に戻って、ＳＭＴソルバインタフェース部１１０は、第５データ格納部１１５に格納されているレコード単位部分制約のデータを、ＳＭＴソルバ２００に出力し、ＳＭＴソルバ２００に、充足可能性判定処理を実施させる（ステップＳ６３）。ＳＭＴソルバ２００は、レコード単位部分制約に対して充足可能性判定処理を実施して、充足可能であるならば充足値を算出し、ＳＭＴソルバインタフェース部１１０に出力する。ＳＭＴソルバインタフェース部１１０は、ＳＭＴソルバ２００から、第２回目の処理結果を受け取り、第６データ格納部１１６に格納する。充足不能の場合には、充足不能を表すデータが第６データ格納部１１６に格納される。
【００９１】
例えば充足値変換部１１７は、第６データ格納部１１６に格納されている、ＳＭＴソルバ２００の第２回目の処理結果に充足値が含まれているか否かによって、レコード単位部分制約が充足可能であったか判断する（ステップＳ６５）。レコード単位部分制約が充足不能であった場合には、処理を終了する。ユーザに対して充足不能を表すデータを出力するようにしてもよい。
【００９２】
一方、ＳＭＴソルバ２００の第２回目の処理結果に充足値が含まれている場合には、例えば図３３乃至図３５のような処理結果が得られる。図３３は、商品検索画面における商品名の値（数値配列の値）を模式的に示すものである。すなわち、テストデータとして、図３３のような商品検索画面が想定され、数値配列の要素値が５つ「６５」「６６」「６７」「０」「０」が得られる。
【００９３】
また、図３４に示すように、商品マスタテーブルの商品名に相当する数値配列の要素値が５つずつ得られる。図３５にも、同様に在庫状況テーブルの商品名に相当する数値配列の要素値が５つずつ得られる。
【００９４】
そうすると、充足値変換部１１７は、充足値を文字列に変換してテストデータを生成し、第７データ格納部１１８に格納する（ステップＳ６７）。具体的には、文字列変数を数値配列として取り扱った場合には、数値配列の要素値をそれぞれ文字に変換することで、文字列を得る。例えば、「６５」などを、対応する文字コードに置換する。そうすると、図３３における「６５」「６６」「６７」「０」「０」は図３６に示すように文字列「ＡＢＣ」に変換される。同様に、図３４の商品マスタテーブルの商品名についても、図３７に示すように「ＡＡＡＡ」「ＡＡＢＢ」「ＡＢＣＤ」という文字列に変換される。さらに、図３５の在庫状況テーブルの商品名についても、図３８に示すように「ＡＡＡＡ」「ＡＢＣＤ」という文字列に変換される。
【００９５】
以上のような処理を実施することで、前方一致等の複雑な制約であっても、高速にテストデータを生成することができるようになる。なお、商品マスタテーブル及び在庫状況テーブルをそれぞれ１０レコード含むテストデータを生成する場合、全ての制約を一度に解く場合に比して処理時間が約１／５になるという実験結果も得ている。
【００９６】
以上本技術の実施の形態を説明したが、本技術はこれに限定されるものではない。例えば、機能ブロック図（図６）は一例であって必ずしも実際のプログラムモジュール構成とは一致しない場合もある。処理フローについても、処理結果が変わらない限り、処理順番を入れ替えたり、並列実行できる場合がある。
【００９７】
さらに、上では前方一致という制約を問題としていたが、部分一致その他の複雑な制約も取り扱うことができる。さらに、未解釈関数で抽象化する関数の一例として、前方一致の関数prefixが語彙定義情報に含まれている例を示したが、レコード単位制約が特定できれば、どのような形で規定されていても良い。
【００９８】
さらに、元制約データを生成する処理部が、テストデータ生成装置１００に含まれる場合もある。さらに、ＳＭＴソルバ２００の機能と、テストデータ生成装置１００の機能とが一体となって、頒布される場合もある。
【００９９】
また、レコード単位部分制約を生成する際に、第１回目の処理結果に含まれる数値型変数についての処理結果についてはそのまま制約に用いているが、文字列型に関しては、その代表値の大小関係を辞書順と解釈して順序関係の制約をつけてもよい 。
【０１００】
なお、上で述べたテストデータ生成装置１００は、コンピュータ装置であって、図３９に示すように、メモリ２５０１とＣＰＵ（Central Processing Unit）２５０３とハードディスク・ドライブ（ＨＤＤ：Hard Disk Drive）２５０５と表示装置２５０９に接続される表示制御部２５０７とリムーバブル・ディスク２５１１用のドライブ装置２５１３と入力装置２５１５とネットワークに接続するための通信制御部２５１７とがバス２５１９で接続されている。オペレーティング・システム（ＯＳ：Operating System）及び本実施例における処理を実施するためのアプリケーション・プログラムは、ＨＤＤ２５０５に格納されており、ＣＰＵ２５０３により実行される際にはＨＤＤ２５０５からメモリ２５０１に読み出される。ＣＰＵ２５０３は、アプリケーション・プログラムの処理内容に応じて表示制御部２５０７、通信制御部２５１７、ドライブ装置２５１３を制御して、所定の動作を行わせる。また、処理途中のデータについては、主としてメモリ２５０１に格納されるが、ＨＤＤ２５０５に格納されるようにしてもよい。本技術の実施例では、上で述べた処理を実施するためのアプリケーション・プログラムはコンピュータ読み取り可能なリムーバブル・ディスク２５１１に格納されて頒布され、ドライブ装置２５１３からＨＤＤ２５０５にインストールされる。インターネットなどのネットワーク及び通信制御部２５１７を経由して、ＨＤＤ２５０５にインストールされる場合もある。このようなコンピュータ装置は、上で述べたＣＰＵ２５０３、メモリ２５０１などのハードウエアとＯＳ及びアプリケーション・プログラムなどのプログラムとが有機的に協働することにより、上で述べたような各種機能を実現する。
【０１０１】
以上述べた本実施の形態をまとめると、以下のようになる。
【０１０２】
本テストデータ生成方法は、（Ａ）プログラムのテストに用いられるデータベース内のテストデータについての制約を表す第１の制約データを格納する第１データ格納部に格納されている第１の制約データにおいて、テストデータに含まれるべきレコードの選択に関する制約であるレコード選択制約に従って選択したレコードが満たすべき制約であるレコード単位制約についての第１の表現パターンを、未解釈関数で置換することによって第２の制約データを生成し、第２データ格納部に格納する第１制約生成ステップと、（Ｂ）第２データ格納部に格納されている第２の制約データに対して充足可能性判定処理を実施させ、第１の制約データについての第１の充足値を取得し、第３データ格納部に格納するステップと、（Ｃ）第３データ格納部に格納されている第１の充足値と、第１の制約データに含まれる第１の表現パターンと、第１の制約データに含まれる、第１の表現パターン以外の制約についての第２の表現パターンとから、レコード単位制約についての第３の制約データを生成し、第４データ格納部に格納する第２制約生成ステップと、（Ｄ）第４データ格納部に格納されている第３の制約データに対して充足可能性判定処理を実施させ、前記第３の制約データについての第２の充足値を取得し、第４データ格納部に格納するステップとを含む。
【０１０３】
このように２段階に分けて充足可能性判定処理を実施させるので、それぞれについて処理すべき制約が単純化され、個別の判定処理及び全体の処理が高速化される。
【０１０４】
また、文字列変数を数値型の変数に変換しておき、上記方法において、第４データ格納部に格納されている第２の充足値に含まれる、数値型の変数の値を、文字列に変換するステップをさらに含むようにしても良い。このようにすれば文字列変数についても高速に処理できる。
【０１０５】
さらに、上で述べた第２制約生成ステップが、（Ｃ１）第１の充足値に含まれる未解釈関数の入出力対応データから、第１の表現パターンの各々の真偽を特定し、第１の表現パターンの各々と対応する真偽との組み合わせについての制約を生成する第１生成ステップと、（Ｃ２）第１の充足値から、第２の表現パターンの各々の真偽を特定し、第２の表現パターンの各々と対応する真偽との組み合わせについての制約を生成する第１生成ステップと、（Ｃ３）第１の充足値に含まれるデータベース内の各レコードの値を表す制約と、第１生成ステップ及び第２生成ステップで生成された制約とを含む制約データを生成するステップとを含むようにしてもよい。これによって、元制約を間接的に反映させたレコード単位制約についての制約を生成することができる。
【０１０６】
また、上で述べた第１生成ステップが、第１の表現パターンの各々と対応する真偽との組み合わせについての制約を、第１の表現パターンに関連する制約定義に従って展開するステップをさらに含むようにしてもよい。適切な第３の制約データを生成することができる。
【０１０７】
なお、上で述べたような処理をコンピュータに実施させるためのプログラムを作成することができ、当該プログラムは、例えばフレキシブル・ディスク、ＣＤ−ＲＯＭなどの光ディスク、光磁気ディスク、半導体メモリ（例えばＲＯＭ）、ハードディスク等のコンピュータ読み取り可能な記憶媒体又は記憶装置に格納される。なお、処理途中のデータについては、ＲＡＭ等の記憶装置に一時保管される。
【０１０８】
以上の実施例を含む実施形態に関し、さらに以下の付記を開示する。
【０１０９】
（付記１）
プログラムのテストに用いられるデータベース内のテストデータについての制約を表す第１の制約データを格納する第１データ格納部に格納されている前記第１の制約データに含まれる、前記テストデータに含まれるべきレコードの選択に関する制約であるレコード選択制約に従って選択したレコードが満たすべき制約であるレコード単位制約についての第１の表現パターンを、未解釈関数で置換することによって第２の制約データを生成し、第２データ格納部に格納する第１制約生成ステップと、
前記第２データ格納部に格納されている前記第２の制約データに対する充足可能性判定処理を充足可能性判定処理部に実施させ、前記第１の制約データについての第１の充足値を前記充足可能性判定処理部から取得し、第３データ格納部に格納するステップと、
前記第３データ格納部に格納されている前記第１の充足値と、前記第１の制約データに含まれる第１の表現パターンと、前記第１の制約データに含まれる、前記第１の表現パターン以外の制約についての第２の表現パターンとから、前記レコード単位制約についての第３の制約データを生成し、第４データ格納部に格納する第２制約生成ステップと、
前記第４データ格納部に格納されている前記第３の制約データに対する充足可能性判定処理を充足可能性判定処理部に実施させ、前記第３の制約データについての第２の充足値を前記充足可能性判定処理部から取得し、第４データ格納部に格納するステップと、
を、コンピュータに実行させるためのテストデータ生成プログラム。
【０１１０】
（付記２）
前記第１の制約データに含まれる文字列変数を数値型の変数に変換する変換ステップと、
前記第４データ格納部に格納されている前記第２の充足値に含まれ且つ前記変換ステップで変換された、前記数値型の変数の値を、文字列に変換するステップと、
を、さらに前記コンピュータに実行させるための付記１記載のテストデータ生成プログラム。
【０１１１】
（付記３）
前記第２制約生成ステップが、
前記第１の充足値に含まれる前記未解釈関数の入出力対応データから、前記第１の表現パターンの各々の真偽を特定し、前記第１の表現パターンの各々と対応する真偽との組み合わせについての制約を生成する第１生成ステップと、
前記第１の充足値から、前記第２の表現パターンの各々の真偽を特定し、前記第２の表現パターンの各々と対応する真偽との組み合わせについての制約を生成する第１生成ステップと、
前記第１の充足値に含まれる前記データベース内の各レコードの値を表す制約と、前記第１生成ステップ及び前記第２生成ステップで生成された制約とを含む制約データを生成するステップと、
を含む付記１又は２記載のテストデータ生成プログラム。
【０１１２】
（付記４）
前記第１生成ステップが、
前記第１の表現パターンの各々と対応する真偽との組み合わせについての制約を、第１の表現パターンに関連する制約定義に従って展開するステップ
をさらに含む付記３記載のテストデータ生成プログラム。
【０１１３】
（付記５）
プログラムのテストに用いられるデータベース内のテストデータについての制約を表す第１の制約データを格納する第１データ格納部に格納されている前記第１の制約データにおいて、前記テストデータに含まれるべきレコードの選択に関する制約であるレコード選択制約に従って選択したレコードが満たすべき制約であるレコード単位制約についての第１の表現パターンを、未解釈関数で置換することによって第２の制約データを生成し、第２データ格納部に格納する第１制約生成ステップと、
前記第２データ格納部に格納されている前記第２の制約データに対して充足可能性判定処理を実施し、前記第１の制約データについての第１の充足値を取得し、第３データ格納部に格納するステップと、
前記第３データ格納部に格納されている前記第１の充足値と、前記第１の制約データに含まれる第１の表現パターンと、前記第１の制約データに含まれる、前記第１の表現パターン以外の制約についての第２の表現パターンとから、前記レコード単位制約についての第３の制約データを生成し、第４データ格納部に格納する第２制約生成ステップと、
前記第４データ格納部に格納されている前記第３の制約データに対して充足可能性判定処理を実施し、前記第３の制約データについての第２の充足値を取得し、第４データ格納部に格納するステップと、
を含み、コンピュータにより実行されるテストデータ生成方法。
【０１１４】
（付記６）
プログラムのテストに用いられるデータベース内のテストデータについての制約を表す第１の制約データを格納する第１データ格納部に格納されている前記第１の制約データにおいて、前記テストデータに含まれるべきレコードの選択に関する制約であるレコード選択制約に従って選択したレコードが満たすべき制約であるレコード単位制約についての第１の表現パターンを、未解釈関数で置換することによって第２の制約データを生成し、第２データ格納部に格納する手段と、
充足可能性判定処理部と、
前記第２データ格納部に格納されている前記第２の制約データに対して充足可能性判定処理を前記充足可能性判定処理部に実施させ、前記第１の制約データについての第１の充足値を前記充足可能性判定処理部から取得し、第３データ格納部に格納する処理手段と、
前記第３データ格納部に格納されている前記第１の充足値と、前記第１の制約データに含まれる第１の表現パターンと、前記第１の制約データに含まれる、前記第１の表現パターン以外の制約についての第２の表現パターンとから、前記レコード単位制約についての第３の制約データを生成し、第４データ格納部に格納する手段と、
を有し、
前記処理手段は、
前記第４データ格納部に格納されている前記第３の制約データに対して充足可能性判定処理を前記充足可能性判定処理部に実施させ、前記第３の制約データについての第２の充足値を前記充足可能性判定処理部から取得し、第４データ格納部に格納する、
テストデータ生成装置。
【符号の説明】
【０１１５】
１０３  元制約データ格納部
１０４  型情報格納部
１０５  制約語彙定義格納部
１０６  未解釈関数割当部
１０７  第１データ格納部
１０８  制約変換部
１０９  第２データ格納部
１１０  ＳＭＴソルバインタフェース部
１１１  第３データ格納部
１１２  充足値反映部
１１３  第４データ格納部
１１４  制約構成部
１１５  第５データ格納部
１１６  第６データ格納部
１１７  充足値変換部
１１８  第７データ格納部
２００  ＳＭＴソルバ
【図１】
0005609681.tif 000002
【図２】
0005609681.tif 000003
【図３】
0005609681.tif 000004
【図４】
0005609681.tif 000005
【図５】
0005609681.tif 000006
【図６】
0005609681.tif 000007
【図７】
0005609681.tif 000008
【図８】
0005609681.tif 000009
【図９】
0005609681.tif 000010
【図１０】
0005609681.tif 000011
【図１１】
0005609681.tif 000012
【図１２】
0005609681.tif 000013
【図１３】
0005609681.tif 000014
【図１４】
0005609681.tif 000015
【図１５】
0005609681.tif 000016
【図１６】
0005609681.tif 000017
【図１７】
0005609681.tif 000018
【図１８】
0005609681.tif 000019
【図１９】
0005609681.tif 000020
【図２０】
0005609681.tif 000021
【図２１】
0005609681.tif 000022
【図２２】
0005609681.tif 000023
【図２３】
0005609681.tif 000024
【図２４】
0005609681.tif 000025
【図２５】
0005609681.tif 000026
【図２６】
0005609681.tif 000027
【図２７】
0005609681.tif 000028
【図２８】
0005609681.tif 000029
【図２９】
0005609681.tif 000030
【図３０】
0005609681.tif 000031
【図３１】
0005609681.tif 000032
【図３２】
0005609681.tif 000033
【図３３】
0005609681.tif 000034
【図３４】
0005609681.tif 000035
【図３５】
0005609681.tif 000036
【図３６】
0005609681.tif 000037
【図３７】
0005609681.tif 000038
【図３８】
0005609681.tif 000039
【図３９】
0005609681.tif 000040