(57)【要約】【課題】プログラムの適切なテスト実行順序を自動決定する。【解決手段】関数リスト生成部２２は、試験対象のプログラムコード１の入力、出力、関数参照の各ブロックを検索して各ブロックに付随する内部データに基づいて関数リスト３０を生成する。テスト順序生成部２３は、関数リスト３０の参照関数３６の数や入力数３２が少ない順に、各関数のテスト実行順序を決定する。【選択図】図４
2015001825.tif 000002
【特許請求の範囲】
【請求項１】
複数の関数から成るプログラムであって任意の関数が任意の他の関数を参照する場合があるプログラムのテストスケジュールを決定する装置であって、
前記各関数毎に、その入力に関する情報と参照する他の関数を判別して関数リストを生成する関数リスト生成手段と、
前記関数リストに基づいて、前記複数の関数のテスト実行順序を決定するテスト実行順序決定手段と、
を有することを特徴とするテストスケジュール決定装置。
【請求項２】
前記テスト実行順序決定手段は、前記各関数を、前記参照する他の関数の数が少ないものから順番にテスト実行対象とすることで、前記複数の関数のテスト実行順序を決定することを特徴とする請求項１記載のテストスケジュール決定装置。
【請求項３】
前記テスト実行順序決定手段は、前記参照する他の関数の数が同じである複数の関数がある場合には、該関数同士のテスト実行順序は前記入力の数が少ない関数を優先させることを特徴とする請求項２記載のテストスケジュール決定装置。
【請求項４】
前記各関数毎に、その入力と該入力の接続先を判別してデータ参照リストを生成するデータ参照リスト生成手段と、
該データ参照リストに基づいて、前記各関数の各入力のなかでデータ生成対象の入力を判別するデータ生成対象判別手段と、
該データ生成対象の入力が複数ある場合、該各入力のデータ生成実行順序を、前記決定されたテスト実行順序に基づいて決定する入力生成順序決定手段と、
を更に有することを特徴とする請求項１〜３の何れかに記載のテストスケジュール決定装置。
【請求項５】
入力生成順序決定手段は、前記データ参照リストにおいて前記接続先が無い前記入力を、前記データ生成対象に決定することを特徴とする請求項４記載のテストスケジュール決定装置。
【請求項６】
前記プログラムは、複数の図形と任意の２つの図形間を接続する接続線とから成る関数を複数有する図形式プログラムであって、前記図形には任意の他の関数を参照する図形もある図形式プログラムであり、
前記関数リスト生成手段は、前記各図形に付随する内部データに基づいて、前記入力に関する情報と参照する他の関数を判別することを特徴とする請求項１記載のテストスケジュール決定装置。
【請求項７】
前記内部データには、その図形の種別を示す種別情報が含まれており、
前記種別には、入力、出力、他の関数参照があることを特徴とする請求項６記載のテストスケジュール決定装置。
【請求項８】
前記プログラムは、複数の図形と任意の２つの図形間を接続する接続線とから成る関数を複数有する図形式プログラムであって、前記図形には任意の他の関数を参照する図形もある図形式プログラムであり、
前記データ参照リスト生成手段は、前記関数リストと前記図形式プログラムに基づいて、前記他の関数を参照する図形と該図形に接続する前記接続線とに基づいて、該他の関数の入力に係わる入力元を判別することで、前記データ参照リストを生成することを特徴とする請求項４記載のテストスケジュール決定装置。
【請求項９】
前記プログラムは、Ｃ言語プログラム、あるいはＣ言語以外のテキストベースのプログラムであることを特徴とする請求項１記載のテストスケジュール決定装置。
【請求項１０】
複数の関数から成るプログラムであって任意の関数が任意の他の関数を参照する場合があるプログラムのテストスケジュールを決定する装置のコンピュータを、
前記各関数毎に、その入力に関する情報と参照する他の関数を判別して関数リストを生成する関数リスト生成手段と、
前記関数リストに基づいて、前記複数の関数のテスト実行順序を決定するテスト実行順序決定手段、
として機能させる為のプログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラムの自動試験システムに係わり、特にテストスケジュールを自動的に決定する装置等関する。
【背景技術】
【０００２】
一般的に、電子回路の動作試験を行うためには、想定される入力信号を入力し、この入力に対する処理結果を出力信号として取得し、この出力信号が上記入力信号に対して正しく反応しているものであるか否かを確認する。そのため、回路の不具合が効率よく確認できるような入力信号を生成することが重要となり、それに対する検討などが行われてきた(特許文献１、２など)。
【０００３】
一方、製品の電子回路は、近年、マイコンやＦＰＧＡなどの集積回路に置き変わっており、それらはプログラムなどによって内部の処理が定義付けられている。そのため、内部の処理を試験する必要があるが、これはまず一般的なソフトウェアの試験方法によって行われ、その後に実際にマイコンを実装した試験基板にダウンロードして試験を行なっている（特許文献３等）。
【０００４】
また、Ｃ言語コードの場合、プログラム内の視認性が悪く、試験項目の漏れや抜けが発生することがあり、十分な試験を行えない可能性があった。
そのため、プログラムの視認性がよく、品質や生産性、利便性を向上させるために、ブロック図などの図形を用いたプログラムコード（図形式プログラムコード）を生成し、これをコンピュータが実行可能な形式のプログラム、もしくは、Ｃ言語などの従来のプログラムコードへ変換するような開発環境やソフトウェアが開発され、利用され始めている(例えば、MathWorksのMATLAB CoderやMITメディアラボのScratchなど；あるいは特許文献４など)
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０００−３３８２００号公報
【特許文献２】特開平１１−１５１２１８号公報
【特許文献３】特開平０９−９１０３１号公報
【特許文献４】特開平７−２００２７８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
プログラムに関して、一般的な試験方法(ブラックボックステストやホワイトボックステストなど)を使用するが、プログラム規模が大きくなるにつれて、試験項目が増えるためにテストパターンが複雑化しており、テストパターンの生成に要する時間が多くなっていた。
【０００７】
ここで、テスト対象のプログラムが複数の関数から成る場合、各関数を順次テストしていくことになるが、適切な順番でテストする必要がある。例えば、任意の関数が他の関数を参照する構成の場合、まず参照先の関数をテスト実行し、その結果を用いて参照元の関数のテスト実行する等という、適切な順番でテストする必要がある。そして、この様な適切なテスト実行順序を自動的に決定する技術が要望されている。
【０００８】
しかしながら、この様な要望に十分に応えるような従来技術は無かった。
本発明の課題は、テスト対象のプログラムが複数の関数から成る場合、適切なテスト実行順序を自動的に決定できるテストスケジュール決定装置等を提供することである。
【課題を解決するための手段】
【０００９】
本発明のテストスケジュール決定装置は、複数の関数から成るプログラムであって任意の関数が任意の他の関数を参照する場合があるプログラムのテストスケジュールを決定する装置であって、前記各関数毎に、その入力に関する情報と参照する他の関数を判別して関数リストを生成する関数リスト生成手段と、前記関数リストに基づいて、前記複数の関数のテスト実行順序を決定するテスト実行順序決定手段とを有する。
【発明の効果】
【００１０】
本発明のテストスケジュール決定装置によれば、テスト対象のプログラムが複数の関数から成る場合、適切なテスト実行順序を自動的に決定できる。更に、各関数の各入力のなかで、入力データ生成対象の入力を判別すると共に、入力データ生成順序を自動決定できる。これにより、適切なスケジュールで入力データ生成とテスト実行を行えるようになる。
【図面の簡単な説明】
【００１１】
【図１】本例の自動試験システムの概略構成図である。
【図２】自動試験システムの概略処理フローを示す図である。
【図３】図形式プログラムコードの関数参照例を示す図である。
【図４】テストスケジュール生成部の機能構成図である。
【図５】テストスケジュール生成部１３の概略処理フローを示す。
【図６】図形式プログラムの具体例（１／４）である。
【図７】図形式プログラムの具体例（２／４）である。
【図８】図形式プログラムの具体例（３／４）である。
【図９】図形式プログラムの具体例（４／４）である。
【図１０】（ａ）は関数リスト、（ｂ）はデータ参照リストの具体例である。
【図１１】（ａ）〜（ｃ）は、テスト実行順序、入力の生成順序の決定例である。
【図１２】（ａ），（ｂ）は、決定された処理スケジュールの具体例である。
【図１３】Ｃ言語プログラムの具体例（１／２）である。
【図１４】Ｃ言語プログラムの具体例（２／２）である。
【図１５】（ａ）は関数宣言の形式、（ｂ）は正規表現の一例である。
【発明を実施するための形態】
【００１２】
以下、図面を参照して、本発明の実施の形態について説明する。
図１は、本例の自動試験システムの概略構成図である。
図示の自動試験システム１０は、入力部１１、テストパターン生成部１２、テストスケジュール生成部１３、テスト実行部１４、出力部１５等を有する。ここで、これらの構成のうち、入力部１１、テストパターン生成部１２、テスト実行部１４、出力部１５は、既存の構成と見做してよく、これらについては簡単に説明するのみとする。本例の自動試験システム１０の特徴は、主にテストスケジュール生成部１３であり、これについて後に詳細に説明するものとし、ここでは簡単に説明するのみとする。
【００１３】
テスト対象となる任意のプログラムコード１が、入力部１１を介して自動試験システム１０に入力されると、テストスケジュール生成部１３は、このプログラムコード１等に基づいてテストスケジュールを生成する。尚、プログラムコード１は、例えば一例としては上記特許文献３に記載の制御ソフトウェアであるが、この例に限るものではない。
【００１４】
テスト実行部１４は、上記生成されたテストスケジュールに従ってテスト実行する。その際、テストパターン生成部１２で生成されたテストパターンを用いて、テスト実行する。テスト結果２は、出力部１５を介して外部へ出力される。
【００１５】
尚、プログラムコード１は、例えば上述した図形式プログラムコードであるが、この例に限らない。
図２は、上記自動試験システム１０の概略処理フローを示す図である。
【００１６】
図示の例では、まず、入力部１１を介して任意のプログラムコード１が入力され（ステップＳ１１）、テストスケジュール生成部１３によって、プログラムコード１の階層構造の解析等が実行されることで、テストスケジュールが生成される（ステップＳ１２）。
【００１７】
その後、テストパターン生成部１２でテストパターンの生成が行われると共に（ステップＳ１３）、テスト実行部１４が、上記生成されたテストスケジュールに従って上記生成されたテストパターンを用いてテスト実行する（ステップＳ１４）。このテストパターン生成とテスト実行はそれぞれ別のタスクで処理される（更に並列に処理されてもよい）。
【００１８】
そして、テストのスケジュール全てが完了すると、テストの結果を出力部１５からまとめて出力する（表示等する）（ステップＳ１５）。
図３に、図形式プログラムコードの関数参照例を示す。
【００１９】
一般的に、図形式プログラムコードには、他の関数参照を行うブロック(以下、関数参照ブロック)が存在しており、それによって別の関数ファイルに書かれているプログラムコードを呼び出して使用する事ができる。また、図形式プログラムの特性として、一つのファイルに一つのプログラム関数が書かれている。
【００２０】
ここで、一般的な図形式プログラムについて説明しておく。
例えば図３に示す例のように、図形式プログラムは、基本的に、複数のブロック（図示の矩形や黒丸等；“図形”と呼ぶ場合もあるものとする）と、任意のブロック間を結ぶ接続線（図示の矢印）から構成される。尚、黒丸は分岐を意味するものとする。
【００２１】
各ブロックや各接続線には、それぞれ、設定値や機能コード等の所定のデータが付随されている（付随情報と呼ぶものとする；ここでは不図示であるが、後に具体例を図示する）。この付随情報を参照することで、例えば入力に係わるブロック、出力に係わるブロック、上記関数参照ブロック等を判別できる。
【００２２】
また、上記各接続線に係わる付随情報には、その接続線の接続元のブロックと接続先のブロックとを示す情報が含まれるものであってよい。
尚、本説明では、図３等に示す各ブロックは、基本的に、その名前（矩形の枠内に表記)で呼ぶものとする。また、分かり易くする為に、名前だけでなく種別（特に入力ｏｒ出力ｏｒ関数）も用いた呼ぶ場合もあるものとする。
【００２３】
図示の例では、関数Ａ内の「ブロックＢ」の図形が上記関数参照ブロックであり、関数Ｂを呼び出すものである。従って、この例では、テスト実効順序は、関数Ｂ→関数Ａとなる。つまり、まず関数Ｂを動作実行させて、その結果を用いて関数Ａを動作実行させる必要がある。
【００２４】
以下、図４以降の各図を参照して、テストスケジュール生成部１３について詳細に説明する。
図４は、テストスケジュール生成部１３の機能構成図である。
【００２５】
図示の例のテストスケジュール生成部１３は、入力部２１、関数リスト生成部２２、テスト順序生成部２３、出力部２４等を有する。
また、図５に、テストスケジュール生成部１３の概略処理フローを示す。
【００２６】
以下、図４、図５を参照して、テストスケジュール生成部１３の概略動作について説明する。
まず、上記テスト対象のプログラムコード１が、入力部２１を介してテストスケジュール生成部１３に入力される（ステップＳ２１）。尚、入力部２１は、上記入力部１１に相当すると見做しても構わない。
【００２７】
関数リスト生成部２２は、入力されたプログラムコード１等に基づいて、後述する関数リスト３０を生成し（ステップＳ２２）、更に後述するデータ参照リスト４０を生成する（ステップＳ２３）。
【００２８】
テスト順序生成部２３は、上記生成された関数リスト３０、データ参照リスト４０やプログラムコード１等に基づいて、後述するテスト実行順序を決定すると共に（ステップＳ２４）、後述する入力生成順序を決定する（ステップＳ２５）。更に、これら決定結果に基づいて後述する処理スケジュール（テストスケジュール３）を生成する（ステップＳ２６）。
【００２９】
生成されたテストスケジュール３は、出力部２４を介して外部へ出力される。
関数リスト生成部２２は、例えば、プログラムコード１内の入力、出力、関数参照の各ブロックを検索することで、関数リスト３０を生成する。また、生成した関数リスト３０、図形式プログラムコード１等に基づいて、各関数毎にその引数の入力元を探索すること等によって、データ参照リスト４０を生成する。
【００３０】
以下、具体例を用いて、上記テストスケジュール生成部１３の各処理機能について更に詳細に説明する。
図６〜図９に、図形式プログラムの具体例を示す。
【００３１】
本例の図形式プログラムは、図６に示す関数FuncA、図７に示す関数FuncB、図８に示す関数FuncC、図９に示す関数FuncDの４つの関数から成る。尚、簡単のため、関数FuncAを関数Ａと記す場合もあるものとする。同様に、関数FuncB、関数FuncC、関数FuncDを、関数Ｂ、関数Ｃ、関数Ｄと記す場合もあるものとする。
【００３２】
尚、上述したように、図形式プログラムでは、各図形及び接続線が内部データ（付随情報）を持っている。例えば、各図形は種別番号や設定情報等を有し、各接続線はそれぞれの図形の接続関係の情報を持つ。尚、ここでは一例として、入力を定義する図形（以下、入力図形と記す）の種別番号を‘４’、出力を定義する図形（以下、出力図形と記す）の種別番号を‘５’、他の関数を参照する図形（以下、関数参照図形と記す）の種別番号を‘７’としている。尚、任意の関数内の上記関数参照図形による参照先の他の関数を“参照関数”と呼ぶ場合があるものとする。
【００３３】
尚、図６では、一部の図形と一部の接続線のみ内部データを示すが、図示の（１）、（２）は他の各図形の内部データ、（３）、（４）、（５）は他の各接続線の内部データを意味し、これらの具体例を以下に列挙する。
【００３４】
（１）内部データ
ＩＤ    ：２０
名前    ：InFuncOn
種別番号：４
（２）内部データ
ＩＤ    ：１０
参照先  ：FuncB
種別番号：７
接続先ポイント１：InSignal
接続先ポイント２：ResData
（３）内部データ
接続元ＩＤ：２０
接続元箇所：ポイント１
接続先ＩＤ：８０
接続先箇所：ポイント１
（４）内部データ
接続元ＩＤ：１０
接続元箇所：ポイント２
接続先ＩＤ：８０
接続先箇所：ポイント２
（５）内部データ
接続元ＩＤ：８０
接続元箇所：ポイント３
接続先ＩＤ：３０
接続先箇所：ポイント１
尚、図示している内部データについても、図示のように（６）、（７）、（８）、（９）の符号を付すと共に、以下に列挙しておくものとする。
【００３５】
（６）内部データ
ＩＤ      ：５０
名前      ：InData
種別番号  ：４
（７）内部データ
ＩＤ      ：３０
名前      ：OutData
種別番号  ：５
（８）内部データ
ＩＤ      ：８０
参照先    ：FuncC
種別番号  ：７
接続ポイント１：InSwitch
接続ポイント２：InAddData
接続ポイント３：CalcOut
（９）内部データ
接続元ＩＤ：５０
接続元箇所：ポイント１
接続先ＩＤ：１０
接続先箇所：ポイント１
尚、図７に示す関数Ｂ、図８に示す関数Ｃ、図９に示す関数Ｄに関しては、その一部のブロックに関して以下簡単に説明するのみとする。
【００３６】
まず、図７の関数Ｂに関しては、図示の「InSignal」ブロックは種別番号＝４であり、図示の「ResData」ブロックは種別番号＝５である。尚、ＩＤ等に関しては特に示さない。
【００３７】
また、図８に関しては、図示の「InSwitch」ブロックと「InAddData」ブロックが種別番号＝４である。また、図示の「CalcOut」ブロックは種別番号＝５である。また、図示の「FuncD」ブロックは、種別番号＝７であり、参照先＝FuncDである。
【００３８】
また、図９の関数Ｄに関しては、図示の「OutTime」ブロックは種別番号＝５である。
図６〜図９に示す図形式プログラムの例では、FuncAのテストを行うためにはその上記“参照関数”であるFuncC及びFuncBのテスト結果が必要である。また、FuncCのテストを行うためにはFuncDのテスト結果が必要である。
【００３９】
また、図６に示すように、FuncCの一方の入力はFuncBの出力となっているので、FuncBの出力データをFuncCの入力データとして再利用することが可能であるため、FuncBをFuncCより先にテストすることで、FuncCのテストパターン生成の処理を省くことが可能である。さらに、FuncDはデータの入力が無いのでテストパターンの生成が不要である。そのため、すぐにテスト実行が可能であるFuncDのテストを行い、その間にFuncCのテストパターン生成を行うことで効率的なテストのスケジューリングを行うことが出来る。本例の自動試験システム１０（そのテストスケジュール生成部１３）では、この様な効率的なテストスケジュールを自動的に作成することができる。
【００４０】
以下、まず、上記ステップＳ２２の関数リスト生成処理について、図６〜図９に示す具体例を用いて説明する。
まず、図１０（ａ）に、関数リスト３０の具体例を示す。
【００４１】
図示の例の関数リスト３０は、関数名３１、入力数３２、入力情報３３、出力数３４、出力情報３５、参照関数３６の各データ項目から成る。
図形式プログラムの場合は、図形の内部データを収集する事によって関数リスト３０を生成する。
【００４２】
関数リスト３０の各レコードは、図形式プログラムの各ファイル（各関数ファイル）に応じたものである。よって、上記の例では図６〜図９に示す４つの関数ファイルから成るので、レコード数は４つとなる。
【００４３】
図形式プログラムの各ファイル（各関数ファイル）毎に、そのファイル名／関数名が関数名３１に格納され、その入力名（変数名）が入力情報３３に格納され、その出力名（変数名）が出力情報３５に格納される。更に、その関数が他の関数を参照している場合には、当該参照先の関数名等が、参照関数３６に格納される。
【００４４】
例えば、図６に示す関数ファイル（関数名／ファイル名＝FuncA）に応じて、関数リスト３０の１つ目のレコードが生成される。
この１つ目のレコードの生成処理について、以下、説明する。
【００４５】
まず、上記関数名／ファイル名であるFuncAが、関数名３１に格納される。続いて、関数FuncAの全図形の内部データを参照して、その種別番号が‘４’である図形の“名前”を、入力情報３３に格納する。図６の例では図示の（１）と（６）のブロックが種別番号＝‘４’であるので、入力情報３３には“InData”と“InFuncOn”が格納される。また、これら入力の数が入力数３２に格納されるので、この例では入力数３２＝‘２’となる。尚、上記の通り、種別番号＝‘４’は、入力図形を意味する。
【００４６】
続いて、関数FuncAの全図形の内部データを参照して、その種別番号が‘５’である図形の“名前”を、出力情報３５に格納する。図６の例では図示の（７）のブロックが種別番号＝‘５’であるので、その“名前”である“OutData”が出力情報３５に格納される。また、出力の数‘１’が出力数３４に格納される。
【００４７】
続いて、関数FuncAの全図形の内部データを参照して、その種別番号が‘７’である図形の“参照先”を、参照関数３６に格納する。図６の例では図示の（２）と（７）のブロックが種別番号＝‘７’であるので、参照関数３６には“FuncB”と“FuncC”が格納される。
【００４８】
図７、図８、図９に関しては、内部データの詳細例は示さないが、図示の各ブロック内に示す文字は、入力図形または出力図形の場合には上記“名前”であり、関数参照図形の場合は“参照先の関数名”等である。そして、図７、図８、図９に関しては、入力図形、出力図形、関数参照図形に関しては、上記の通り、その内部データついて部分的・簡単に説明してある。これより、図７、図８、図９に示す例に応じて、図１０（ａ）に示す関数リスト３０の２番目、３番目、４番目のレコードがそれぞれ生成される。
【００４９】
すなわち、まず、図７に示す関数Ｂについては、上記の通り、図示の「InSignal」ブロックは種別番号＝４であるので、その“名前”である“InSignal”が入力情報３３に格納される。同様にして、図示の「ResData」ブロックは種別番号＝５であるので、その“名前”である“ResData”が出力情報３５に格納される。また、内部データ例は示さないが、図７に示す関数Ｂには種別番号＝７のブロックは無い。よって、参照関数３６の欄には何もデータは格納されない。
【００５０】
また、図８に示す関数Ｃについては、上記の通り、図示の「InSwitch」ブロックと「InAddData」ブロックが種別番号＝４であるので、その“名前”である“InSwitch”と“InAddData”が、入力情報３３に格納される。同様にして、図示の「CalcOut」ブロックは種別番号＝５であるので、その“名前”である“CalcOut”が出力情報３５に格納される。また、上記の通り、図示の「FuncD」ブロックが種別番号＝７であるので、その“参照先”である“FuncD”が、参照関数３６に格納される。
【００５１】
また、図９に示す関数Ｄについては、上記の通り、図示の「OutTime」ブロックが種別番号＝５であるので、その“名前”である“OutTime”が出力情報３５に格納される。
尚、図７、図８、図９については、入力数３２と出力数３４についての説明ば省略するものとする。
【００５２】
以上、関数リスト３０の生成処理について具体例を用いて説明したが、当該関数リスト３０生成処理は、概略的には例えば以下のようになる。尚、処理フローチャート図などは、特に図示しないものとする。
【００５３】
図形式プログラムの各関数ファイル毎に、下記の処理を実行する。
・関数名／ファイル名を、関数名３１に格納する。
・種別番号＝４である図形の“名前”を入力情報３３に格納し、当該入力の数を入力数３２に格納する。
【００５４】
・種別番号＝５である図形の“名前”を出力情報３５に格納し、当該出力の数を出力数３４に格納する。
・種別番号＝７である図形の“参照先”を、参照関数３６に格納する。
【００５５】
例えば上記処理によって、試験対象のプログラムコード１に基づく関数リスト３０の生成が行われることになる。
次に、データ参照リスト４０の生成処理について説明する。
【００５６】
上記生成した関数リスト３０、図形式プログラムコード１等を用いて、例えば図１０（ｂ）に示すデータ参照リスト４０を生成する。これは、概略的には、例えば、関数を参照している箇所から、入力にどのようなデータが入っているかを、図形の接続関係から割り出すことで生成する。
【００５７】
データ参照リスト４０は、概略的には、入力情報４１と接続先情報４４とから成る。入力情報４１に対応する接続先がある場合には、当該接続先の関数名や変数名等が、接続先情報４４に格納される。入力情報４１は、関数名４２、入力名４３等から成る。接続先情報４４は、関数名４５、接続先４６、接続箇所４７、種別４８等から成る。
【００５８】
ここで、一例としては、図７に示す関数Ｂの入力“InSignal”に対応する接続先は、図６に示す関数Ａの入力“InData”である。つまり、関数Ａの入力“InData”が、そのまま、関数Ｂの入力“InSignal”として関数Ｂに入力されるものである。よって、この例では、入力情報４１の関数名４２、入力名４３には“FuncB”、“InSignal”が格納され、接続先情報４４の関数名４５、接続先４６には“FuncA”、“InData”が格納される。
【００５９】
尚、その意味では、上記“接続先”は入力元を意味していることから“接続元”や“入力元”等に言い換えてもよい。
データ参照リスト４０の生成処理では、例えば、関数リスト３０の各レコード毎に、その関数が、他の関数からの参照先（参照関数３６）となっているか否かを確認する。
【００６０】
例えば、関数リスト３０の１番目のレコードの場合、その関数名３１は“FuncA”であるので、他の各レコードの参照関数３６の中に“FuncA”が存在するか否かをチェックする。
【００６１】
但し、その前に、入力情報３３をチェックして、入力情報３３に何もデータが無い場合には、そのレコードに関する処理は終了する。図１０（ａ）の例ではFuncDが該当し、これより図１０（ｂ）に示すようにFuncDに関しては全てが“なし”となっている。
【００６２】
上記１番目のレコードの説明に戻る。この例では、他の各レコードの参照関数３６の中に“FuncA”は存在しないので、データ参照リスト４０には入力情報４１のみを登録する。つまり、関数名３１＝“FuncA”と入力情報３３＝“InFuncOn”を、入力情報４１における関数名４２、入力名４３に登録する。同様に、関数名３１＝“FuncA”と入力情報３３＝“InData”を、入力情報４１における関数名４２、入力名４３に登録する。一方、何れの場合も、接続先情報４４には何もデータは格納されないことになる。
【００６３】
そして、次のレコード（２番目のレコード）を処理対象とする。
関数リスト３０の２番目のレコードの場合、他の各レコードの参照関数３６に“FuncB”が存在するか否かをチェックすることになり、この場合、１番目のレコードの参照関数３６に“FuncB”が存在している。
【００６４】
これより、処理対象レコードの入力情報３３＝“InSignal”を用いて、該当レコードの関数名３１＝“FuncA”の図形式プログラム（図６）を検索して、対応する入力名を求める。すなわち、図６における各図形の内部データを参照して、その“参照先”が“FuncB”である図形を判別する。図示の例では（２）の図形が該当することになる。次に、この該当図形の内部データを参照して、上記“InSignal”に対応する接続先ポイントを判別する（図示の例では接続先ポイント１である）。
【００６５】
これより、図６における各接続線の内部データを参照して、その接続先が上記該当図形（（２）の図形；つまり、接続先ＩＤが‘１０’の図形）であり、且つその接続先箇所がポイント１となっている接続線を探索する。図示の例では（９）の接続線が該当する。これより、この該当する接続線の接続元ＩＤが示す図形（例では（６）の図形）を、入力元図形と見做す。そして、この入力元図形の内部データから、名前又は参照先を取得する。この例では（６）の図形の“名前”＝“InData”となっている。更に、入力元図形の内部データの“種別番号”から種別を判別する。例では、（６）の図形の“種別番号”＝４であるので、種別は「入力」と判別される。
【００６６】
以上の処理によって得られた上記入力元の関数名“FuncA”と、その入力元図形の名前＝“InData”、種別＝“入力”等を、データ参照リスト４０の接続先情報４４の関数名４５、接続先４６、種別４８に格納する。尚、場合によっては更に接続箇所を判別して、これを接続先情報４４の接続箇所４７に格納する。
【００６７】
これより、図１０（ｂ）に示すように、入力情報４１がFuncBのInSignalに対する接続先情報４４として、関数名４５＝“FuncA”、接続先４６＝“InData”、種別４８＝“入力”が登録されることになる。
【００６８】
続いて、３番目のレコードが処理対象となる。
関数リスト３０の３番目のレコードの場合、他の各レコードの参照関数３６に“FuncC”が存在するか否かをチェックすることになり、この場合、１番目のレコードの参照関数３６に“FuncC”が存在している。
【００６９】
これより、処理対象レコードの入力情報３３＝“InSwitch”、“InAddData”をそれぞれについて、上記２番目のレコードの場合と略同様の処理を実行する。以下、まず、“InSwitch”の場合について説明する。
【００７０】
まず、該当レコードの関数名３１＝“FuncA”が示す図形式プログラム（図６）を検索して、“FuncC”の“InSwitch”に対応する入力を求める。
すなわち、図６における各図形の内部データを参照して、その“参照先”が“FuncC”である図形を判別する。図示の例では（８）の図形が該当することになる。次に、この該当図形の内部データを参照して、上記“InSwitch”に対応する接続先ポイントを判別する（図示の例では接続先ポイント１である）。
【００７１】
これより、図６における各接続線の内部データを参照して、その接続先が上記該当図形（（８）の図形；つまり、接続先ＩＤが‘８０’の図形）であり、且つその接続先箇所がポイント１となっている接続線を探索する。図示の例では（３）の接続線が該当する。これより、この該当する接続線の接続元ＩＤが示す図形（例では接続元ＩＤ＝‘２０’なので（１）の図形）を、入力元図形と見做す。そして、この入力元図形の内部データから、名前又は参照先を取得する。この例では名前＝“InFuncOn”となっている。更に、入力元図形の内部データの“種別番号”から種別を判別する。例では、種別番号＝４であるので種別は入力と判別される。
【００７２】
以上の処理によって得られた上記入力元の関数名“FuncA”と、その入力元図形の名前＝“InFuncOn”や種別＝“入力”等を、データ参照リスト４０の接続先情報４４の関数名４５、接続先４６、種別４８に格納する。尚、場合によっては更に接続箇所を判別して、これを接続先情報４４の接続箇所４７に格納する。
【００７３】
これより、図１０（ｂ）に示すように、入力情報４１がFuncCの“InSwitch”に対する接続先情報４４として、関数名４５＝“FuncA”、接続先４６＝“InFuncOn”、種別４８＝“入力”が登録されることになる。
【００７４】
次に、以下、上記“InAddData”の場合について説明する。
まず、該当レコードの関数名３１＝“FuncA”が示す図形式プログラム（図６）を検索して、その入力名を求める。
【００７５】
すなわち、図６における各図形の内部データを参照して、その参照先が“FuncC”である図形を判別する。図示の例では（８）の図形が該当することになる。次に、この該当図形（８）の内部データを参照して、上記“InAddData”に対応する接続先ポイントを判別する（図示の例では接続先ポイント２である）。
【００７６】
これより、図６における各接続線の内部データを参照して、その接続先が上記該当図形（（８）の図形；つまり、接続先ＩＤが‘８０’の図形）であり、且つその接続先箇所がポイント２となっている接続線を探索する。図示の例では（４）の接続線が該当する。これより、この該当接続線（４）の接続元ＩＤが示す図形を、入力元図形と見做す。この例では接続元ＩＤ＝‘１０’なので、（２）の図形を入力元図形と見做す。
【００７７】
そして、この入力元図形（２）の内部データから、名前又は参照先を取得する。この例では参照先＝“FuncB”となっている。参照先を取得する場合には、更に、上記該当接続線（４）の接続元箇所（＝ポイント２）を用いて、入力元図形（２）との接続箇所を判別する。図示の例では、入力元図形（２）における接続先ポインタ２＝“ResData”となっている。更に、入力元図形の内部データの“種別番号”から種別を判別する。例では、種別番号＝７であるので種別は上記“関数参照図形”と判別される。
【００７８】
以上の処理によって得られた上記入力元の関数名“FuncA”と、その入力先図形の参照先＝“FuncB”、接続箇所＝“ResData”、種別＝“関数参照”を、データ参照リスト４０の接続先情報４４の関数名４５、接続先４６、接続箇所４７、種別４８に格納する。
【００７９】
これより、図１０（ｂ）に示すように、入力情報４１がFuncCの“InAddData”に対する接続先情報４４として、関数名４５＝“FuncA”、接続先４６＝“FuncB”、接続箇所４７＝“ResData”、種別４８＝“関数参照”が登録されることになる。
【００８０】
上述したように、図形式プログラムの各関数を処理対象として、当該処理対象の関数を参照している他の関数（参照元の関数）の有無を確認する。そして、参照元関数がある場合には、参照元関数の図形式プログラムに基づいて、入力元を特定する。これは、例えば、参照元関数の図形式プログラムにおいて、処理対象関数を参照する関数参照図形を判別し、この関数参照図形の該当箇所に繋がっている接続線を判別し、判別した接続線の接続元の図形を、上記入力元図形として判別する。尚、上記該当箇所は、処理対象関数の各入力情報３３毎に対応するものである。
【００８１】
そして、上記判別した入力元図形等によって、データ参照リスト４０の接続先情報４４を生成する。
次に、上述したようにして関数リスト生成部２２が生成した関数リスト３０やデータ参照リスト４０等に基づいて、テスト順序生成部２３がテストスケジュールを作成する。テスト順序生成部２３の処理内容について、以下、説明する。
【００８２】
まず、関数リスト３０に基づいて、テストを実行する順番を決定する。これは、例えば図１１（ａ）に示すテスト実行順序決定結果５０を生成するものである。
テスト実行順番の決定方法は、例えば、参照関数の数と入力数によって決定する。ここでは、入力数よりも参照関数の数が優先されるものとする。
【００８３】
つまり、関数リスト３０の参照関数３６に基づいて、参照関数３６の数が少ないものから順番にテスト実行するものとする。但し、参照関数３６の数が同一のレコード同士に関しては、入力数３２に基づいて、入力数が少ない方を優先してテスト実行するものとする。
【００８４】
以上の処理は、図１０（ａ）に示す例の場合には、まず、関数名３１＝“FuncB”、“FuncD”の各レコードは、どちらも参照関数３６が無いので、参照関数３６の数が最も少ないのは２番目と４番目のレコードである。続いて、“FuncB”と“FuncD”のどちらを先にテスト実行するのかを、これらレコードの入力数３２によって決定する。図示の例では、“FuncB”の入力数３２は‘１’、“FuncD”の入力数３２は‘０’であるので、テスト実行順序は、１番目が“FuncD”、２番目が“FuncB”に決定される。
【００８５】
そして、次に参照関数３６の数が少ないのは３番目のレコード“FuncC”であり、テスト実行順序の３番目は“FuncC”に決定される。また、これより、テスト実行順序の最後は“FuncA”に決定される。
【００８６】
上述したようにテスト実行順序が決定されることで、参照する関数のテストが完了しているものから順番に処理されるようにする。
尚、図１１（ａ）に示すテスト実行順序決定結果５０は、Ｎｏ．５１、テスト実行関数５２、入力情報５３、参照関数５４等から成る。Ｎｏ．５１はテスト実行順序を意味し、‘１’が１番目、‘２’が２番目を意味する。テスト実行関数５２には上記決定されたテスト実行順に関数名３１が格納され、その入力情報３３、参照関数３６が、入力情報５３、参照関数５４に格納されることで、テスト実行順序決定結果５０が生成される。
【００８７】
次に、テストに使用する入力の生成順序を決定する。
これは、まず、データ参照リスト４０に基づいて、テスト用の入力を作成する必要のある入力を特定する。これは、データ参照リスト４０において、接続先４６が「なし」となっている入力名４３が、入力データ生成の対象となる。よって、図示の例では、FuncAのInFuncOn及びInDataが、入力データ生成の対象となる。それ以外は、接続先４６から得られる入力を使用する。例えば、FuncCのInSwitchは、FuncAのInFuncOnを使用する。尚、当然、入力が無いもの（入力名４３が「なし」のもの）は、対象外である。
【００８８】
そして、上記入力データ生成の対象のなかで生成処理の実行順番を決定する。上記の例では、FuncAのInFuncOnとInDataとでどちらを先に入力生成処理実行するのかを決定することになる。本例では、例えば図１１（ｂ）に示す順序／条件データ６０を作成して、以って生成処理の実行順番を決定する。
【００８９】
尚、図１１（ｂ）に示す順序／条件データ６０は、概略的には、テストに必要な入力の順番を示すＮｏ．６１に対応付けて、入力必要順序６２と入力条件６３が登録されるものである。
【００９０】
ここでは、テストの際に必要となる入力の順番通りに処理を行うものとする。
よって、まず、テスト実行順序決定結果５０に基づいて、テストの順番に応じた入力の順番を順序／条件データ６０に登録する。図１１（ａ）に示す例では、１番目のテスト実行対象であるFuncDに関しては入力情報５３がないので、続いて２番目のテスト実行対象であるFuncBを参照すると、入力情報５３があるので、これが最初の入力となる。つまり、最初に必要となる入力はFuncBのInSignalである。これより、図１１（ｂ）に示すように、順序／条件データ６０のＮＯ．６１＝‘１’のレコードの入力必要順序６２（その関数名６２ａ、入力６２ｂ）の欄に、FuncB、InSignalが登録される。尚、Ｎｏ．６１は、テストに必要な入力の順番を示す。
【００９１】
続いて、データ参照リスト４０を参照して、上記FuncBのInSignalに対応する接続先情報４４（関数名４５、接続先４６、種別４８等）を取得する。図示の例ではFuncA、InData、「入力」が取得されることになり、これらを図示のように入力条件６３（その関数名６４ａ、参照箇所６４ｂ、種別６４ｃ）に登録する。
【００９２】
同様にして、テスト実行順序決定結果５０において、３番目のテスト実行対象であるFuncCを参照すると、入力情報５３には、InSwitchとInAddDataがあるので、これより、図１１（ｂ）に示すように、順序／条件データ６０のＮＯ．６１＝‘２’のレコードの入力必要順序６２（その関数名６２ａ、入力６２ｂ、入力６２ｃ）の欄に、FuncC、InSwitch、InAddDataがそれぞれ登録される。
【００９３】
続いて、データ参照リスト４０を参照して、上記FuncCのInSwitchに対応する接続先情報４４（関数名４５、接続先４６、種別４８等）を取得する。図示の例ではFuncA、InFuncOn、「入力」が取得されて、これらを図示のように入力条件６３（その関数名６４ａ、参照箇所６４ｂ、種別６４ｃ）に登録する。
【００９４】
同様にして、データ参照リスト４０を参照して、上記FuncCのInAddDataに対応する接続先情報４４（関数名４５、接続先４６、接続箇所４７、種別４８等）を取得する。図示の例ではFuncB、ResData、「関数参照」が取得されて、これらを図示のように入力条件６３（その関数名６５ａ、参照箇所６５ｂ、種別６５ｃ）に登録する。尚、この例のように接続箇所４７にデータがある場合には、接続先４６を関数名６５ａに登録すると共に、接続箇所４７を参照箇所６５ｂに登録するものとする。但し、この例に限らない。
【００９５】
同様にして、テスト実行順序決定結果５０において、４番目のテスト実行対象であるFuncAを参照すると、入力情報５３には、InFuncOnとInDataがあるので、これより、図１１（ｂ）に示すように、順序／条件データ６０のＮＯ．６１＝‘２’のレコードの入力必要順序６２（その関数名６２ａ、入力６２ｂ、入力６２ｃ）の欄に、FuncA、InFuncOn、InDataがそれぞれ登録される。
【００９６】
続いて、データ参照リスト４０を参照して、上記FuncAのInFuncOnに対応する接続先情報４４（関数名４５、接続先４６等）を取得するが、図示の例では「なし」であることが分かり、これより図示のように入力条件６３には何も登録されない。同様に、上記FuncAのInDataに対応する接続先情報４４（関数名４５、接続先４６等）を取得するが、図示の例では「なし」であることが分かり、これより図示のように入力条件６３には何も登録されない。
【００９７】
そして、上記生成された順序／条件データ６０に基づいて、その最初のレコードから順番に、その入力条件６３が上記入力データ生成の対象であるか否かを判別する。そして、入力条件６３が上記入力データ生成の対象である場合には、当該入力条件６３を入力生成順序情報７０の入力生成順序７２に登録する。
【００９８】
図示の例では、最初のレコードの入力条件６３はFuncA、InDataである。本例では上記の通り、FuncAのInDataは、入力データ生成の対象であるので、これを図１１（ｃ）に示す入力生成順序情報７０の入力生成順序７２に登録する。
【００９９】
尚、入力生成順序情報７０は、Ｎｏ．７１と入力生成順序７２から成り、Ｎｏ．７１は生成順序を意味すると共に登録順に１，２，３、・・・等が割り当てられる。これより、図示の通り、最初に登録されるFuncAのInDataに対しては、Ｎｏ．７１は‘１’となっている。
【０１００】
同様にして、順序／条件データ６０の２番目のレコードの入力条件６３（入力６４）であるFuncA、InFuncOnも、入力データ生成の対象であるので、これを図１１（ｃ）に示す入力生成順序情報７０の入力生成順序７２に登録する。勿論、これは２番目の登録であるので、図示の通り、対応するＮｏ．７１＝‘２’となる。
【０１０１】
尚、順序／条件データ６０の２番目のレコードのもう１つの入力条件６３（入力６５）であるFuncB、ResDataは、入力データ生成の対象ではないので、入力生成順序情報７０に登録されない。また、順序／条件データ６０の３番目のレコードには入力条件６３は存在しない。
【０１０２】
上述したようにして、入力データ生成の対象と順番を示す入力生成順序情報７０が生成される。
最後に、上記生成したテスト実行順序決定結果５０と入力生成順序情報７０のデータを集約して、テストのスケジュールを生成する。これは、一例としては、シングルタスクの場合のテストスケジュール（図１２（ａ））を生成し、マルチタスクの場合のテストスケジュール（図１２（ｂ））を生成するものであるが、この例に限らない。
【０１０３】
例えばシングルタスクで処理を行う場合は、図１２（ａ）に示すように、まず入力生成順序情報７０に従って各種入力データを生成する処理を全て実行した後、テスト実行順序決定結果５０に従って各図形式プログラム（各関数）のテスト実行する（FuncD→FuncB→FuncC→FuncA）テストスケジュールとする。
【０１０４】
また、例えば、マルチタスクで処理する場合は、図１２（ｂ）に示すように、入力生成順序情報７０に従って各種入力データを順次生成する処理と、テスト実行順序決定結果５０に従って各関数のテスト実行する処理とを、並行して行うことができる。この場合、図１２（ａ）に示すテストスケジュールに比べて、更なる処理時間の短縮化を図ることができる。
【０１０５】
ここで、上述した説明では、図形式プログラムを例にしているが、本手法は、図形式プログラムに限らず、Ｃ言語等のテキストベースのプログラムにも適用可能である。すなわち、テキストベースのプログラムについて、コード解析を行い、関数同士の入出力関係を判別することで、図形式プログラムの場合と同様のスケジュール生成を実現させることが可能である。
【０１０６】
これについて、まず概略的に説明するならば、一般的に、Ｃ言語プログラムなどのテキストベースプログラムの場合、関数を定義している文字列は法則性があるため、プログラムデータからテキスト検索によって、定義されている関数の一覧を作成することができる。その際に、関数宣言部分で定義されている引数も合わせて取得する。
【０１０７】
例えば、Ｃ言語プログラムでは、一般的に、関数宣言は図１５（ａ）の様な形式を取る。すなわち、「変数型 関数名（変数型 引数， 変数型 引数,・・・）」という形式をとる。これより、例えば正規表現等を使用して、この様な形式の文字列をプログラムコードから検索することで、関数宣言部分を特定することができる。
【０１０８】
関数宣言は必ず図１５（ａ）の様な形式となっているため、例えば図１５（ｂ）に示すような正規表現を用いることで、関数宣言部分を検出できる。関数宣言部分は、「任意の文字列」「半角スペース」「任意の文字列」「カッコ」となる特徴があるため、このような正規表現になる。関数宣言部のはじめの1文字目を「[a-zA-Z_\-]」で表し、2文字目以降を「[a-zA-Z0-9_\-]*」で表している。この2つによって変数型を表す任意の文字列を表現し、半角スペース以降の「[a-zA-Z_\-][a-zA-Z0-9_\-]*」によって関数名を表す任意の文字列を表現している。勿論、図１５（ｂ）に示す正規表現は、一例であり、この例に限らず、関数宣言部分を検出できるものであればなんでもよい。
【０１０９】
そして、特定した関数宣言部分から、関数名や引数を抽出する。更に、抽出した関数名を用いて他の関数のプログラムコードを検索することで、当該他の関数において処理対象の関数が参照されている箇所を、特定することができる。これは、処理対象の関数が、他の関数で参照されているか否かを判別できることも意味することになる。例えば、この様にして、関数リスト３０を生成できる。
【０１１０】
上記関数リスト３０の生成処理について、以下、図１３、図１４の例を参照して、更に詳細に説明する。
ここで、図１３（ａ）、（ｂ）、図１４（ａ）、（ｂ）に、上記図６、図７、図８、図９に示す各関数Ａ，Ｂ，Ｃ，Ｄを、それぞれＣ言語プログラムで記述した例を示す。
【０１１１】
すなわち、図１３（ａ）は上記関数FuncA、図１３（ｂ）は上記関数FuncB、図１４（ａ）は上記関数FuncC、図１４（ｂ）は上記関数FuncDに、それぞれ相当するものである。
上記のことから、図１３（ａ）、（ｂ）、図１４（ａ）、（ｂ）に基づいて、図１０（ａ）、（ｂ）に示す例と略同様の内容の関数リスト３０、データ参照リスト４０が、生成されることになる。
【０１１２】
ここでは、まず、図１３（ａ）に示す関数FuncAを処理対象とすると、まず上記のように関数宣言部分を検出する。図示の例では１行目が関数宣言部分と判定されることになる。そして、この関数宣言部分から所定の情報を抽出する。これは、例えば、関数名と各引数とを抽出する。例えば、関数宣言部分において、その開き括弧“（”の直前の文字列、すなわち半角スペースと開き括弧“（”との間の文字列を、関数名として抽出する。よって、図示の例では“FuncA”が、関数名として抽出される。
【０１１３】
更に、開き括弧“（”以降の文字列から、換言すれば括弧内（）から、引数を抽出する。これらは、上記の通り、図１５（ａ）に示す形式に従って抽出する。つまり、例えば、開き括弧“（”以降の文字／記号等を順次参照して、半角スペースとカンマ“，”との間の文字列、もしくは半角スペースと閉じ括弧“）”との間の文字列を、引数と見做して抽出する。よって、図示の例では、“InFuncOn”と“InData”とが、引数として抽出される。尚、よく知られているように、引数は、その関数への入力を意味している。
【０１１４】
これより、抽出した関数名、各引数を、図１０（ａ）の関数リスト３０における関数名３１、入力情報３３に、それぞれ格納する。更に、引数は２つあるので入力数３２に‘２’を格納する。
【０１１５】
更に、上記抽出した関数名を用いて、他の全ての関数のプログラムコードを検索して、処理対象の関数が他の関数で参照されるか否かを確認する。これは、他の関数のプログラムコート内に、処理対象の関数名が記述されている場合には、処理対象の関数が他の関数で参照されるものと判定する。そして、関数リスト３０において、当該参照されている他の関数に対応する参照関数３６の欄に、当該処理対象の関数名を格納する。尚、Ｃ言語では、変数名と関数名の名前空間が同一であるため、変数名と関数名に同じ名前を付けられない。
【０１１６】
そして、上記関数名“FuncA”は、図１３（ｂ）、図１４（ａ）、図１４（ｂ）の各プログラムコード内には記述されていないので、図１０（ａ）に示すように、参照関数３６の欄には“FuncA”は格納されていない。
【０１１７】
尚、ここでは出力情報３５にはデータ格納しないものとしてもよい。少なくとも、図１３（ａ）に示す例では“OutData”は記述されていないので、図１０（ａ）と全く同じにはならない（出力情報３５に“OutData”が格納されるものではない）。しかし、この例に限らない。一般的に、戻り値があるものに関しては、関数内で「return 変数名;」を必ず使用することになるので、これによって出力の有無を確認することが可能である。そして、図１３（ａ）に示す“return”に関して“OutData”を用いるようなプログラムコードであれば、出力情報３５に関しても図１０（ａ）と同じ内容となるようにすることも可能である。何れにしても、出力情報３５は必須の情報ではなく、出力情報３５が無くても処理スケジュール自動決定は実現できる。
【０１１８】
図１３（ｂ）に示す関数“FuncB”のプログラムコードに関しても、上記“FuncA”の場合と同様の解析処理を行うことで、まず、１行目が関数宣言部分として特定され、この関数宣言部分から関数名＝“FuncB”、引数＝“InSignal”が抽出されて、これらが図１０（ａ）に示す関数リスト３０の関数名３１、入力情報３３に格納される。
【０１１９】
また、この関数名＝“FuncB”を用いて他の各プログラムコードを検索すると、図１３（ａ）に示す“FuncA”のプログラムコード内に“FuncB”が存在しているので、自己が他の関数“FuncA”で参照されるものと判定する。そして、これより、図１０（ａ）に示す関数リスト３０のように、関数名３１が“FuncA”であるレコードにおける参照関数３６の欄に、当該処理対象関数の関数名＝“FuncB”を格納する。
【０１２０】
同様にして、図１４（ａ）に示す関数“FuncC”を処理対象とすると、まず、１行目が関数宣言部分として特定され、この関数宣言部分から関数名＝“FuncC”、引数＝“InSwitch”、“InAddData”が抽出されて、これらが図１０（ａ）に示す関数リスト３０の関数名３１、入力情報３３に格納される。
【０１２１】
また、この関数名＝“FuncC”を用いて他の各プログラムコードを検索すると、図１３（ａ）に示す“FuncA”のプログラムコード内に“FuncC”が存在しているので、自己が他の関数“FuncA”で参照されるものと判定する。そして、これより、図１０（ａ）に示す関数リスト３０のように、関数名３１が“FuncA”であるレコードにおける参照関数３６の欄に、当該処理対象関数の関数名＝“FuncC”を格納する。
【０１２２】
同様にして、図１４（ｂ）に示す関数“FuncD”を処理対象とすると、まず、１行目が関数宣言部分として特定され、この関数宣言部分から関数名＝“FuncD”が抽出されるが引数が無いので、図１０（ａ）に示す関数リスト３０の関数名３１には“FuncD”が格納されるが、入力情報３３にはデータは格納されない。
【０１２３】
また、この関数名＝“FuncD”を用いて他の各プログラムコードを検索すると、図１４（ａ）に示す“FuncC”のプログラムコード内に“FuncC”が存在しているので、自己が他の関数“FuncC”で参照されるものと判定する。そして、これより、図１０（ａ）に示す関数リスト３０のように、関数名３１が“FuncC”であるレコードにおける参照関数３６の欄に、当該処理対象関数の関数名＝“FuncD”を格納する。
【０１２４】
次に、以下、図１３、図１４の例に応じたデータ参照リスト４０を生成処理について説明する。
データ参照リスト４０を生成するために、各関数毎に、その関数の引数がどこから来ているかを（引数のデータの入力元を）、検索と構文解析によって判別する。これは、例えば、上記生成した関数リスト３０と、プログラムコード１等を用いて判別する。
【０１２５】
これは、例えば、まず、関数リスト３０の参照関数３６を参照して、処理対象関数を参照している他の関数がある場合には、当該他の関数を検索対象とする。そして、検索対象の関数のプログラムコード１において、処理対象の関数の記述箇所を判別して、そこで処理対象の関数に代入されている変数(括弧内の変数)を検出する。
【０１２６】
そして、検出した変数を用いて検索対象の関数のプログラムコード１内を上方（前側）に検索して、当該変数の他の記述箇所を検出することで、処理対象関数の引数データの入力元を判別する。そして、この判別結果に基づいて接続先情報４４へデータを格納する。詳しくは以下の具体例で説明する。尚、処理対象関数の関数名と引数を、入力情報４１の関数名４２と入力名４３に格納する処理も行う。
【０１２７】
関数“FuncA”が処理対象の場合、図１０（ａ）に示す例では“FuncA”を参照している他の関数はないので、接続先情報４４には何もデータを格納しない。尚、上記の通り、その関数名“FuncA”と各引数“InFuncOn”、“InData”を、データ参照リスト４０の入力情報４１の関数名４２と入力名４３に格納する処理は行う。
【０１２８】
また、関数“FuncB”が処理対象の場合、図１０（ａ）に示す例ではFuncBはFuncAで参照されているので、FuncAのプログラムコード（図１３（ａ））を検索対象とする。この場合、FuncAの中でFuncBに代入されている変数(括弧内の変数)は、InDataであるため、FuncBが参照されている箇所から上方にInDataを検索することで、関数宣言部分の引数としてのInDataが検出される。これより、InDataは関数FuncAの引数であると判定すると共に、これが処理対象関数“FuncB”の引数“InSignal”の入力元であると見做す。
【０１２９】
以上のことから、データ参照リスト４０において、処理対象の関数名“FuncB”と引数“InSignal”を、入力情報４１の関数名４２と入力名４３に格納すると共に、上記検索対象の関数名“FuncA”と引数“InData”を、接続先情報４４の関数名４５、接続先４６に格納する。また、“InData”は引数であるので、種別が入力と見做して、種別４８に格納するようにしてもよいが、この例に限らない。必ずしも種別４８にデータを格納する必要はない。これより、以下の説明では種別４８に関しては特に言及しないものとする。
【０１３０】
また、関数“FuncC”が処理対象の場合、図１０（ａ）に示す例ではFuncCはFuncAで参照されているので、FuncAのプログラムコード１（図１３（ａ））を検索対象とする。この場合、FuncAの中でFuncCに代入されている変数(括弧内の変数)は、InFuncOnとaWorkSS1である。
【０１３１】
これより、まず、InFuncOnを当該記述箇所から上方へと検索すると、上記InDataの場合と同様、FuncAの引数であると判定される。
これより、図１０（ｂ）に示すように、データ参照リスト４０において、処理対象の関数名“FuncC”と引数“InSwitch”を、入力情報４１の関数名４２と入力名４３に格納すると共に、上記検索対象の関数名“FuncA”と引数“InFuncOn”を、接続先情報４４の関数名４５、接続先４６に格納する。
【０１３２】
また、AWorkSS1は、記述箇所から上方に検索を行うと、前行の「aWorkSS1 = FuncB(InData);」がヒットして取得される。これより、代入元が「FuncB(InData);」であることが分かる。これをカッコ部分で分割し、「FuncB」部分を取り出す。そこから「FuncB」を関数リスト３０から検索し、「FuncB」という関数の戻り値が「aWorkSS1」へ代入されていることが分かる。もし関数リスト３０から見つからなかった場合(代入元がさらに変数だった場合など)は、その変数名をさらに上方に検索することで、データの元を特定する。
【０１３３】
以上のことから、データ参照リスト４０において、処理対象の関数名“FuncC”と引数“InAddData”を、入力情報４１の関数名４２と入力名４３に格納すると共に、上記検索対象の関数名“FuncA”と代入元“FuncB”を、接続先情報４４の関数名４５、接続先４６に格納する。尚、本例では、接続箇所４７には何もデータは格納されない。
【０１３４】
上述したように、関数が引数として取得している変数を、参照している関数内から検索することで、引数に代入されるデータの入力元を特定することができる。Ｃ言語プログラムの場合、代入元はイコールの右側であると決まっており、代入先はイコールの左側であると決まっている。そのため、どの変数にどの値が代入されたかは式を解析することで特定することが可能である。このような方法により、Ｃ言語プログラムに対しても図１０（ｂ）のようなデータ参照リスト４０が生成可能である。
【０１３５】
上述したようにして、テスト対象のプログラムコード１がＣ言語等のテキストベースのプログラムであっても、当該プログラムコード１から関数リスト３０、データ参照リスト４０を生成できる。
【０１３６】
尚、その後の処理は、関数リスト３０、データ参照リスト４０に基づいて、上記テスト実行順序決定結果５０、順序／条件データ６０、入力生成順序情報７０等を生成する処理であるので、図形式プログラムの場合と同じである。よって、ここでは説明しない。
【０１３７】
以上説明したように、本手法によれば、テスト対象のプログラムに基づいて、その各関数同士の参照関係を抽出すると共に、各関数の入力数等を判定する。そして、参照する関数の数が少ない関数から順に、試験実行するように、試験順序を決定する。参照する関数の数が同じ関数同士の試験実行順序は、入力数が少ない関数の方を優先させる。このようにすることで、ムダのない適切な試験スケジュールを自動作成することができる。
【０１３８】
また、本手法によれば、各関数毎に、その関数の引数の入力元を判別し、入力元が他の関数ではない場合には、この引数は入力データ生成対象と見做す。尚、入力元が他の関数である引数の入力データは、当該他の関数の処理結果を用いればよい。
【０１３９】
上記入力データ生成対象である引数が複数ある場合には、順序を決定する。これは、例えば、上記決定した試験順序に従って決定する。この様に、入力データを生成する必要があるものに関しては、適切な生成順を自動決定することもできる。
【０１４０】
上述したことにより、プログラムに対して行うテストパターンの生成処理の呼び出し回数を縮小し、テスト実施時間の短縮を図ることができる。
【符号の説明】
【０１４１】
１  プログラムコード
２  テスト結果
３  テストスケジュール
１０  自動試験システム
１１  入力部
１２  テストパターン生成部
１３  テストスケジュール生成部
１４  テスト実行部
１５  出力部
２１  入力部
２２  関数リスト生成部
２３  テスト順序生成部
２４  出力部
３０  関数リスト
３１  関数名
３２  入力数
３３  入力情報
３４  出力数
３５  出力情報
３６  参照関数
４０  データ参照リスト
４１  入力情報
４２  関数名
４３  入力名
４４  接続先情報
４５  関数名
４６  接続先
４７  接続箇所
４８  種別
５０  テスト実行順序決定結果
５１  Ｎｏ．
５２  テスト実行関数
５３  入力情報
５４  参照関数
６０  順序／条件データ
６１  ＮＯ．６１
６２  入力必要順序
６２ａ  関数名
６２ｂ  入力
６３  入力条件
６４  入力
６４ａ  関数名
６４ｂ  参照箇所
６４ｃ  種別
６５  入力
６５ａ  関数名
６５ｂ  参照箇所
６５ｃ  種別
【図１】
2015001825.tif 000003
【図２】
2015001825.tif 000004
【図４】
2015001825.tif 000005
【図５】
2015001825.tif 000006
【図６】
2015001825.tif 000007
【図７】
2015001825.tif 000008
【図８】
2015001825.tif 000009
【図９】
2015001825.tif 000010
【図１０】
2015001825.tif 000011
【図１１】
2015001825.tif 000012
【図１２】
2015001825.tif 000013
【図１３】
2015001825.tif 000014
【図１４】
2015001825.tif 000015
【図１５】
2015001825.tif 000016
【図３】
2015001825.tif 000017