(57)【特許請求の範囲】
【請求項１】
コンピュータに，
記憶部に記憶された，テスト対象プログラムに特定の処理パスを実行させる条件を示すパス条件の情報に基づいて，変数の桁数を配列長とする変数の配列を設定する際に，数値型の変数については，該数値型の変数に対応する比較用の変数の配列をさらに設定し，異なる桁数の変数を比較する条件における桁数が少ない方の変数については，桁数が多い方の変数の桁数に合わせて配列長を増加した変数の配列を設定し，
前記パス条件の情報に基づいて，変数が満たすべき条件に応じた変数の配列の制約を設定する際に，数値型の変数と文字列型の変数との比較を行う条件については，該数値型の変数に対応する比較用の変数の配列と該文字列型の変数の配列とを比較する条件の制約を設定し，
配列長を増加した変数の配列について，数値型の変数の配列については，先頭から増加した分の要素を所定の値に制約する設定を行い，文字列型の変数の配列および比較用の変数の配列については，末尾から増加した分の要素を所定の値に制約する設定を行い，
数値型の変数の配列と，該数値型の変数に対応する比較用の変数の配列との関係を制約する設定を行い，
前記設定された変数の配列および制約から，制約ソルバが解釈する記述データを生成する
処理を実行させるためのテストデータ生成プログラム。
【請求項２】
前記コンピュータに，さらに，
前記記述データを入力した制約ソルバの実行により得られた結果データから，前記比較用の変数のデータを削除し，配列長を増やした数値型の変数については先頭から増加した分の文字を削除し，配列長を増やした文字列型の変数については末尾から増加した分の文字を削除する
処理を実行させるための請求項１に記載のテストデータ生成プログラム。
【請求項３】
テスト対象プログラムに特定の処理パスを実行させる条件を示すパス条件の情報を記憶するパス条件情報記憶部と，
前記パス条件の情報に基づいて，変数の桁数を配列長とする変数の配列を設定する際に，数値型の変数については，該数値型の変数に対応する比較用の変数の配列をさらに設定し，異なる桁数の変数を比較する条件における桁数が少ない方の変数については，桁数が多い方の変数の桁数に合わせて配列長を増加した変数の配列を設定する変数設定機能部と，
前記パス条件の情報に基づいて，変数が満たすべき条件に応じた変数の配列の制約を設定する際に，数値型の変数と文字列型の変数との比較を行う条件については，該数値型の変数に対応する比較用の変数の配列と該文字列型の変数の配列とを比較する条件の制約を設定する制約設定機能部と，
配列長を増加した変数の配列について，数値型の変数の配列については，先頭から増加した分の要素を所定の値に制約する設定を行い，文字列型の変数の配列および比較用の変数の配列については，末尾から増加した分の要素を所定の値に制約する設定を行う補完桁制約設定部と，
数値型の変数の配列と，該数値型の変数に対応する比較用の変数の配列との関係を制約する設定を行う比較用変数制約設定部と，
前記設定された変数の配列および制約から，制約ソルバが解釈する記述データを生成する変換部とを備える
ことを特徴とするテストデータ生成装置。
【請求項４】
コンピュータが，
記憶部に記憶された，テスト対象プログラムに特定の処理パスを実行させる条件を示すパス条件の情報に基づいて，変数の桁数を配列長とする変数の配列を設定する際に，数値型の変数については，該数値型の変数に対応する比較用の変数の配列をさらに設定し，異なる桁数の変数を比較する条件における桁数が少ない方の変数については，桁数が多い方の変数の桁数に合わせて配列長を増加した変数の配列を設定し，
前記パス条件の情報に基づいて，変数が満たすべき条件に応じた変数の配列の制約を設定する際に，数値型の変数と文字列型の変数との比較を行う条件については，該数値型の変数に対応する比較用の変数の配列と該文字列型の変数の配列とを比較する条件の制約を設定し，
配列長を増加した変数の配列について，数値型の変数の配列については，先頭から増加した分の要素を所定の値に制約する設定を行い，文字列型の変数の配列および比較用の変数の配列については，末尾から増加した分の要素を所定の値に制約する設定を行い，
数値型の変数の配列と，該数値型の変数に対応する比較用の変数の配列との関係を制約する設定を行い，
前記設定された変数の配列および制約から，制約ソルバが解釈する記述データを生成する処理を実行する
ことを特徴とするテストデータ生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は，制約ソルバを利用してプログラムのテストデータを生成するテストデータ生成プログラム，テストデータ生成装置およびテストデータ生成方法に関するものである。
【背景技術】
【０００２】
ソフトウェア開発などのシーンにおいて，開発されたプログラムにバグがないかを確認するテストが行われている。通常，プログラムには，条件判定による処理の分岐があり，その分岐での判定結果によって，プログラムが実行する処理の流れが変わる。ここでは，プログラムが実行する処理の流れを処理パスと呼ぶ。多くのプログラムには，複数の処理の分岐があり，それらの分岐での判定結果に応じた複数の処理パスが存在する。プログラムのテストを行う際には，カバレッジを向上させるために，該プログラムにおける複数の処理パスを網羅するようにテストを行いたいという要望がある。複数の処理パスのそれぞれについてテストを行いたい場合には，プログラムにそれぞれの処理パスを実行させるために入力する変数の値を，テストデータとして用意する必要がある。
【０００３】
プログラムに特定の処理パスを実行させるためのテストデータを得る技術として，制約ソルバを用いて，プログラムに特定の処理パスを実行させる条件を満たす変数の値を算出する技術がある。ここでは，プログラムに特定の処理パスを実行させる条件を，パス条件と呼ぶ。制約ソルバを利用してテストデータを求める場合には，テストを行う処理パスのパス条件を，制約ソルバが解釈できる記述に置き換える必要がある。ここでは，制約ソルバが解釈できる記述を制約記述と呼ぶ。
【０００４】
なお，情報処理システムの設計内容からテストデータを自動生成する技術が知られている。また，数値情報の比較を行う際に，単位の換算や近似値の範囲の算出などの必要な変換を行う技術が知られている。また，異なるデータ長のデータを比較する際に，パディングデータを利用する技術が知られている。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１０−０７２９４４号公報
【特許文献２】特開平０２−１０５９７４号公報
【特許文献３】特開平０６−１３１２３７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
プログラミング言語には，ＣＯＢＯＬやＰＬ／１などのように，「桁」の概念を持つプログラミング言語がある。このような言語では，分岐での条件判定において変数の値を一時的に別の値に書き換える転記を行うことで，桁数の異なる変数同士の比較や，数値型の変数と文字列型の変数との比較を可能にしている。
【０００７】
例えば，数値型の変数と文字列型の変数の比較では，数値型の変数を文字列型の変数に置き換える転記が行われる。また，異なる桁数の変数を比較する場合には，多い方の桁数にあわせて少ない方の変数の桁数を補完する転記が行われる。このとき，数値型の変数では前方に“０”を補完する転記が行われ，文字列型の変数では末尾に空白を補完する転記が行われる。
【０００８】
一方，制約ソルバが解釈する制約記述には，変数の宣言と制約のみが記述可能であり，比較の条件に応じた変数の値の書き換えを記述することはできないので，転記を制約としてそのまま記述することはできない。そのため，桁の概念を持つプログラミング言語で記述されたプログラムについて制約ソルバでテストデータを生成する際に，パス条件を正しく制約記述に置き換えることは困難である。
【０００９】
一側面では，本発明は，桁の概念を持つプログラミング言語で記述されたプログラムに特定の処理パスを実行させるテストデータを生成する際に，制約ソルバに入力する，該処理パスのパス条件を正しく記述した制約記述のデータを自動生成する技術を提供することを目的とする。
【課題を解決するための手段】
【００１０】
１態様では，開示するプログラムは，コンピュータを次のように機能させる。すなわち，前記プログラムは，前記プログラムがインストールされて実行されるコンピュータに，記憶部に記憶された，テスト対象プログラムに特定の処理パスを実行させる条件を示すパス条件の情報に基づいて，変数の桁数を配列長とする変数の配列を設定する際に，数値型の変数については，該数値型の変数に対応する比較用の変数の配列をさらに設定し，異なる桁数の変数を比較する条件における桁数が少ない方の変数については，桁数が多い方の変数の桁数に合わせて配列長を増加した変数の配列を設定し，パス条件の情報に基づいて，変数が満たすべき条件に応じた変数の配列の制約を設定する際に，数値型の変数と文字列型の変数との比較を行う条件については，該数値型の変数に対応する比較用の変数の配列と該文字列型の変数の配列とを比較する条件の制約を設定し，配列長を増加した変数の配列について，数値型の変数の配列については，先頭から増加した分の要素を所定の値に制約する設定を行い，文字列型の変数の配列および比較用の変数の配列については，末尾から増加した分の要素を所定の値に制約する設定を行い，数値型の変数の配列と，該数値型の変数に対応する比較用の変数の配列との関係を制約する設定を行い，設定された変数の配列および制約から，制約ソルバが解釈する記述データを生成する処理を実行させる。
【発明の効果】
【００１１】
１態様では，桁の概念を持つプログラミング言語で記述されたプログラムに特定の処理パスを実行させるテストデータを生成する際に，制約ソルバに入力する，該処理パスのパス条件を正しく記述した制約記述のデータを自動生成することが可能となる。
【図面の簡単な説明】
【００１２】
【図１】本実施の形態によるテスト対象プログラムの例を示す図である。
【図２】本実施の形態による処理パスを説明する図である。
【図３】本実施の形態による処理パス（１）のテストデータを求める制約記述の例を示す図である。
【図４】本実施の形態による数値型／文字列型の変数の配列を定義する記述の例を示す図である。
【図５】本実施の形態による制約ソルバの実行結果の例を示す図である。
【図６】本実施の形態による処理パス（４）のテストデータを求める制約記述の例を示す図である。
【図７】ＣＯＢＯＬにおける転記ルールを説明する図である。
【図８】本実施の形態によるテストデータ生成装置の構成例を示す図である。
【図９】本実施の形態によるテストデータ生成装置によるテストデータ生成処理フローチャートである。
【図１０】本実施の形態によるテストデータ生成装置を実現するコンピュータのハードウェア構成例を示す図である。
【図１１】本実施の形態によるデータ項目テーブルおよび分岐条件テーブルの例を示す図である。
【図１２】本実施の形態による変数宣言データおよび変数制約データの例を示す図である。
【図１３】本実施の形態の変数宣言情報生成部による変数宣言情報生成処理フローチャートである。
【図１４】本実施の形態の変数制約情報生成部による変数制約情報生成処理フローチャートである。
【図１５】本実施の形態による変数宣言データの例を示す図である。
【図１６】本実施の形態の比較用変数追加部による比較用変数追加処理フローチャートである。
【図１７】本実施の形態による変数制約データの例を示す図である。
【図１８】本実施の形態の比較対象変更部による比較対象変更処理フローチャートである。
【図１９】本実施の形態による変数宣言データおよび変数制約データの例を示す図である。
【図２０】本実施の形態の桁補完部による桁補完処理フローチャートである。
【図２１】本実施の形態の桁補完部による配列長更新処理フローチャートである。
【図２２】本実施の形態による変数制約データの例を示す図である。
【図２３】本実施の形態の補完桁制約設定部による補完桁制約設定処理フローチャートである。
【図２４】本実施の形態による変数制約データの例を示す図である。
【図２５】本実施の形態の比較用変数制約設定部による比較用変数制約設定処理フローチャートである。
【図２６】本実施の形態による制約記述データの例を示す図である。
【図２７】本実施の形態による結果データの例を示す図である。
【図２８】本実施の形態による結果データの例を示す図である。
【図２９】本実施の形態の補完桁削除部による補完桁削除処理フローチャートである。
【図３０】本実施の形態による結果データの例を示す図である。
【図３１】本実施の形態の比較用変数削除部による比較用変数削除処理フローチャートである。
【発明を実施するための形態】
【００１３】
以下，本実施の形態について，図を用いて説明する。
【００１４】
図１は，本実施の形態によるテスト対象プログラムの例を示す図である。
【００１５】
一般に，ソフトウェア開発などでは，開発されたプログラムについて，バグがないかなどを確認するテストが行われる。以下では，テストの対象となるプログラムをテスト対象プログラム２００と呼ぶ。図１に示すテスト対象プログラム２００は，プログラミング言語のＣＯＢＯＬで記述されたプログラムの一例である。
【００１６】
図１に示すテスト対象プログラムでは，「発注量」，「規定値」，「発注量上限」，「発注量下限」の４つの変数が宣言されている。変数「規定値」，「発注量上限」，「発注量下限」は固定値が設定された内部定数であり，変数「発注量」は入力変数である。
【００１７】
プログラミング言語には，ＣＯＢＯＬやＰＬ／１などのように，桁の概念があるプログラミング言語が存在する。桁の概念があるＣＯＢＯＬなどで記述されたプログラム内で変数を使う際には，その変数の桁数を宣言する必要がある。例えば，図１に示すテスト対象プログラム２００でも，変数の宣言時に，その桁数の宣言も行われている。
【００１８】
図１に示すテスト対象プログラム２００において，例えば，変数「発注量」の宣言における「９（３）」の記述は，変数「発注量」が３桁の数値型であることを示す。また，変数「規定値」の宣言における「Ｘ（３）」の記述は，変数「規定値」が３桁の文字列型であることを示す。また，変数「発注量上限」の宣言における「９（５）」の記述は，変数「発注量上限」が５桁の数値型であることを示す。また，変数「発注量下限」の宣言における「Ｘ（５）」の記述は，変数「発注量下限」が５桁の文字列型であることを示す。なお，本実施の形態では，文字列の長さも桁と表すものとする。
【００１９】
図１に示すテスト対象プログラム２００において，変数「規定値」，「発注量上限」，「発注量下限」には，固定値が設定されている。変数「規定値」には，文字列“００９”が固定値として設定されている。変数「発注量上限」には，数値“０００９９”が固定値として設定されている。変数「発注量下限」には，文字列“００１    ”が固定値として設定されている。
【００２０】
図２は，本実施の形態による処理パスを説明する図である。
【００２１】
図２には，図１に示すテスト対象プログラム２００について，特に条件判定による処理の分岐に着目した処理の流れが記述されている。例えば，図１に示すテスト対象プログラム２００には，図２に示す３つの分岐［１］〜［３］がある。
【００２２】
分岐［１］：（発注量＝規定値）についてのtrue／false 
分岐［２］：（発注量＞発注量上限）についてのtrue／false 
分岐［３］：（発注量＜発注量下限）についてのtrue／false 
これらの分岐［１］〜［３］におけるtrue／false の判定結果によって，図１に示すテスト対象プログラム２００が実行する処理の流れが，複数に分かれることになる。
【００２３】
プログラムが実行する処理の流れは，処理パスと呼ばれる。通常，プログラムには，条件判定による処理の分岐があり，その分岐での判定結果に応じた複数の処理パスが存在する。図１に示すテスト対象プログラム２００には，図２に示すように，４つの処理パス（１）〜（４）が存在する。
【００２４】
処理パス（１）：分岐［１］でtrueとなる処理パス
処理パス（２）：分岐［１］でfalse となり，分岐［２］でtrueとなる処理パス
処理パス（３）：分岐［１］でfalse となり，分岐［２］でfalse となり，分岐［３］でtrueとなる処理パス
処理パス（４）：分岐［１］でfalse となり，分岐［２］でfalse となり，分岐［３］でfalse となる処理パス
このように，図１に示すテスト対象プログラム２００には，分岐［１］〜［３］におけるtrue／false の結果に応じた処理パス（１）〜（４）が存在する。
【００２５】
図１に示すテスト対象プログラム２００のテストでは，例えば，テスト対象プログラム２００がそれぞれの処理パス（１）〜（４）を正常に実行できるかを調べるテストが行われる。テストの実施者は，それぞれの処理パス（１）〜（４）に対するテストごとに，テスト対象プログラム２００に目的とする処理パスを実行させるための変数への入力値を用意する必要がある。以下では，テストにおいてテスト対象プログラム２００の変数に入力する入力値を，テストデータとも呼ぶ。
【００２６】
図１に示すテスト対象プログラム２００のテストでは，変数「発注量」に値を入力してテストが行われる。このとき，テストの実施者は，テスト対象プログラム２００にテストの目的とする処理パスを実行させるための変数「発注量」の値を，テストデータとして用意する。以下では，図１に示すテスト対象プログラム２００のテストに用いるテストデータを生成する例を説明する。
【００２７】
図２に示す各処理パス（１）〜（４）についてそれぞれテストするためのテストデータは，それぞれの処理パス（１）〜（４）のパス条件を解くことにより得られる。パス条件は，テスト対象プログラムにテストの目的とする処理パスを実行させる条件である。例えば，パス条件は，目的とする処理パスを実行させるために各分岐の判定で変数が満たすべき条件となる。テストの目的とする処理パスのパス条件を満たす変数の値が，そのテストにおけるテストデータとなる。
【００２８】
例えば，テスト実施者が処理パス（４）をテストしたい場合，分岐［１］の判定条件（発注量＝規定値）がfalse となり，かつ分岐［２］の判定条件（発注量＞発注量上限）がfalse となり，かつ分岐［３］の判定条件（発注量＜発注量下限）がfalse となるテストデータを用意する。したがって，これらの条件の論理積「ＮＯＴ（発注量＝規定値），かつＮＯＴ（発注量＞発注量上限），かつＮＯＴ（発注量＜発注量下限）」が，処理パス（４）をテストするためにテストデータが満たすべき条件を示すパス条件となる。
【００２９】
テスト対象プログラムに処理パス（１）〜（４）を実行させるためのパス条件（１）〜（４）は，それぞれ次の通りとなる。
パス条件（１）：（発注量＝規定値）
パス条件（２）：ＮＯＴ（発注量＝規定値），かつ（発注量＞発注量上限）
パス条件（３）：ＮＯＴ（発注量＝規定値），かつＮＯＴ（発注量＞発注量上限），かつ（発注量＜発注量下限）
パス条件（４）：ＮＯＴ（発注量＝規定値），かつＮＯＴ（発注量＞発注量上限），かつＮＯＴ（発注量＜発注量下限）
このようなパス条件の導出方法としては，例えば，仕様書に基づいて人手で導出する方法や，プログラムのシンボリック実行により導出する方法などがある。
【００３０】
それぞれの処理パスをテストするためのテストデータは，上記で示したパス条件を解くことで得られる。しかし，パス条件を人手で解くことは容易ではない。特に，多数の分岐を通過する処理パスを実行させる場合，パス条件は長く複雑なものとなり，人手で解くのは難しい。
【００３１】
制約ソルバを用いて，与えられたパス条件を満たすテストデータを算出する技術がある。制約ソルバは，ある変数の満たすべき条件の入力に対して，その変数に入り得る値の実例を１つ返すツールである。制約ソルバに関する技術について記載された文献としては，例えば参考文献１が挙げられる。
〔参考文献１〕
R.E. Bryant ，Daniel Kroening ，Ofer Strichman，“Decision Procedures: An Algorithmic Point of View （Texts in Theoretical Computer Science. An EATCS Series）”，Springer，2008/7/7
参考文献１には，制約ソルバ（ＳＡＴ（Satisfiability）ソルバ，ＳＭＴ（Satisfiable Modulo Theories ）ソルバ）に関する技術についての説明が記載されている。ここでは，制約ソルバについての詳細な説明は省略する。
【００３２】
また，制約ソルバを用いてテストデータを生成する技術としては，例えば参考文献２や参考文献３に記載された技術などがある。
〔参考文献２〕
特開２０１１−８５９６７号公報
〔参考文献３〕
Tao Xie ，Darko Marinov ，Wolfram Schulte ，David Notkin，“Symstra: A Framework for Generating Object-Oriented Unit Tests using Symbolic Execution ”，Proc. of TACAS 2005 ，Tools and Algorithms for the Construction and Analysis of Systems ，LNCS，vol 3340，pages 365-381 ，April 2005. 
参考文献２や参考文献３には，ＳＭＴソルバを用いてテストデータの生成を行う技術の例が記載されている。
【００３３】
テストデータの生成において，制約ソルバにパス条件を入力する際には，パス条件を制約ソルバが解釈できる記述に置き換える必要がある。以下では，制約ソルバが解釈できる記述を，制約記述と呼ぶ。
【００３４】
図３は，本実施の形態による処理パス（１）のテストデータを求める制約記述の例を示す図である。
【００３５】
図３に示す制約記述２１０は，テスト対象プログラム２００に処理パス（１）を実行させるテストデータを得るためのパス条件（１）が，制約ソルバが解釈する記述に置き換えられた制約記述の一例である。
【００３６】
図３に示す制約記述２１０において，＜変数の宣言＞部分には，処理パス（１）のパス条件（１）に関係する２つの変数「発注量」，「規定値」について，その定義と値の取り得る範囲の制約が記述されている。図３に示す制約記述２１０では，変数は桁数を配列長とする配列で定義されている。図３に示す制約記述２１０における変数の定義と値の取り得る範囲の制約についての詳細は，後述する。
【００３７】
図３に示す制約記述２１０において，＜固定値の制約＞部分には，テスト対象プログラム２００で固定値が設定された変数「規定値」を，その固定値“００９”で制約する記述がなされている。
【００３８】
制約ソルバでは整数と整数の配列しか扱えないため，制約記述では，文字列を整数で表現する必要がある。制約記述において文字列を整数で表現する技術としては，例えば参考文献４に記載された技術などがある。
〔参考文献４〕
Nikolaj Bjorner ，Nikolai Tillmann and Andrei Voronkov，“Path Feasibility Analysis for String-Manipulating Programs”，Proc. of TACAS 2009 ，Tools and Algorithms for the Construction and Analysis of Systems ，LNCS，vol 5505，pages 307-321 ，March 2009. 
参考文献４には，制約ソルバ上で文字列を文字コードとして表現する技術についての説明が記載されている。
【００３９】
本実施の形態では，文字列型の変数をアスキーコードの配列に置き換えることで，文字列型の変数を制約ソルバで扱えるようにする。なお，本実施の形態では，テスト対象プログラム２００で文字列型の変数と数値型の変数とを比較している場合に，数値型の変数をアスキーコードの配列で表現された文字列型の変数と比較するために，数値型の変数もアスキーコードの配列に置き換えるものとする。
【００４０】
テスト対象プログラム２００において，変数「規定値」は３桁の文字列型の変数である。そのため，図３に示す制約記述２１０では，変数「規定値」は，配列長が３であるアスキーコードの配列に置き換えられる。“０”はアスキーコードの４８番であり，“９”はアスキーコードの５７番であるので，変数「規定値」の配列に固定値“００９”を制約する記述は，図３の制約記述２１０における＜固定値の制約＞部分に示す通りとなる。
【００４１】
図３に示す制約記述２１０において，＜満たすべき条件の制約＞部分には，パス条件（１）における変数が満たすべき条件（発注量＝規定値）の制約が記述されている。
【００４２】
ここで，図３に示す制約記述２１０では，テスト対象プログラム２００において３桁の数値型で宣言された変数「発注量」が，長さ３の配列型であることを示すIntegerLen3 で定義されている。また，テスト対象プログラム２００において３桁の文字列型で宣言された変数「規定値」が，長さ３の配列型であることを示すStringLen3で定義されている。
【００４３】
また，図３に示す制約記述２１０において，長さ３の配列で定義された変数「発注量」の値域は，関数IsIntegerLen3 によって，０〜９の数字に対応するアスキーコードの範囲内に収まるように制約される。また，図３に示す制約記述２１０において，長さ３の配列で定義された変数「規定値」の値域は，関数IsStringLen3によって，空白，０〜９，Ａ〜Ｚ，ａ〜ｚ等の文字に対応するアスキーコードの範囲内に収まるように制約される。
【００４４】
図４は，本実施の形態による数値型／文字列型の変数の配列を定義する記述の例を示す図である。
【００４５】
図４（Ａ）に示す数値型の記述２２０は，３桁の数値型の変数の配列を定義する記述の例を示す。図４（Ａ）に示す数値型の記述２２０において，IsIntegerLen3 に関する記述では，IntegerLen3 で定義される配列長３の配列が，それぞれ０〜９の数字に対応するアスキーコードの範囲（４８番〜５７番）になるように定義されている。他の桁数の数値型の変数の配列を定義する記述についても，同様である。
【００４６】
図４（Ｂ）に示す文字列型の記述２３０は，３桁の文字列型の変数の配列を定義する記述の例を示す。図４（Ｂ）に示す文字列型の記述２３０において，IsStringLen3に関する記述では，StringLen3で定義される配列長３の配列が，それぞれ空白，０〜９，Ａ〜Ｚ，ａ〜ｚ等の文字に対応するアスキーコードの範囲（３２番，４８〜５７番，６５〜１２２番）になるように定義されている。他の桁数の文字列型の変数の配列を定義する記述についても，同様である。
【００４７】
このような桁数ごと型ごとに変数の配列の定義する記述のデータを，制約ソルバに入力させておく。この状態で，図３に示す制約記述２１０のデータを入力すると，制約ソルバは，パス条件（１）を満たす充足解となる変数「発注量」の値を１つ出力する。
【００４８】
図５は，本実施の形態による制約ソルバの実行結果の例を示す図である。
【００４９】
図５に示す実行結果２４０は，図３に示す制約記述２１０を制約ソルバに入力した際に出力される充足解の一例である。図５に示す制約ソルバの実行結果２４０では，変数「発注量」の配列の要素ごとに，アスキーコードで結果が示されている。アスキーコード４８番は“０”，アスキーコード５７番は“９”であるので，図５に示す実行結果２４０から得られる変数「発注量」の値は“００９”となる。
【００５０】
このように，パス条件（１）について記述した制約記述２１０を制約ソルバに入力すると，パス条件（１）を満たす変数「発注量」の値として，制約ソルバから“００９”が返される。ここで得られた変数「発注量」の値“００９”が，図１に示すテスト対象プログラム２００に処理パス（１）を実行させるテストを行う際に，変数「発注量」に入力するテストデータとなる。テストの実施者は，変数「発注量」にテストデータ“００９”を入力して図１に示すテスト対象プログラム２００を実行することで，処理パス（１）についてのテストを行うことができる。
【００５１】
図６は，本実施の形態による処理パス（４）のテストデータを求める制約記述の例を示す図である。
【００５２】
上記のように，処理パス（４）をテストするためのテストデータを生成する場合のパス条件（４）は，「ＮＯＴ（発注量＝規定値），かつＮＯＴ（発注量＞発注量上限），かつＮＯＴ（発注量＜発注量下限）」である。パス条件（４）を，前述した処理パス（１）のテストデータを生成するときと同様のやり方で，そのまま制約ソルバに入力できる記述に変換すると，例えば図６に示す制約記述２１５のようになる。
【００５３】
なお，図６に示す制約記述２１５において，IntegerLen5 は，配列長を５とする数値型の変数の配列の定義を示し，StringLen5は，配列長を５とする文字列型の変数の配列の定義を示すものとする。また，IsIntegerLen5 は，配列長を５とする数値型の変数の配列の値域が所定のアスキーコードの範囲内に収まるように制約する関数を示し，IsStringLen5は，配列長を５とする文字列型の変数の配列の値域が所定のアスキーコードの範囲内に収まるように制約する関数を示すものとする。
【００５４】
図６に示す制約記述２１５において，変数「発注量」の配列は配列長が３であり，変数「発注量上限」の配列と変数「発注量下限」の配列の配列長は５である。すなわち，図６に示す制約記述２１５では，＜満たすべき条件の制約＞部分において，（ｎｏｔ（＞  発注量  発注量上限））の制約と（ｎｏｔ（＜  発注量  発注量下限) ）の制約とで，配列長が異なる配列同士を制約することになる。制約ソルバでは，配列長が異なる配列同士を制約することができないため，図６に示す制約記述２１５の実行結果はエラーとなってしまう。
【００５５】
このような問題が発生する原因は，パス条件をそのまま制約記述に変換するやり方では，ＣＯＢＯＬの転記ルールを想定した制約の記述ができないことにある。転記は，分岐における条件判定時に，一時的に変数の値を別の値に書き写すことである。
【００５６】
ＣＯＢＯＬのプログラムでは，数値型の変数に対する「桁」を記述するようになっている。また，ＣＯＢＯＬのプログラムでは，桁数が異なる変数間の比較条件や，数値型の変数と文字列型の変数との間の比較条件を記述することができる。ＣＯＢＯＬのプログラムの実行時には，桁数や型が異なる変数の値をそのまま比較することはできないため，転記が行われる。
【００５７】
ＣＯＢＯＬにおける転記のルールは，例えば，次の通りとなる。
・転記ルール＃１：数値と文字列を比較する際には，数値を文字列に転記し，文字列比較を行う。
・転記ルール＃２：数値比較の実行時に，桁数の異なる変数間で比較を行う場合，桁数が少ない方の変数の値を右詰めにし，桁数が等しくなるまで左側に“０”を詰める。
・転記ルール＃３：文字列比較の実行時に，桁数の異なる変数間で比較を行う場合，桁数が少ない方の変数の値を左詰めにし，桁数が等しくなるまで右側に空白を詰める。
【００５８】
図７は，ＣＯＢＯＬにおける転記ルールを説明する図である。
【００５９】
図７（Ａ）は，桁数が同じ数値型の変数と文字列型の変数とを比較する場合の転記の例を示す。図７（Ｂ）は，桁数が異なる数値型の変数同士を比較する場合の転記の例を示す。図７（Ｃ）は，桁数が異なる数値型の変数と文字列型の変数とを比較する場合の転記の例を示す。なお，図７において，「発注量」の値の“？”は，値が固定値ではないことを示している。また，文字列の値における“￥”は，空白を表すものとする。
【００６０】
図７（Ａ）には，図１に示すテスト対象プログラム２００の分岐［１］において，変数「発注量」と変数「規定値」とを比較する場合の例が示されている。テスト対象プログラム２００において，変数「発注量」は３桁の数値型であり，変数「規定値」は３桁の文字列型である。上記の転記ルール＃１から，図７（Ａ）に示すように，３桁の数値である変数「発注量」の値が３桁の文字列の値に転記され，３桁の文字列である変数「規定値」の値との文字列比較が行われる。
【００６１】
図７（Ｂ）には，図１に示すテスト対象プログラム２００の分岐［２］において，変数「発注量」と変数「発注量上限」とを比較する場合の例が示されている。テスト対象プログラム２００において，変数「発注量」は３桁の数値型であり，変数「発注量上限」は５桁の数値型である。
【００６２】
上記の転記ルール＃２から，図７（Ｂ）に示すように，３桁の数値である変数「発注量」の値が５桁の数値に転記される。このとき，先頭の２桁に“０”が詰められる。転記によって５桁の数値となった変数「発注量」の値と，５桁の数値である変数「発注量上限」の値との数値比較が行われる。
【００６３】
図７（Ｃ）には，図１に示すテスト対象プログラム２００の分岐［３］において，変数「発注量」と変数「発注量下限」とを比較する場合の例が示されている。テスト対象プログラム２００において，変数「発注量」は３桁の数値型であり，変数「発注量下限」は５桁の文字列型である。
【００６４】
上記の転記ルール＃１と転記ルール＃３とから，図７（Ｃ）に示すように，３桁の数値である変数「発注量」の値が５桁の文字列に転記される。このとき，末尾の２桁に空白が詰められる。転記によって５桁の文字列となった変数「発注量」の値と，５桁の文字列である変数「発注量下限」の値との文字列比較が行われる。
【００６５】
制約記述に記述できるのは変数の宣言と制約のみであり，分岐の条件に応じて変数の値を書き換えることはできない。そのため，ＣＯＢＯＬプログラム実行時に起こる転記を制約として，制約記述に対してそのまま記述することはできない。桁の概念を持つＣＯＢＯＬなどのプログラミング言語については，転記ルールを想定した制約を記述することができないため，すべてのパス条件を正しく制約記述に置き換えることは困難である。
【００６６】
より具体的には，例えば，
１）数値型の変数で「桁」を宣言するプログラム言語で記述されたプログラムにおける処理パスのパス条件であり，
２）パス条件中に数値型の変数Ａと，数値型の変数Ｂ，文字列型の変数Ｃが存在し，
３）数値型の変数Ａの桁数より，数値型の変数Ｂの桁数が大きく，
４）数値型の変数Ａの桁数より，文字列型の変数Ｃの桁数が大きく，
５）分岐の条件に，変数Ａと変数Ｂとを比較する比較条件が含まれており，
６）分岐の条件に，変数Ａと変数Ｃとを比較する比較条件が含まれている
場合に，そのパス条件を正しく制約記述に置き換えることは困難である。
【００６７】
以下では，桁の概念を持つプログラミング言語で記述されたプログラムについて，制約ソルバを用いてテストデータを生成する際に，パス条件のデータから正しい制約記述のデータを自動的に生成する本実施の形態の技術について，説明する。
【００６８】
図８は，本実施の形態によるテストデータ生成装置の構成例を示す図である。
【００６９】
図８に示すテストデータ生成装置１００は，テスト対象プログラム２００に特定の処理パスを実行させるための変数の値を自動生成する。なお，図８に示すテストデータ生成装置１００において，実線は主に制御関係を示し，破線は主にデータ関係を示す。
【００７０】
テストデータ生成装置１００は，パス条件情報記憶部１１０，制約記述生成部１２０，制約設定情報記憶部１３０，制約記述情報記憶部１４０，制約ソルバ実行部１５０，充足解情報記憶部１６０，結果処理部１７０，テスト情報記憶部１８０を備える。
【００７１】
パス条件情報記憶部１１０は，パス条件情報を記憶する記憶部である。パス条件情報は，テスト対象プログラム２００に特定の処理パスを実行させる条件を示すパス条件の情報である。パス条件情報記憶部１１０に記憶されるパス条件の情報は，あらかじめテスト対象プログラム２００から，人手で，またはコンピュータによる自動処理で用意される。
【００７２】
制約記述生成部１２０は，制約ソルバに入力する制約記述のデータを，パス条件情報記憶部１１０に記憶されたパス条件情報から自動で生成する。
【００７３】
このとき，制約記述生成部１２０は，制約記述のデータを自動生成する際の上記の転記ルール＃２，転記ルール＃３への対処として，転記で桁の補完が行われる変数について，配列長を増加した変数の配列を宣言するように設定を行う。転記の対象となる変数が文字列型の変数であれば，変数の配列の末尾から転記によって増加する桁数分の要素に，空白の値を設定する。また，転記の対象となる変数が数値型の変数であれば，変数の配列の先頭から転記によって増加する桁数分の要素に，“０”の値を設定する。ＣＯＢＯＬで記述されたプログラムの実行時における転記による値の引き伸ばしは，その比較条件の実行において臨時に行われるものであり，他の処理に影響を与えない。制約記述においても，転記への対処が転記が行われない条件文に影響することを防ぐために，桁数を補完した分の配列の要素に，あらかじめ意味のない値，すなわち空白や“０”を設定しておく。
【００７４】
また，制約記述生成部１２０は，制約記述のデータを自動生成する際の上記の転記ルール＃１への対処として，値が文字列に転記され得る数値型の変数があれば，該数値型の変数の配列に加えて，さらに該数値型の変数に対応する比較用の変数の配列を宣言するように設定を行う。例えば，図１に示すテスト対象プログラム２００における変数「発注量」のように，数値への転記と文字列への転記とが起こる変数については，桁数を補完する位置が先頭になったり，末尾になったりするので，どこからどこまでが本来の変数の桁であるのかが判別困難になる。制約記述において，数値型の変数に対応する文字列との比較用の変数の配列を別に用意することで，数値型の変数の配列に対する桁の補完先を先頭に限定することが可能となり，常に変数の配列の末尾から本来の桁が始まると判別できるようになる。数値型の変数の値を文字列に転記する条件に対しては，数値型の変数に対応する比較用の変数の配列を用いた制約を行うようにする。
【００７５】
制約設定情報記憶部１３０は，制約設定情報を記憶する記憶部である。制約設定情報は，制約記述で宣言する変数の配列や，変数の配列を制約する設定が記録される情報である。本実施の形態の制約記述生成部１２０は，パス条件情報から中間データとなる制約設定情報を生成し，その制約設定情報を自動変換することで制約記述のデータを生成する。
【００７６】
制約記述情報記憶部１４０は，制約記述生成部１２０によって自動生成された制約記述のデータを記憶する記憶部である。
【００７７】
制約ソルバ実行部１５０は，自動生成された制約記述のデータを入力として，制約ソルバを実行する。
【００７８】
充足解情報記憶部１６０は，充足解情報を記憶する記憶部である。充足解情報は，制約ソルバが出力する制約ソルバの実行結果のデータである。制約ソルバの実行結果は，例えば図５の実行結果２４０に示すように，変数の配列の要素ごとの文字コードとして得られる。
【００７９】
結果処理部１７０は，充足解情報記憶部１６０に記憶された充足解情報から，実際にテストに用いることができる変数の値のデータを生成する。本実施の形態で得られる充足解情報には，テストで用いる変数のデータとして不要なデータも含まれる場合がある。結果処理部１７０は，充足解情報から不要なデータを削除した最終的な結果のデータを生成する。
【００８０】
テスト情報記憶部１８０は，結果処理部１７０により得られた結果のデータを記憶する記憶部である。テスト情報記憶部１８０に記憶される結果データには，テストを行う際に入力する変数の値すなわちテストデータが含まれる。
【００８１】
制約記述生成部１２０は，変数宣言情報生成部１２１，変数制約情報生成部１２２，比較用変数追加部１２３，比較対象変更部１２４，桁補完部１２５，補完桁制約設定部１２６，比較用変数制約設定部１２７，変換部１２８を備える。
【００８２】
変数宣言情報生成部１２１，比較用変数追加部１２３，桁補完部１２５は，制約記述で宣言する変数の配列を設定する変数設定機能部（図示省略）となる。変数設定機能部は，パス条件情報記憶部１１０に記憶されたパス条件の情報に基づいて，変数の桁数を配列長とする変数の配列を設定する。このとき，変数設定機能部は，数値型の変数については，該数値型の変数に対応する比較用の変数の配列をさらに設定する。また，変数設定機能部は，異なる桁数の変数を比較する条件における桁数が少ない方の変数については，桁数が多い方の変数の桁数に合わせて配列長を増加した変数の配列を設定する。
【００８３】
より具体的には，変数宣言情報生成部１２１は，パス条件に存在する各変数について，変数の桁数を配列長とする変数の配列を設定する。本実施の形態では，変数宣言情報生成部１２１は，変数の配列の設定を，制約設定情報記憶部１３０に記憶する制約設定情報に記録する。
【００８４】
比較用変数追加部１２３は，パス条件に存在する数値型の変数について，該数値型の変数に対応する比較用の変数の配列をさらに追加で設定する。比較用変数追加部１２３は，比較用の変数の配列の設定を，制約設定情報記憶部１３０の制約設定情報に追加で記録する。制約記述において，比較用の変数の配列は，文字列型の変数の配列と同様に扱われる。
【００８５】
桁補完部１２５は，パス条件に異なる桁数の変数を比較する条件が存在する場合に，その条件で比較が行われる変数で桁数が少ない方の変数については，桁数が多い方の変数の桁数に合わせて配列長を増加する設定を行う。桁補完部１２５による設定は，制約設定情報記憶部１３０の制約設定情報に反映される。
【００８６】
変数制約情報生成部１２２，比較対象変更部１２４は，変数の配列の制約を設定する制約設定機能部（図示省略）となる。制約設定機能部は，パス条件情報記憶部１１０に記憶されたパス条件の情報に基づいて，変数が満たすべき条件に応じた変数の配列の制約を設定する。このとき，制約設定機能部は，数値型の変数と文字列型の変数との比較を行う条件については，該数値型の変数に対応する比較用の変数の配列と該文字列型の変数の配列とを比較する条件の制約を設定する。
【００８７】
より具体的には，変数制約情報生成部１２２は，パス条件における変数が満たすべき条件に応じて，変数の配列の制約を設定する。本実施の形態では，変数制約情報生成部１２２は，変数の配列の制約の設定を，制約設定情報記憶部１３０に記憶する制約設定情報に記録する。
【００８８】
比較対象変更部１２４は，パス条件に数値型の変数と文字列型の変数との比較を行う条件が存在する場合に，その条件に応じた変数の配列の制約について，該数値型の変数の配列を，該数値型の変数に対応する比較用の変数の配列に変更する設定を行う。比較対象変更部１２４による設定は，制約設定情報記憶部１３０の制約設定情報に反映される。
【００８９】
補完桁制約設定部１２６は，配列長を増加した変数の配列について，増加した分の配列の要素に所定の値を設定する。より具体的には，補完桁制約設定部１２６は，数値型の変数の配列については，先頭から増加した分の要素を所定の値に制約する設定を行う。また，補完桁制約設定部１２６は，文字列型の変数の配列と比較用の変数の配列については，末尾から増加した分の要素を所定の値に制約する設定を行う。本実施の形態では，補完桁制約設定部１２６は，増加した分の配列の制約の設定を，制約設定情報記憶部１３０に記憶する制約設定情報に記録する。
【００９０】
比較用変数制約設定部１２７は，数値型の変数の配列と，該数値型の変数に対応する比較用の変数の配列との関係を制約する設定を行う。本実施の形態では，比較用変数制約設定部１２７は，２つの配列間の関係の制約の設定を，制約設定情報記憶部１３０に記憶する制約設定情報に記録する。
【００９１】
変換部１２８は，設定された変数の配列および制約から，制約ソルバが解釈する記述データを生成する。より具体的には，変換部１２８は，制約設定情報記憶部１３０に記憶された制約設定情報を自動変換することで，制約ソルバが解釈する記述データ，すなわち制約記述のデータを生成する。生成された制約記述のデータは，制約記述情報記憶部１４０に記憶される。
【００９２】
結果処理部１７０は，逆変換部１７１，補完桁削除部１７２，比較用変数削除部１７３を備える。
【００９３】
逆変換部１７１は，充足解情報記憶部１６０に記憶された充足解情報を自動変換し，結果データを生成する。ここで生成された結果データは，変数の配列の要素ごとの文字コードのデータである充足解情報が，テスト対象プログラム２００における変数の値のデータに変換されたデータである。逆変換部１７１は，得られた結果データを，テスト情報記憶部１８０に記憶する。
【００９４】
補完桁削除部１７２は，制約設定情報記憶部１３０の制約設定情報を参照し，テスト情報記憶部１８０に記憶された結果データから，配列長を増やした変数について，増加した配列の要素に相当する文字を削除する。より具体的には，補完桁削除部１７２は，テスト情報記憶部１８０の結果データにおいて，配列長を増やした数値型の変数については，先頭から増加した分の文字を削除する。また，補完桁削除部１７２は，テスト情報記憶部１８０の結果データにおいて，配列長を増やした文字列型の変数については，末尾から増加した分の文字を削除する。
【００９５】
比較用変数削除部１７３は，制約設定情報記憶部１３０の制約設定情報を参照し，テスト情報記憶部１８０に記憶された結果データから，比較用の変数のデータを削除する。
【００９６】
図９は，本実施の形態によるテストデータ生成装置によるテストデータ生成処理フローチャートである。
【００９７】
テストデータ生成装置１００の制約記述生成部１２０において，変数宣言情報生成部１２１は，変数宣言情報生成処理を実行する（ステップＳ１０）。変数宣言情報生成処理は，パス条件に存在する変数について，制約記述で宣言する変数の配列を設定する処理である。変数宣言情報生成処理の詳細な例については，後述する。
【００９８】
変数制約情報生成部１２２は，変数制約情報生成処理を実行する（ステップＳ１１）。変数制約情報生成処理は，パス条件に存在する変数が満たすべき条件に応じて，変数の配列の制約を設定する処理である。変数制約情報生成処理の詳細な例については，後述する。
【００９９】
比較用変数追加部１２３は，比較用変数追加処理を実行する（ステップＳ１２）。比較用変数追加処理は，数値型の変数について，その数値型の変数に対応する比較用の変数の配列を追加で設定する処理である。比較用変数追加処理の詳細な例については，後述する。
【０１００】
比較対象変更部１２４は，比較対象変更処理を実行する（ステップＳ１３）。比較対象変更処理は，数値型の変数と文字列型の変数とを比較する条件について設定された制約において，数値型の変数の配列を，その数値型の変数に対応する比較用の変数の配列に変更する処理である。比較対象変更処理の詳細な例については，後述する。
【０１０１】
桁補完部１２５は，桁補完処理を実行する（ステップＳ１４）。桁補完処理は，異なる桁数の変数を比較する条件において桁数が少ない方の変数の配列について，桁数が多い方の変数の配列長にあわせて配列を補完する処理である。桁補完処理の詳細な例については，後述する。
【０１０２】
補完桁制約設定部１２６は，補完桁制約設定処理を実行する（ステップＳ１５）。補完桁制約設定処理は，桁補完処理で配列長が増加された変数の配列について，増加した分の配列の要素に所定の値を制約する設定を行う処理である。補完桁制約設定処理の詳細な例については，後述する。
【０１０３】
比較用変数制約設定部１２７は，比較用変数制約設定処理を実行する（ステップＳ１６）。比較用変数制約設定処理は，数値型の変数の配列と，その数値型の変数に対応する比較用の変数の配列との関係を示す制約を設定する処理である。比較用変数制約設定処理の詳細な例については，後述する。
【０１０４】
変換部１２８は，制約設定情報記憶部１３０の制約設定情報を自動変換することで，制約ソルバが解釈する制約記述のデータを生成する（ステップＳ１７）。制約ソルバ実行部１５０は，生成された制約記述のデータを入力として，制約ソルバを実行する（ステップＳ１８）。結果処理部１７０において，逆変換部１７１は，制約ソルバの実行結果である充足解情報記憶部１６０の充足解情報を自動変換することで，パス条件を満たす変数の値が記録された結果データを生成する（ステップＳ１９）。
【０１０５】
補完桁削除部１７２は，補完桁削除処理を実行する（ステップＳ２０）。補完桁削除処理は，結果データにおける変数の値から，配列長の増加によって補完された文字を削除する処理である。補完桁削除処理の詳細な例については，後述する。
【０１０６】
比較用変数削除部１７３は，比較用変数削除処理を実行する（ステップＳ２１）。比較用変数削除処理は，結果データに残っている比較用の変数を削除する処理である。比較用変数削除処理の詳細な例については，後述する。
【０１０７】
図１０は，本実施の形態によるテストデータ生成装置を実現するコンピュータのハードウェア構成例を示す図である。
【０１０８】
図８に示す本実施の形態のテストデータ生成装置１００を実現するコンピュータ１は，例えば，ＣＰＵ（Central Processing Unit ）２，主記憶となるメモリ３，記憶装置４，通信装置５，媒体読取・書込装置６，入力装置７，出力装置８等を備える。記憶装置４は，例えばＨＤＤ（Hard Disk Drive ）等の外部記憶装置や，補助記憶装置などである。媒体読取・書込装置６は，例えばＣＤ−Ｒ（Compact Disc Recordable ）ドライブやＤＶＤ−Ｒ（Digital Versatile Disc Recordable ）ドライブなどである。入力装置７は，例えばキーボード・マウス等の入力機器などである。出力装置８は，例えばディスプレイ等の表示装置などである。
【０１０９】
図８に示すテストデータ生成装置１００およびテストデータ生成装置１００が備える各機能部は，コンピュータ１が備えるＣＰＵ２，メモリ３等のハードウェアと，ソフトウェアプログラムとによって実現することが可能である。コンピュータ１が実行可能なプログラムは，記憶装置４に記憶され，その実行時にメモリ３に読み出され，ＣＰＵ２により実行される。
【０１１０】
コンピュータ１は，可搬型記録媒体から直接プログラムを読み取り，そのプログラムに従った処理を実行することもできる。また，コンピュータ１は，サーバコンピュータからプログラムが転送されるごとに，逐次，受け取ったプログラムに従った処理を実行することもできる。さらに，このプログラムは，コンピュータ１で読み取り可能な記録媒体に記録しておくことができる。
【０１１１】
以下では，本実施の形態によるテストデータ生成の技術について，より具体的な例を用いて説明を行う。ここでは，図１に示すテスト対象プログラム２００に図２に示す処理パス（４）を実行させるためのテストデータを生成する例を説明する。なお，以下で説明する例では，図１に示すテスト対象プログラム２００で宣言されている変数を，データ項目とも呼ぶものとする。また，制約記述で宣言する変数を，単に変数と呼ぶものとする。
【０１１２】
図１１は，本実施の形態によるデータ項目テーブルおよび分岐条件テーブルの例を示す図である。
【０１１３】
図１１に示すデータ項目テーブル１１２，分岐条件テーブル１１４は，パス条件情報記憶部１１０に記憶された，テスト対象プログラム２００に処理パス（４）を実行させるためのパス条件（４）についてのパス条件情報の一例である。
【０１１４】
図１１（Ａ）に示すデータ項目テーブル１１２は，パス条件（４）にあるデータ項目についての情報が記録されたデータの一例である。データ項目テーブル１１２は，データ項目，型，桁数，固定値の情報を持つ。データ項目は，テスト対象プログラム２００で宣言されたデータ項目を示す。型は，テスト対象プログラム２００において，該当データ項目が数値型で宣言されているか文字列型で宣言されているかを示す。桁数は，テスト対象プログラム２００で宣言された，該当データ項目の桁数を示す。固定値は，テスト対象プログラム２００において，該当データ項目に定義された固定値を示す。固定値が設定されていないデータ項目については，データ項目テーブル１１２に固定値の情報がない。
【０１１５】
図１１（Ｂ）に示す分岐条件テーブル１１４は，テスト対象プログラム２００の処理が処理パス（４）の流れとなるように，分岐において満たすべき条件の情報が記録されたデータの一例である。分岐条件テーブルは，第１オペランド，演算子，第２オペランドの情報を持つ。演算子は，分岐において満たすべき条件を示す式の演算子である。第１オペランドは，分岐において満たすべき条件を示す式の左辺を示し，第２オペランドは，分岐において満たすべき条件を示す式の右辺を示す。
【０１１６】
上記のパス条件（４）は，「ＮＯＴ（発注量＝規定値），かつＮＯＴ（発注量＞発注量上限），かつＮＯＴ（発注量＜発注量下限）」となっている。分岐条件テーブル１１４は，上記のパス条件（４）のＮＯＴ括弧書きを展開した，条件「（発注量ＮＯＴ＝規定値），かつ（発注量＜＝発注量上限），かつ（発注量＞＝発注量下限）」に基づいて，生成されている。
【０１１７】
図１１に示すデータ項目テーブル１１２，分岐条件テーブル１１４は，テスト対象プログラム２００とパス条件（４）とから，人手により，またはコンピュータを用いた解析によって生成され，パス条件情報記憶部１１０に格納される。
【０１１８】
図１２は，本実施の形態による変数宣言データおよび変数制約データの例を示す図である。
【０１１９】
図１２に示す変数宣言データ１３２，変数制約データ１３４は，変数宣言情報生成部１２１，変数制約情報生成部１２２により生成され，制約設定情報記憶部１３０に記憶される制約設定情報の一例である。変数宣言情報生成部１２１，変数制約情報生成部１２２は，図１１に示すデータ項目テーブル１１２，分岐条件テーブル１１４から，図１２に示す変数宣言データ１３２，変数制約データ１３４を生成する。
【０１２０】
図１２（Ａ）に示す変数宣言データ１３２は，制約記述で宣言する変数の配列の設定が記録されたデータの一例である。変数宣言データ１３２は，データ項目，型，桁数，固定値，変数名，配列長，文字列型変数名の情報を持つ。データ項目，型，桁数，固定値については，図１１（Ａ）に示すデータ項目テーブル１１２のデータ項目，型，桁数，固定値と同様である。変数名は，該当データ項目について，制約記述で宣言する変数の名称である。配列長は，該当変数名の変数の配列について，制約記述で宣言する配列長を示す。文字列型変数名は，該当データ項目が数値型である場合に，文字列の比較用に宣言する変数の名称を示す。
【０１２１】
なお，本実施の形態の技術では，数値型のデータ項目については，１つのデータ項目に対して，数値比較用の変数と文字列比較用の変数との２つの変数を割り当てるため，ここではあえてデータ項目の名称を別の変数名に置き換えている。データ項目の名称を，制約記述で宣言するための別の変数名に置き換えずに，そのまま制約記述で使用するようにしてもよい。ただし，この場合でも，後述の数値型のデータ項目について文字列の比較用の変数を別に設定する処理では，文字列の比較用の変数に別の変数名を設定する必要がある。
【０１２２】
図１２（Ｂ）に示す変数制約データ１３４は，制約記述において，変数の配列が満たすべき条件の制約が設定されたデータの一例である。変数制約データ１３４は，オペランド＃１，開始桁＃１，終了桁＃１，演算子，オペランド＃２，開始桁＃２，終了桁＃２の情報を持つ。演算子については，図１１（Ｂ）に示す分岐条件テーブル１１４の演算子と同様である。オペランド＃１，開始桁＃１，終了桁＃１は，該当制約の式における左辺の情報を示し，オペランド＃２，開始桁＃２，終了桁＃２は，該当制約の式における右辺の情報を示す。左辺（または右辺）が変数の配列を示す場合には，オペランド＃１（またはオペランド＃２）はその変数名を示し，開始桁＃１（または開始桁＃２）は開始となる配列要素の番号を示し，終了桁＃１（または終了桁＃２）は終了となる配列要素の番号を示す。左辺（または右辺）が特定の値を示す場合には，オペランド＃１（またはオペランド＃２）はその値を示し，開始桁＃１（または開始桁＃２）と終了桁＃１（または終了桁＃２）は情報なしとなる。
【０１２３】
変数宣言情報生成部１２１は，変数宣言データ１３２を生成する。このとき，変数宣言情報生成部１２１は，変数宣言データ１３２のデータ項目，型，桁数，固定値については，図１１（Ａ）に示すデータ項目テーブル１１２の各レコードのデータをコピーする。また，変数宣言データ１３２の各レコードについて，それぞれの型に応じた，制約記述で宣言する一意の変数名を設定する。ここでは，変数宣言情報生成部１２１は，数値型のデータ項目については“Ｎ”に添字を付けた変数名を設定し，文字列型のデータ項目については“Ｓ”に添字を付けた変数名を設定する。例えば，各データ項目「発注量」，「規定値」，「発注量下限」，「発注量上限」に，それぞれＮ１，Ｓ１，Ｓ２，Ｎ２が設定される。また，変数宣言情報生成部１２１は，変数宣言データ１３２の各レコードについて，配列長に桁数の値を設定する。ここまでの変数宣言情報生成部１２１の処理で，変数宣言データ１３２は，図１２（Ａ）に示す通りとなる。
【０１２４】
図１３は，本実施の形態の変数宣言情報生成部による変数宣言情報生成処理フローチャートである。
【０１２５】
図１３に示すフローチャートは，図９に示すフローチャートのステップＳ１０に示す変数宣言情報生成処理の一例である。
【０１２６】
変数宣言情報生成部１２１は，データ項目テーブル１１２から，データ項目を順に１つ選択する（ステップＳ３０）。変数宣言情報生成部１２１は，選択されたデータ項目についてのデータをデータ項目テーブル１１２から取得し，変数宣言データ１３２に記録する（ステップＳ３１）。変数宣言情報生成部１２１は，変数宣言データ１３２において，選択されたデータ項目に対して制約記述で宣言する一意の変数名を割り当てる（ステップＳ３２）。変数宣言情報生成部１２１は，変数宣言データ１３２において，選択されたデータ項目の配列長に，該データ項目の桁数を設定する（ステップＳ３３）。
【０１２７】
変数宣言情報生成部１２１は，データ項目テーブル１１２のすべてのデータ項目について処理が終了したかを判定する（ステップＳ３４）。すべてのデータ項目について処理が終了していなければ（ステップＳ３４のＮＯ），変数宣言情報生成部１２１は，ステップＳ３０の処理に戻って，次のデータ項目の処理に移る。すべてのデータ項目について処理が終了していれば（ステップＳ３４のＹＥＳ），変数宣言情報生成部１２１は，処理を終了する。
【０１２８】
次に，変数制約情報生成部１２２は，変数制約データ１３４を生成する。このとき，変数制約情報生成部１２２は，図１１（Ｂ）に示す分岐条件テーブル１１４の各条件のレコードごとに，対応するレコードを変数制約データ１３４に生成する。例えば，図１１（Ｂ）に示す分岐条件テーブル１１４における１番目の条件について，対応する変数制約データ１３４のレコードを生成する例を説明する。
【０１２９】
図１１（Ｂ）に示す分岐条件テーブル１１４の該当条件の第１オペランドには，データ項目「発注量」が記録されている。変数制約情報生成部１２２は，図１２（Ａ）に示す変数宣言データ１３２から，データ項目「発注量」に対応する変数名Ｎ１と配列長“３”を取得する。変数制約情報生成部１２２は，変数制約データ１３４の該当レコードにおいて，オペランド＃１には取得した変数名Ｎ１を設定し，開始桁＃１には値“１”を設定し，終了桁＃１には取得した配列長“３”を設定する。変数制約データ１３４の演算子については，変数制約情報生成部１２２は，図１１（Ｂ）に示す分岐条件テーブル１１４の該当条件の演算子“ＮＯＴ＝”をそのまま記録する。図１１（Ｂ）に示す分岐条件テーブル１１４の該当条件の第２オペランドには，データ項目「規定値」が記録されている。変数制約情報生成部１２２は，図１２（Ａ）に示す変数宣言データ１３２から，データ項目「規定値」に対応する変数名Ｓ１と配列長“３”を取得する。変数制約情報生成部１２２は，変数制約データ１３４の該当レコードにおいて，オペランド＃２には取得した変数名Ｓ１を設定し，開始桁＃２には値“１”を設定し，終了桁＃２には取得した配列長“３”を設定する。
【０１３０】
変数制約情報生成部１２２が，このような条件ごとの処理をすべての条件について行うと，変数制約データ１３４は，図１２（Ｂ）に示す通りとなる。
【０１３１】
図１４は，本実施の形態の変数制約情報生成部による変数制約情報生成処理フローチャートである。
【０１３２】
図１４に示すフローチャートは，図９に示すフローチャートのステップＳ１１に示す変数制約情報生成処理の一例である。
【０１３３】
変数制約情報生成部１２２は，分岐条件テーブル１１４から，条件を１つ選択する（ステップＳ４０）。変数制約情報生成部１２２は，変数制約データ１３４にレコードを生成する（ステップＳ４１）。
【０１３４】
変数制約情報生成部１２２は，変数宣言データ１３２を参照し，選択された条件の第１オペランドに示すデータ項目に対応する変数名と配列長を取得する（ステップＳ４２）。変数制約情報生成部１２２は，変数制約データ１３４の該当レコードのオペランド＃１に，取得された変数名を設定する（ステップＳ４３）。変数制約情報生成部１２２は，変数制約データ１３４の該当レコードの開始桁＃１に値“１”を設定する（ステップＳ４４）。変数制約情報生成部１２２は，変数制約データ１３４の該当レコードの終了桁＃１に取得された配列長を設定する（ステップＳ４５）。
【０１３５】
変数制約情報生成部１２２は，分岐条件テーブル１１４の選択された条件の演算子を，変数制約データ１３４の該当レコードの演算子に設定する（ステップＳ４６）。
【０１３６】
変数制約情報生成部１２２は，変数宣言データ１３２を参照し，選択された条件の第２オペランドに示すデータ項目に対応する変数名と配列長を取得する（ステップＳ４７）。変数制約情報生成部１２２は，変数制約データ１３４の該当レコードのオペランド＃２に，取得された変数名を設定する（ステップＳ４８）。変数制約情報生成部１２２は，変数制約データ１３４の該当レコードの開始桁＃２に値“１”を設定する（ステップＳ４９）。変数制約情報生成部１２２は，変数制約データ１３４の該当レコードの終了桁＃２に取得された配列長を設定する（ステップＳ５０）。
【０１３７】
変数制約情報生成部１２２は，分岐条件テーブル１１４のすべての条件について処理が終了したかを判定する（ステップＳ５１）。すべての条件について処理が終了していなければ（ステップＳ５１のＮＯ），変数制約情報生成部１２２は，ステップＳ４０の処理に戻って，次の条件の処理に移る。すべての条件について処理が終了していれば（ステップＳ５１のＹＥＳ），変数制約情報生成部１２２は，処理を終了する。
【０１３８】
次に，比較用変数追加部１２３は，図１２（Ａ）に示す変数宣言データ１３２において，数値型のデータ項目「発注量」，「発注量上限」について，それぞれ新たに比較用の変数Ｓ３，Ｓ４を定義したレコードを追加する。新たに定義された比較用の変数Ｓ３，Ｓ４の型は，文字列型とする。桁数，配列数については，元となったレコードのデータが踏襲される。固定値の設定は，行われない。比較用変数追加部１２３は，元の数値型の変数Ｎ１，Ｎ２のレコードの文字列型変数名に，それぞれ新たに定義された比較用の変数の変数名Ｓ３，Ｓ４をポインタとして記録する。
【０１３９】
図１５は，本実施の形態による変数宣言データの例を示す図である。
【０１４０】
図１２（Ａ）に示す変数宣言データ１３２に対して，比較用変数追加部１２３による比較用の変数の追加設定が行われると，変数宣言データ１３２は，図１５に示す通りとなる。
【０１４１】
図１６は，本実施の形態の比較用変数追加部による比較用変数追加処理フローチャートである。
【０１４２】
図１６に示すフローチャートは，図９に示すフローチャートのステップＳ１２に示す比較用変数追加処理の一例である。
【０１４３】
比較用変数追加部１２３は，変数宣言データ１３２のレコードを１つ選択する（ステップＳ６０）。比較用変数追加部１２３は，選択されたレコードの型が数値型であるかを判定する（ステップＳ６１）。変数宣言データ１３２の型において，“数値”は数値型を示している。選択されたレコードの型が数値型でなければ（ステップＳ６１のＮＯ），比較用変数追加部１２３は，ステップＳ６６の処理に進む。
【０１４４】
選択されたレコードの型が数値型であれば（ステップＳ６１のＹＥＳ），比較用変数追加部１２３は，選択されたレコードの複製レコードを変数宣言データ１３２に追加する（ステップＳ６２）。このとき，固定値は複製せずに，複製レコードの固定値は空データにしておくものとする。比較用変数追加部１２３は，複製レコードの型を文字列型を示す“文字列”に書き換える（ステップＳ６３）。比較用変数追加部１２３は，複製レコードに新規の変数名を割り当て，書き換える（ステップＳ６４）。比較用変数追加部１２３は，選択されたレコードの文字列型変数名に，複製レコードの変数名を設定する（ステップＳ６５）。
【０１４５】
比較用変数追加部１２３は，変数宣言データ１３２のすべてのレコードについて処理が終了したかを判定する（ステップＳ６６）。すべてのレコードについて処理が終了していなければ（ステップＳ６６のＮＯ），比較用変数追加部１２３は，ステップＳ６０の処理に戻って，次のレコードの処理に移る。すべてのレコードについて処理が終了していれば（ステップＳ６６のＹＥＳ），比較用変数追加部１２３は，処理を終了する。
【０１４６】
次に，比較対象変更部１２４は，図１２（Ｂ）に示す変数制約データ１３４において，数値型の変数と文字列型の変数とを比較する条件の制約について，数値型の変数を，その変数に対応する比較用の変数に変更する。
【０１４７】
例えば，図１２（Ｂ）に示す変数制約データ１３４において，１番目のレコードは，数値型の変数Ｎ１と文字列型の変数Ｓ１とを比較する条件の制約となっている。比較対象変更部１２４は，図１２（Ｂ）に示す変数制約データ１３４の１番目のレコードにおける数値型の変数Ｎ１を，その変数Ｎ１に対応付けて定義された比較用の変数Ｓ３に変更する。図１２（Ｂ）に示す変数制約データ１３４の３番目のレコードにおける数値型の変数Ｎ１も，同様に比較用の変数Ｓ３に変更される。
【０１４８】
図１７は，本実施の形態による変数制約データの例を示す図である。
【０１４９】
図１２（Ｂ）に示す変数制約データ１３４に対して，比較対象変更部１２４による，数値型の変数をその変数に対応する比較用の変数に変更する処理が行われると，変数制約データ１３４は，図１７に示す通りとなる。
【０１５０】
図１８は，本実施の形態の比較対象変更部による比較対象変更処理フローチャートである。
【０１５１】
図１８に示すフローチャートは，図９に示すフローチャートのステップＳ１３に示す比較対象変更処理の一例である。
【０１５２】
比較対象変更部１２４は，変数制約データ１３４のレコードを１つ選択する（ステップＳ７０）。比較対象変更部１２４は，選択されたレコードのオペランド＃１の変数のデータを，変数宣言データ１３２から取得する（ステップＳ７１）。ここでは，選択されたレコードのオペランド＃１の変数を，変数＃１と呼ぶものとする。また，比較対象変更部１２４は，選択されたレコードのオペランド＃２の変数のデータを，変数宣言データ１３２から取得する（ステップＳ７２）。ここでは，選択されたレコードのオペランド＃２の変数を，変数＃２と呼ぶものとする。
【０１５３】
比較対象変更部１２４は，「変数＃１の型が数値型かつ変数＃２の型が文字列型」であるかを判定する（ステップＳ７３）。「変数＃１の型が数値型かつ変数＃２の型が文字列型」であれば（ステップＳ７３のＹＥＳ），比較対象変更部１２４は，選択されたレコードのオペランド＃１の変数名を，該変数名に対応する文字列型変数名に書き換え（ステップＳ７４），ステップＳ７７の処理に進む。
【０１５４】
「変数＃１の型が数値型かつ変数＃２の型が文字列型」でなければ（ステップＳ７３のＮＯ），比較対象変更部１２４は，「変数＃２の型が数値型かつ変数＃１の型が文字列型」であるかを判定する（ステップＳ７５）。「変数＃２の型が数値型かつ変数＃１の型が文字列型」であれば（ステップＳ７５のＹＥＳ），比較対象変更部１２４は，選択されたレコードのオペランド＃２の変数名を，該変数名に対応する文字列型変数名に書き換え（ステップＳ７６），ステップＳ７７の処理に進む。
「変数＃２の型が数値型かつ変数＃１の型が文字列型」でなければ（ステップＳ７５のＮＯ），比較対象変更部１２４は，そのままステップＳ７７の処理に進む。このケースは，変数＃１と変数＃２とが互いに同じ型のケースである。
【０１５５】
比較対象変更部１２４は，変数制約データ１３４のすべてのレコードについて処理が終了したかを判定する（ステップＳ７７）。すべてのレコードについて処理が終了していなければ（ステップＳ７７のＮＯ），比較対象変更部１２４は，ステップＳ７０の処理に戻って，次のレコードの処理に移る。すべてのレコードについて処理が終了していれば（ステップＳ７７のＹＥＳ），比較対象変更部１２４は，処理を終了する。
【０１５６】
次に，桁補完部１２５は，図１７に示す変数制約データ１３４において，配列長が異なる変数同士を比較する条件の制約について，少ない方の変数の配列を，多い方の変数の配列に合わせる。
【０１５７】
例えば，図１７に示す変数制約データ１３４において，２番目のレコードと３番目のレコードは，いずれも配列長が“３”の変数と配列長が“５”の変数とを比較する条件の制約となっている。桁補完部１２５は，図１７に示す変数制約データ１３４において，２番目のレコードで配列長が“３”の変数Ｎ１と，３番目のレコードで配列長が“３”の変数Ｓ３とについて，図１５に示す変数宣言データ１３２の配列長“３”を“５”に変更する。配列長の変更に合わせて，図１７に示す変数制約データ１３４における，２番目のレコードの終了桁＃１と，３番目のレコード終了桁＃１とを，該当変数の配列長の増加に合わせて“５”に変更する。図１７に示す変数制約データ１３４において，１番目のレコードにも変数Ｓ３があるので，桁補完部１２５は，１番目のレコードの終了桁＃１を，該当変数Ｓ３の配列長の増加に合わせて“５”に変更する。
【０１５８】
また，変数Ｓ３の配列長の変更によって，図１７に示す変数制約データ１３４において，１番目のレコードは，配列長が“３”の変数と配列長が“５”の変数とを比較する条件の制約に変わってしまった。桁補完部１２５は，配列長が“３”の変数Ｓ１について，さらに，図１５に示す変数宣言データ１３２の配列長“３”を“５”に変更する。配列長の変更に合わせて，図１７に示す変数制約データ１３４における１番目のレコードの終了桁＃２を，該当変数Ｓ１の配列長の増加に合わせて“５”に変更する。また，図１５に示す変数宣言データ１３２において，固定値が設定された変数Ｓ１の配列長が“５”に変更されているので，固定値の値を２桁補完して５桁の値に変更する。変数Ｓ１は文字列型であるので，固定値の末尾に２桁の空白（￥）を補完する。
【０１５９】
図１９は，本実施の形態による変数宣言データおよび変数制約データの例を示す図である。
【０１６０】
図１５に示す変数宣言データ１３２，図１７に示す変数制約データ１３４に対して，桁補完部１２５による変数の配列長を変更する処理が行われると，変数宣言データ１３２，変数制約データ１３４は，それぞれ図１９（Ａ），図１９（Ｂ）に示す通りとなる。
【０１６１】
図２０は，本実施の形態の桁補完部による桁補完処理フローチャートである。
【０１６２】
図２０に示すフローチャートは，図９に示すフローチャートのステップＳ１４に示す桁補完処理の一例である。
【０１６３】
桁補完部１２５は，自身で保持する更新フラグを，偽に設定する（ステップＳ８０）。更新フラグの設定は，ある変数の配列長の変更に連動して，別の変数の配列長の変更が発生するパターンに対応するためである。
【０１６４】
桁補完部１２５は，変数制約データ１３４のレコードを１つ選択する（ステップＳ８１）。桁補完部１２５は，選択されたレコードのオペランド＃１の変数のデータを，変数宣言データ１３２から取得する（ステップＳ８２）。ここでは，選択されたレコードのオペランド＃１の変数を，変数＃１と呼ぶものとする。また，桁補完部１２５は，選択されたレコードのオペランド＃２の変数のデータを，変数宣言データ１３２から取得する（ステップＳ８３）。ここでは，選択されたレコードのオペランド＃２の変数を，変数＃２と呼ぶものとする。
【０１６５】
桁補完部１２５は，変数＃２の配列長より変数＃１の配列長の方が長いかを判定する（ステップＳ８４）。変数＃２の配列長より変数＃１の配列長の方が長ければ（ステップＳ８４のＹＥＳ），桁補完部１２５は，配列長更新処理を実行する（ステップＳ８５）。ここでは，変数＃ａ＝変数＃１，変数＃ｂ＝変数＃２，終了桁＃ｂ＝終了桁＃２を，配列長更新処理に渡す。配列長更新処理の詳細については，後述する。配列長の更新が行われたので，桁補完部１２５は，更新フラグを真に設定し（ステップＳ８６），ステップＳ８９の処理に進む。
【０１６６】
変数＃２の配列長より変数＃１の配列長の方が長くなければ（ステップＳ８４のＮＯ），桁補完部１２５は，変数＃１の配列長より変数＃２の配列長の方が長いかを判定する（ステップＳ８７）。変数＃１の配列長より変数＃２の配列長の方が長ければ（ステップＳ８７のＹＥＳ），桁補完部１２５は，配列長更新処理を実行する（ステップＳ８８）。ここでは，変数＃ａ＝変数＃２，変数＃ｂ＝変数＃１，終了桁＃ｂ＝終了桁＃１を，配列長更新処理に渡す。配列長更新処理の詳細については，後述する。配列長の更新が行われたので，桁補完部１２５は，更新フラグを真に設定し（ステップＳ８６），ステップＳ８９の処理に進む。
【０１６７】
変数＃１の配列長より変数＃２の配列長の方が長くなければ（ステップＳ８７のＮＯ），桁補完部１２５は，そのままステップＳ８９の処理に進む。このケースは，変数＃１の配列長と変数＃２の配列長とが同じ配列長のケースである。
【０１６８】
桁補完部１２５は，変数制約データ１３４のすべてのレコードについて処理が終了したかを判定する（ステップＳ８９）。すべてのレコードについて処理が終了していなければ（ステップＳ８９のＮＯ），桁補完部１２５は，ステップＳ８１の処理に戻って，次のレコードの処理に移る。
【０１６９】
すべてのレコードについて処理が終了していれば（ステップＳ８９のＹＥＳ），桁補完部１２５は，更新フラグが真であるかを判定する（ステップＳ９０）。更新フラグが真であれば（ステップＳ９０のＹＥＳ），桁補完部１２５は，ステップＳ８０の処理に戻って，再度処理を実行する。更新フラグが真でなければ（ステップＳ９０のＮＯ），桁補完部１２５は，処理を終了する。
【０１７０】
図２１は，本実施の形態の桁補完部による配列長更新処理フローチャートである。
【０１７１】
桁補完部１２５は，変数＃ａ，変数＃ｂ，終了桁＃ｂの値を取得する（ステップＳ１００）。変数＃ａは配列長が長い方の変数であり，変数＃ｂは配列長が短い方の変数である。桁補完部１２５は，変数宣言データ１３２において，変数＃ａの配列長で変数＃ｂの配列長を更新する（ステップＳ１０１）。
【０１７２】
桁補完部１２５は，変数宣言データ１３２を参照し，変数＃ｂの型が数値型であるかを判定する（ステップＳ１０２）。変数＃ｂの型が数値型であれば（ステップＳ１０２のＹＥＳ），桁補完部１２５は，変数宣言データ１３２において，変数＃ｂの固定値の先頭に配列長の増加分だけ“０”を追加する（ステップＳ１０３）。変数＃ｂの型が数値型でなければ（ステップＳ１０２のＮＯ），すなわち文字列型であれば，桁補完部１２５は，変数宣言データ１３２において，変数＃ｂの固定値の末尾に配列長の増加分だけ空白（￥）を追加する（ステップＳ１０４）。該当変数に固定値が設定されていない場合には，ステップＳ１０２〜ステップＳ１０４の処理は不要となる。
【０１７３】
桁補完部１２５は，変数制約データ１３４におけるステップＳ８１で選択されたレコードの終了桁＃ｂを，変数＃ｂの配列長で更新する（ステップＳ１０５）。
【０１７４】
次に，補完桁制約設定部１２６は，図１９（Ｂ）に示す変数制約データ１３４に，配列長が増加された変数について，その増加数分の配列の要素に所定の値を制約する設定を追加する。例えば，補完桁制約設定部１２６は，図１９（Ｂ）に示す変数制約データ１３４に，配列長が２つ増加された数値型の変数Ｎ１について，その変数の配列の先頭から２つ分の要素を“０”に制約する追加設定を行う。また，補完桁制約設定部１２６は，図１９（Ｂ）に示す変数制約データ１３４に，配列長が２つ増加された文字列型の変数Ｓ１，比較用の変数Ｓ３について，その変数の配列の末尾から２つ分の要素を空白（￥）に制約する追加設定を行う。
【０１７５】
図２２は，本実施の形態による変数制約データの例を示す図である。
【０１７６】
図１９（Ｂ）に示す変数制約データ１３４に対して，補完桁制約設定部１２６による，配列長が増加された変数についてその増加数分の配列の要素に所定の値を制約する設定の処理が行われると，変数制約データ１３４は，図２２に示す通りとなる。
【０１７７】
図２３は，本実施の形態の補完桁制約設定部による補完桁制約設定処理フローチャートである。
【０１７８】
図２３に示すフローチャートは，図９に示すフローチャートのステップＳ１５に示す補完桁制約設定処理の一例である。
【０１７９】
補完桁制約設定部１２６は，変数宣言データ１３２のレコードを１つ選択する（ステップＳ１１０）。補完桁制約設定部１２６は，選択されたレコードの桁数と配列長とが一致しているかを判定する（ステップＳ１１１）。選択されたレコードの桁数と配列長とが一致していれば（ステップＳ１１１のＹＥＳ），ステップＳ１２１の処理に進む。変数宣言データ１３２において，桁数と配列長とが一致しているレコードの変数は，配列長が変更されていない。
【０１８０】
選択されたレコードの桁数と配列長とが一致しなければ（ステップＳ１１１のＮＯ），補完桁制約設定部１２６は，変数制約データ１３４にレコードを追加する（ステップＳ１１２）。補完桁制約設定部１２６は，追加されたレコードのオペランド＃１に，選択されたレコードの変数名を設定する（ステップＳ１１３）。補完桁制約設定部１２６は，選択レコードの型が数値型であるかを判定する（ステップＳ１１４）。
【０１８１】
選択されたレコードの型が数値型であれば（ステップＳ１１４のＹＥＳ），補完桁制約設定部１２６は，追加されたレコードの開始桁＃１に“１”を設定し（ステップＳ１１５），終了桁＃１に（配列長−桁数）を設定する（ステップＳ１１６）。補完桁制約設定部１２６は，追加されたレコードのオペランド＃２に“０”を設定し（ステップＳ１１７），ステップＳ１２１の処理に進む。
【０１８２】
選択されたレコードの型が数値型でなければ（ステップＳ１１４のＮＯ），すなわち文字列型であれば，補完桁制約設定部１２６は，追加されたレコードの開始桁＃１に桁数を設定し（ステップＳ１１８），終了桁＃１に配列長を設定する（ステップＳ１１９）。補完桁制約設定部１２６は，追加されたレコードのオペランド＃２に空白を設定し（ステップＳ１２０），ステップＳ１２１の処理に進む。
【０１８３】
補完桁制約設定部１２６は，変数宣言データ１３２のすべてのレコードについて処理が終了したかを判定する（ステップＳ１２１）。すべてのレコードについて処理が終了していなければ（ステップＳ１２１のＮＯ），補完桁制約設定部１２６は，ステップＳ１１０の処理に戻って，次のレコードの処理に移る。すべてのレコードについて処理が終了していれば（ステップＳ１２１のＹＥＳ），補完桁制約設定部１２６は，処理を終了する。
【０１８４】
次に，比較用変数制約設定部１２７は，比較用の変数Ｓ３，Ｓ４について，それぞれ元となった数値型の変数Ｎ１と，Ｎ２との関係を制約する。
【０１８５】
例えば，数値型の変数Ｎ１と比較用の変数Ｓ３とは，型が異なるが元は同じデータ項目「発注量」の変数である。これら２つの変数Ｎ１，Ｓ３については，配列長の増加により補完された以外の配列の要素で，互いに値を一致させなければならない。これらの変数Ｎ１，Ｓ３について，比較用変数制約設定部１２７は，型に応じた補完を考慮して，互いに値を一致させるべき配列の要素の関係の制約を，図２２に示す変数制約データ１３４に設定する。より具体的には，変数Ｎ１は配列の先頭から２つめまでの要素が補完されており，変数Ｓ３は配列の末尾から２つめまでの要素が補完されているので，変数Ｎ１の配列の３番目〜５番目の要素と，変数Ｓ３の配列の１番目〜３番目の要素とを対応付ける制約が設定される。
【０１８６】
なお，変数Ｎ２，Ｓ４についても，比較用変数制約設定部１２７は，図２２に示す変数制約データ１３４に，それら変数Ｎ２，Ｓ４の関係の制約を設定する。変数Ｎ２，Ｓ４については，いずれも桁の補完が行われていないので，そのまま対応付ける制約が設定される。
【０１８７】
図２４は，本実施の形態による変数制約データの例を示す図である。
【０１８８】
図２２に示す変数制約データ１３４に対して，比較用変数制約設定部１２７による数値型の変数と比較用の変数との関係の制約を設定する処理が行われると，変数制約データ１３４は，図２４に示す通りとなる。
【０１８９】
図２５は，本実施の形態の比較用変数制約設定部による比較用変数制約設定処理フローチャートである。
【０１９０】
図２５に示すフローチャートは，図９に示すフローチャートのステップＳ１６に示す比較用変数制約設定処理の一例である。
【０１９１】
比較用変数制約設定部１２７は，変数宣言データ１３２のレコードを１つ選択する（ステップＳ１３０）。比較用変数制約設定部１２７は，選択されたレコードの型が数値型であるかを判定する（ステップＳ１３１）。選択されたレコードの型が数値型でなければ（ステップＳ１３１のＮＯ），すなわち文字列型であれば，比較用変数制約設定部１２７は，ステップＳ１３９の処理に進む。
【０１９２】
選択されたレコードの型が数値型であれば（ステップＳ１３１のＹＥＳ），比較用変数制約設定部１２７は，変数制約データ１３４にレコードを追加する（ステップＳ１３２）。比較用変数制約設定部１２７は，追加されたレコードのオペランド＃１に，選択されたレコードの変数名を設定する（ステップＳ１３３）。比較用変数制約設定部１２７は，追加されたレコードの開始桁＃１に（１＋配列長−桁数）を設定し（ステップＳ１３４），終了桁＃１に配列長を設定する（ステップＳ１３５）。
【０１９３】
比較用変数制約設定部１２７は，追加されたレコードのオペランド＃２に，選択されたレコードの文字列型変数名を設定する（ステップＳ１３６）。比較用変数制約設定部１２７は，追加されたレコードの開始桁＃２に“１”を設定し（ステップＳ１３７），終了桁＃２に桁数を設定する（ステップＳ１３８）。
【０１９４】
比較用変数制約設定部１２７は，変数宣言データ１３２のすべてのレコードについて処理が終了したかを判定する（ステップＳ１３９）。すべてのレコードについて処理が終了していなければ（ステップＳ１３９のＮＯ），比較用変数制約設定部１２７は，ステップＳ１３０の処理に戻って，次のレコードの処理に移る。すべてのレコードについて処理が終了していれば（ステップＳ１３９のＹＥＳ），比較用変数制約設定部１２７は，処理を終了する。
【０１９５】
次に変換部１２８は，図１９（Ａ）に示す変数宣言データ１３２と，図２４に示す変数制約データ１３４とを自動変換することで，パス条件（４）についての制約記述のデータを自動生成する。制約記述は，シンプルな記述のルールに従った規則的な記述となるので，変数の宣言や変数の制約が設定された変数宣言データ１３２と変数制約データ１３４とを自動変換して得ることが，容易である。
【０１９６】
図２６は，本実施の形態による制約記述データの例を示す図である。
【０１９７】
図２６に示す制約記述データ１４５は，図１９（Ａ）に示す変数宣言データ１３２と，図２４に示す変数制約データ１３４とを自動変換することにより得られ，制約記述情報記憶部１４０に記憶される制約記述のデータの一例である。図２６において，制約記述データ１４５の横の数字は，説明の便宜上の理由で付された行番号である。
【０１９８】
変換部１２８は，図２６に示す制約記述データ１４５における＜変数の宣言＞部分（行番号０１〜１３）については，図１９（Ａ）に示す変数宣言データ１３２の各レコードにおける変数名，型，配列長の情報を変換して記述する。
【０１９９】
例えば，図１９（Ａ）に示す変数宣言データ１３２の１番目のレコードの変数名「Ｎ１」，型「数値」，配列長「５」から，図２６に示す制約記述データ１４５の行番号０２，０３の記述を自動生成することができる。なお，配列長が５の数値型の変数の配列の宣言に用いられるIntegerLen5 ，IsIntegerLen5 については，図４（Ａ）に示す３桁の場合の数値型の記述２２０と同様の記述があらかじめ用意されている。また，例えば，図１９（Ａ）に示す変数宣言データ１３２の２番目のレコードの変数名「Ｓ１」，型「文字列」，配列長「５」から，図２６に示す制約記述データ１４５の行番号０４，０５の記述を自動生成することができる。なお，配列長が５の文字列型の変数の配列の宣言に用いられるStringLen5，IsStringLen5については，図４（Ｂ）に示す３桁の場合の文字列型の記述２３０と同様の記述があらかじめ用意されている。図１９（Ａ）に示す変数宣言データ１３２における他のレコードについても，同様に記述を自動生成することができる。
【０２００】
変換部１２８は，図２６に示す制約記述データ１４５における＜固定値の制約＞部分（行番号１５〜２１）については，図１９（Ａ）に示す変数宣言データ１３２の固定値が設定されている各レコードにおける変数名，固定値の情報を変換して記述する。
【０２０１】
例えば，図１９（Ａ）に示す変数宣言データ１３２の２番目のレコードの変数名「Ｓ１」，固定値「００９￥￥」（￥は空白）から，図２６に示す制約記述データ１４５の行番号１６，１７の記述を自動生成することができる。具体的には，変数Ｓ１の配列に対して，要素Ｓ１［１］，Ｓ１［２］の値を“０”（ＡＳＣＩＩコード４８番）に，要素Ｓ１［３］の値を“９”（ＡＳＣＩＩコード５７番）に，要素Ｓ１［４］，Ｓ１［５］の値を空白（ＡＳＣＩＩコード３２番）に制約する記述が自動生成されている。図１９（Ａ）に示す変数宣言データ１３２において，固定値が設定されている他のレコードについても，同様に記述を自動生成することができる。
【０２０２】
変換部１２８は，図２６に示す制約記述データ１４５における＜満たすべき条件の制約＞部分（行番号２３〜３３）については，図２４に示す変数制約データ１３４の各レコードの情報を変換して記述する。
【０２０３】
例えば，図２４に示す変数制約データ１３４の１番目のレコードの情報から，図２６に示す制約記述データ１４５の行番号２４の記述を自動生成することができる。また，例えば，図２４に示す変数制約データ１３４の４番目のレコードの情報から，図２６に示す制約記述データ１４５の行番号２７の記述を自動生成することができる。また，例えば，図２４に示す変数制約データ１３４の７番目のレコードの情報から，図２６に示す制約記述データ１４５の行番号３０，３１の記述を自動生成することができる。
【０２０４】
このように，制約記述生成部１２０によって，桁の概念を持つプログラミング言語で記述されたプログラムに特定の処理パスを実行させるテストデータを生成する際に，制約ソルバに入力する，該処理パスのパス条件を正しく記述した制約記述のデータを自動生成することが可能となる。
【０２０５】
より具体的には，数値型の変数に対応する文字列との比較用の変数をさらに追加設定し，数値型の変数と文字列型の変数とを比較する条件の制約で，数値型の変数の代わりに比較用の変数を用いることにより，制約記述でも，数値から文字列への転記に対応することが可能となる。また，変数の型に応じた桁の補完を設定することで，型や桁数が異なる変数同士の比較条件を，制約記述に反映することが可能となる。
【０２０６】
制約記述生成部１２０によって，パス条件（４）から自動生成された図２６に示す制約記述データ１４５は，制約ソルバ実行部１５０によって，制約ソルバに入力される。制約ソルバの実行結果は，充足解情報記憶部１６０に格納される。図２６に示す制約記述データ１４５についての制約ソルバの実行結果は図示していないが，例えば図５に示す実行結果２４０のような，配列の要素ごとに値が文字コードで表されたデータが得られる。
【０２０７】
結果処理部１７０において，逆変換部１７１は，制約ソルバの実行結果を変換し，結果データを得る。
【０２０８】
図２７は，本実施の形態による結果データの例を示す図である。
【０２０９】
図２７に示す結果データ１８５は，図２６に示す制約記述データ１４５を制約ソルバに入力した際の実行結果を変換することで得られた結果データの例である。図２７に示す結果データ１８５では，図１９（Ａ）に示す変数宣言データ１３２を用いて，さらに各変数名に対応するデータ項目の情報が付されている。図２７に示す結果データ１８５において，結果値が，パス条件（４）を満たす各変数の値である。
【０２１０】
次に，補完桁削除部１７２は，制約記述を生成する過程で配列長の増加が行われた変数について，図２７に示す結果データ１８５の結果値から，増加された分の桁の文字を削除する。例えば，図１９（Ａ）に示す変数宣言データ１３２において，数値型の変数Ｎ１は，配列長が２つ増加されている。変数Ｎ１は数値型であるので，補完桁削除部１７２は，図２７に示す結果データ１８５において，変数Ｎ１の結果値“０００１０”から先頭の２文字“００”を削除する。同様に，図１９（Ａ）に示す変数宣言データ１３２において，文字列型の変数Ｓ１は，配列長が２つ増加されている。変数Ｓ１は文字列型であるので，補完桁削除部１７２は，図２７に示す結果データ１８５において，変数Ｓ１の結果値“００９￥￥”（￥は空白）から末尾の２文字“￥￥”を削除する。
【０２１１】
なお，文字列扱いされる比較用の変数Ｓ３も配列長が２つ増加されているので，図２７に示す結果データ１８５において，変数Ｓ３の結果値“０１０￥￥”（￥は空白）から末尾の２文字“￥￥”が削除される。ただし，比較用の変数Ｓ３は，制約記述生成の過程で定義された変数であるので，本来結果としては不要なデータである。後述の比較用変数削除部１７３の処理が先に行われる場合には，結果データ１８５から比較用の変数Ｓ３のレコードが削除されているので，補完桁削除部１７２による処理は行われない。
【０２１２】
図２８は，本実施の形態による結果データの例を示す図である。
【０２１３】
図２７に示す結果データ１８５に対して，補完桁削除部１７２による制約記述の生成時に増加した分の桁の文字を削除する処理が行われると，結果データ１８５は，図２８に示す通りとなる。
【０２１４】
図２９は，本実施の形態の補完桁削除部による補完桁削除処理フローチャートである。
【０２１５】
図２９に示すフローチャートは，図９に示すフローチャートのステップＳ２０に示す補完桁削除処理の一例である。
【０２１６】
補完桁削除部１７２は，結果データ１８５のレコードを１つ選択する（ステップＳ１４０）。補完桁削除部１７２は，選択されたレコードの変数の情報を，変数宣言データ１３２から取得する（ステップＳ１４１）。
【０２１７】
補完桁削除部１７２は，選択されたレコードの変数の型が数値型であるかを判定する（ステップＳ１４２）。選択されたレコードの変数の型が数値型であれば（ステップＳ１４２のＹＥＳ），補完桁削除部１７２は，選択されたレコードの結果値の先頭から（配列長−桁数）個の文字（“０”）を削除する（ステップＳ１４３）。選択されたレコードの変数の型が数値型でなければ（ステップＳ１４２のＮＯ），すなわち文字列型であれば，補完桁削除部１７２は，選択されたレコードの結果値の末尾から（配列長−桁数）個の文字（空白）を削除する（ステップＳ１４４）。
【０２１８】
補完桁削除部１７２は，結果データ１８５のすべてのレコードについて処理が終了したかを判定する（ステップＳ１４５）。すべてのレコードについて処理が終了していなければ（ステップＳ１４５のＮＯ），補完桁削除部１７２は，ステップＳ１４０の処理に戻って，次のレコードの処理に移る。すべてのレコードについて処理が終了していれば（ステップＳ１４５のＹＥＳ），補完桁削除部１７２は，処理を終了する。
【０２１９】
次に，比較用変数削除部１７３は，図２８に示す結果データ１８５から，制約記述の生成過程で定義された比較用の変数のレコードを削除する。例えば，図１９（Ａ）に示す変数宣言データ１３２から，変数Ｓ３，Ｓ４が比較用の変数であることがわかる。比較用変数削除部１７３は，図２８に示す結果データ１８５から，比較用の変数Ｓ３，Ｓ４のレコードを削除する。
【０２２０】
図３０は，本実施の形態による結果データの例を示す図である。
【０２２１】
図２８に示す結果データ１８５に対して，比較用変数削除部１７３による比較用の変数のレコードを削除する処理が行われると，結果データ１８５は，図３０に示す通りとなる。
【０２２２】
図３１は，本実施の形態の比較用変数削除部による比較用変数削除処理フローチャートである。
【０２２３】
図３１に示すフローチャートは，図９に示すフローチャートのステップＳ２１に示す比較用変数削除処理の一例である。
【０２２４】
比較用変数削除部１７３は，変数宣言データ１３２のレコードを１つ選択する（ステップＳ１５０）。比較用変数削除部１７３は，選択されたレコードの型が数値型であるかを判定する（ステップＳ１５１）。選択されたレコードの型が数値型であれば（ステップＳ１５１のＹＥＳ），結果データ１８５から，選択されたレコードの文字列型変数名が変数名であるレコードを削除する（ステップＳ１５２）。
【０２２５】
比較用変数削除部１７３は，変数宣言データ１３２のすべてのレコードについて処理が終了したかを判定する（ステップＳ１５３）。すべてのレコードについて処理が終了していなければ（ステップＳ１５３のＮＯ），比較用変数削除部１７３は，ステップＳ１５０の処理に戻って，次のレコードの処理に移る。すべてのレコードについて処理が終了していれば（ステップＳ１５３のＹＥＳ），比較用変数削除部１７３は，処理を終了する。
【０２２６】
このように，結果処理部１７０によって，制約ソルバの実行結果から得られる結果データ１８５から，制約記述の生成過程で設定された，実際のテストに不要なデータを自動で削除することが可能となる。
【０２２７】
最終的に得られた図３０に示す結果データ１８５が，テスト対象プログラム２００に処理パス（４）を実行させることができる各データ項目の値となる。実際には，データ項目「規定値」，「発注量下限」，「発注量上限」の結果値は，テスト対象プログラム２００内で設定された固定値であるので，テストで入力するのは，データ項目「発注量」の結果値“０１０”である。
【０２２８】
得られたテストデータ“０１０”を「発注量」に入力してテスト対象プログラム２００を実行すると，分岐［１］の判定結果がfalse ，分岐［２］の判定結果がfalse ，分岐［３］の判定結果がfalse となり，テスト対象プログラム２００に処理パス（４）を実行させることができる。
【０２２９】
以上説明したように，本実施の形態によるテストデータ生成装置１００によって，桁の概念を持つプログラミング言語で記述されたプログラムに特定の処理パスを実行させる正しいテストデータを，容易に生成することが可能となる。
【０２３０】
以上，本実施の形態について説明したが，本発明はその主旨の範囲において種々の変形が可能であることは当然である。
【符号の説明】
【０２３１】
１００  テストデータ生成装置
１１０  パス条件情報記憶部
１２０  制約記述生成部
１２１  変数宣言情報生成部
１２２  変数制約情報生成部
１２３  比較用変数追加部
１２４  比較対象変更部
１２５  桁補完部
１２６  補完桁制約設定部
１２７  比較用変数制約設定部
１２８  変換部
１３０  制約設定情報記憶部
１４０  制約記述情報記憶部
１５０  制約ソルバ実行部
１６０  充足解情報記憶部
１７０  結果処理部
１７１  逆変換部
１７２  補完桁削除部
１７３  比較用変数削除部
１８０  テスト情報記憶部
【図１】
0005884652.tif 000002
【図２】
0005884652.tif 000003
【図３】
0005884652.tif 000004
【図４】
0005884652.tif 000005
【図５】
0005884652.tif 000006
【図６】
0005884652.tif 000007
【図７】
0005884652.tif 000008
【図８】
0005884652.tif 000009
【図９】
0005884652.tif 000010
【図１０】
0005884652.tif 000011
【図１１】
0005884652.tif 000012
【図１２】
0005884652.tif 000013
【図１３】
0005884652.tif 000014
【図１４】
0005884652.tif 000015
【図１５】
0005884652.tif 000016
【図１６】
0005884652.tif 000017
【図１７】
0005884652.tif 000018
【図１８】
0005884652.tif 000019
【図１９】
0005884652.tif 000020
【図２０】
0005884652.tif 000021
【図２１】
0005884652.tif 000022
【図２２】
0005884652.tif 000023
【図２３】
0005884652.tif 000024
【図２４】
0005884652.tif 000025
【図２５】
0005884652.tif 000026
【図２６】
0005884652.tif 000027
【図２７】
0005884652.tif 000028
【図２８】
0005884652.tif 000029
【図２９】
0005884652.tif 000030
【図３０】
0005884652.tif 000031
【図３１】
0005884652.tif 000032