(57)【特許請求の範囲】
【請求項１】
生成するテストプログラムを記述するためのプログラミング言語の構文が分割可能なものであり前記構文を要素単位で分割し、それを１つのテストプログラム生成用部品として定義した部品の集まりであるテストプログラム生成用部品群の中から乱数を用いて前記テストプログラム生成用部品の１つを第１部品として選択し確定する第１工程と、選択し確定した第（ｎ−１）部品を構成する複数の第ｎ部品について前記テストプログラム生成用部品群の中から乱数を用いて前記第ｎ部品の１つを選択し確定する工程を前記ｎを２から始めて順次大きくなる整数で繰返し行う第２工程と、前記選択し確定した第ｎ部品がそれを構成する部品を持たない場合に前記選択し確定した第ｎ部品の情報をテストプログラムの構成要素として選択し確定する第３工程とを備え、前記第１工程乃至第３工程を繰返し行うことにより得られた複数のテストプログラムの構成要素に基づいてテストプログラムを生成することを特徴とするコンピュータプログラムのテストプログラム生成方法。
【請求項２】
前記第１工程における前記第１部品の選択は、前記各テストプログラム生成用部品にそれぞれ対応して設けられた部品の選択され易さを示す重み情報を考慮して行われることを特徴とする請求項１記載のコンピュータプログラムのテストプログラム生成方法。
【請求項３】
前記第２工程における前記第ｎ部品の１つの選択は、前記各第ｎ部品にそれぞれ対応して設けられた部品の選択され易さを示す重み情報を考慮して行われることを特徴とする請求項１または２記載のコンピュータプログラムのテストプログラム生成方法。
【請求項４】
前記第２工程における前記第ｎ部品の選択の際に、テストプログラムの構文上の制約条件が発生した場合、前記部品の選択され易さを示す重み情報が、前記制約条件に応じて変更されることを特徴とする請求項３記載のコンピュータプログラムのテストプログラム生成方法。
【請求項５】
前記テストプログラムを生成したときの乱数の乱数値を再現情報として保持し、前記テストプログラムを再現する場合に、前記再現情報として保持している前記乱数値を用いることを特徴とする請求項１乃至４のいずれかに記載のコンピュータプログラムのテストプログラム生成方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、乱数を用いてテストプログラムを自動で生成するコンピュータプログラムのテストプログラム生成方法に関する。
【背景技術】
【０００２】
従来から、コンピュータプログラムのテストプログラムを生成する方法は各種提案されている。一般的には、検査担当者などがテストプログラム構文に沿ったテストプログラムを人手により作成するが、機械的に自動で作成する方法も提案されている。
【０００３】
例えば、特許文献１には、コンパイラテストプログラムを自動生成するテストプログラム発生器が記載されている。このテストプログラム発生器２００は、図２に示すように、構文に従って作成した単一文を複数行集めたプログラム記述の集まりを１つの要素（プログラムセル）とする。これらを集めたプログラムセル情報２１０と、集められた複数のプログラムセルからテストプログラムとして選択され易さを示すセル重み情報２１１をプログラムセル組合わせ器２３０に入力し、乱数発生器２２０により発生させた乱数を用いて、選択されたプログラムの集まりであるプログラムセルを組み合わせて、コンパイラのテストプログラム２４０を自動生成するというものである。集められた複数のプログラムセルに係るテストプログラムとして選択され易さを示すセル重み情報２１１は、以前にテスト対象プログラムの不良を発見できたプログラムセルや、不良を発見出来そうと予測されるプログラムセルに対して与えられる。集められたプログラムセルは乱数により選択する時の選択され易さを示すセル重みが重いほど選択されやすくなる。
【０００４】
また、特許文献２には、言語処理プログラム検証方式が記載されている。この技術は、用意された複数の構文生成規則から乱数を用いて規則を選択し、選択された規則を基にテストプログラムを生成するものである。また、特許文献３には、テストプログラム作成支援装置が記載されている。この装置は、既存のテストプログラムの文法網羅性を判定し、既存のテストプログラムから外れた文法を縮小文法仕様として出力し、その縮小文法仕様を基に追加テストプログラムを自動生成するものである。さらに、特許文献４には、テストプログラム作成支援装置が記載されている。この装置は、バッカス記法で記述された構文規則を基に文パターンを生成し、生成された文パターンを人手によって編集しテストプログラムとするものである。
【特許文献１】特開２００４―２２７１２９号公報
【特許文献２】特開平１−２２００４４号公報
【特許文献３】特開平３−７５８４０号公報
【特許文献４】特開平６−２１４７７５号公報
【発明の開示】
【発明が解決しようとする課題】
【０００５】
例えばコンパイラの不良を摘出するためには、構文の組合せを考慮し多くの構文組合せテストを実施すること、およびテストデータとしてテストプログラムを多数作成しテストを実施することが必要である。従来のような人手によりテストプログラムを作成していたのでは、その工数は膨大であり充分なテストが実施できない恐れがあるため、上記のようなテストプログラムの自動生成法が提案されてきた。
【０００６】
しかし、構文に従って作成した単一文を複数行集めたプログラム記述の集まりを要素として使用する場合には、プログラム文内の構文組合せは乱数等により機械的に決定するのではなく作成者のセンスに依存するため、その構文の組合せもプログラム文の作成者の考える域を越えた複雑な条件の記述については作成されない。
【０００７】
さらに、以前に不良を発見できたプログラム記述が集まった要素及び不良を発見出来そうと予測されるプログラム記述が集まった要素に対して、乱数を利用して要素を選択しテストプログラムを生成することができるが、この場合、選択され易さを示す重みが初期に設定された内容に固定されるため、構文の使用状況に関係なく常に同じプログラム記述の集まった要素が選択されやすくなり、新たな不良の発見が難しくなる。
【０００８】
また、あらかじめ用意した構文生成規則の中から、乱数により生成規則を選択しそれをもとにテストプログラムを生成する場合には、上記のように用意する構文生成規則はテストプログラム作成者の考える域を超えないため、同様な問題がある。さらに、用意した構文の情報を人手により選択することでテストプログラムを生成、あるいは文法網羅によるテストプログラムを生成する場合には、テストしたい単純な内容・項目については可能であるが、複雑な条件で発生する不良を検出することは困難である。
【０００９】
従って本発明の目的は、テスト対象プログラムに対し、複雑な条件で発生する不良の摘出が可能なテストプログラムを自動で生成するコンピュータプログラムのテストプログラム生成方法を提供することにある。
【課題を解決するための手段】
【００１０】
上記目的は、テスト対象のコンピュータプログラムのテストプログラム生成用部品を複数集めたテストプログラム生成用部品群の中から乱数を用いて前記テストプログラム生成用部品の１つを第１部品として選択し確定する第１工程と、選択し確定した第（ｎ−１）部品を構成する複数の第ｎ部品の中から乱数を用いて前記第ｎ部品の１つを選択し確定する工程を前記ｎを２から始めて順次大きくなる整数で繰返し行う第２工程と、前記選択し確定した第ｎ部品がそれを構成する部品を持たない場合に前記選択し確定した第ｎ部品の情報をテストプログラムの構成要素として選択し確定する第３工程とを備え、前記第１工程乃至第３工程を繰返し行うことにより得られた複数のテストプログラムの構成要素に基づいてテストプログラムを生成するコンピュータプログラムのテストプログラム生成方法により、達成される。
【００１１】
ここで、前記第１工程における前記第１部品の選択は、前記各テストプログラム生成用部品にそれぞれ対応して設けられた部品の選択され易さを示す重み情報を考慮して行うことができる。また、前記第２工程における前記第ｎ部品の１つの選択は、前記各第ｎ部品にそれぞれ対応して設けられた部品の選択され易さを示す重み情報を考慮して行うことができる。前記第２工程における前記第ｎ部品の選択の際に、テストプログラムの構文上の制約条件が発生した場合、前記部品の選択され易さを示す重み情報が、前記制約条件に応じて変更され得る。また、前記テストプログラムを生成したときの乱数の乱数値を再現情報として保持し、前記テストプログラムを再現する場合に、前記再現情報として保持している前記乱数値を用いることができる。
【発明の効果】
【００１２】
本発明によれば、テスト対象プログラムに対し、複雑な条件で発生する不良の摘出が可能なテストプログラムを自動で生成するコンピュータプログラムのテストプログラム生成方法を得ることができる。即ち、本発明では、テストプログラムの構文が要素単位で分割できるのを利用し、実測データ及び人手によって作成したテストプログラムでは見つけづらい複雑な条件で発生する不良の摘出が可能なテストプログラムを、効率的に自動で生成することができる。また、再テスト時には、再現情報として保持する乱数値を用いて、当該テストプログラムを再現することで、テスト対象プログラムのデバッグ効率及び品質の向上を図ることができる。このように、本発明のテストプログラム生成方法では、テストプログラムの構文を要素単位に分割し、乱数により選択された各構文の展開および使用状況にあった設定で部品として具現化していくことで、多種多様なテストに対応したテストプログラムを生成することができる。
【発明を実施するための最良の形態】
【００１３】
以下、本発明に係るコンピュータプログラムのテストプログラム生成方法の一実施例を図面を用いて説明する。
図１は、コンピュータプログラムのテストプログラムを自動生成するテストプログラム生成器１００の構成例を示す図である。本実施例で示すテストプログラム生成器１００は、例えばパーソナルコンピュータ上で動作するソフトウェアにより実現されるもので、図示のように、テストプログラム生成用部品群１０１と、テストプログラム生成用部品具現化部１０２と、乱数器１０３と、テストプログラム出力部１０４とを備える。テストプログラム生成用部品具現化部１０２は、部品重み情報１０５から部品の選択され易さを示す重み情報を得ることができる。テストプログラム出力部１０４は、生成したテストプログラムをテストプログラム１０６に出力するものである。乱数器１０３は、再現情報１０７との間で情報の授受を行う。ここでテストプログラムは例えばコンパイラのテストプログラムであるが、これに限定されない。
【００１４】
ここでは、構文を構成する要素単位で分割したプログラム構文情報と、使用状況に応じて構文を定義した部品を乱数によって選択する際に使用する選択され易さを示す重みが定義されており、プログラム文（複数文）から変数の宣言文まで生成可能なように、プログラムとして実行できる構文が部品として登録されている。
【００１５】
図１において、テストプログラム生成用部品群１０１とは、生成するテストプログラムの構文を分割可能な要素単位で分割し、それを一つの部品として定義した部品の集まり（群）である。すなわち、分割可能な要素とは、構文を構成する各部品のことである。次に、この部品の例を図４〜図６を用いて説明する。
【００１６】
図４は、テストデータとなるテストプログラムのＣ言語構文例（バッカス記法）の一部を示す図である。本例は、Ｃ言語でｅｘｐｒｅｓｓｉｏｎの構文を要素で分割しバッカス記法で表現したものである。本図において、ｅｘｐｒｅｓｓｉｏｎ内の”ａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎ”、および、”ｅｘｐｒｅｓｓｉｏｎ，ａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎ”等が構文を構成する部品である。
【００１７】
図５は、テストデータとなるテストプログラムのＣ言語構文例（構文木）の一部を示す図である。本例は、Ｃ言語でｅｘｐｒｅｓｓｉｏｎの構文を要素で分割し木構造で表現したものである。本図において、ｅｘｐｒｅｓｓｉｏｎにつながる”ａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎ”、および、”ｅｘｐｒｅｓｓｉｏｎ，ａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎ”等が構文を構成する部品である。
【００１８】
図４および図５に示す構文例はともに、ｅｘｐｒｅｓｓｉｏｎがａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎ、またはｅｘｐｒｅｓｓｉｏｎ，ａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎのいずれかの構文を選択するように定義されている。しかし、構文としては単純でも、それを使用する場面は複数あり、その意味合いも異なっている。
【００１９】
図６は、テストデータとなるテストプログラムのＣ言語構文例（バッカス記法）の一部を示す図である。本例は、Ｃ言語でｆｏｒの構文を要素で分割しバッカス記法で表現したものである。ここで、ｆｏｒ構文も部品であり、それを構成しているｅｘｐｒｅｓｓｉｏｎ群もｆｏｒ構文を構成する部品である。このｆｏｒ構文について、ｆｏｒの第１ｅｘｐｒｅｓｓｉｏｎ、第２ｅｘｐｒｅｓｓｉｏｎ、および第３ｅｘｐｒｅｓｓｉｏｎは、全てｅｘｐｒｅｓｓｉｏｎと表現されているが、それぞれ初期化用の代入文、判定用の比較文、および加減算文というように意味が異なっており、そのためテストプログラムの自動生成を考慮した場合、その状況に合った構文情報を多数用意する必要がある。
【００２０】
そこで、構文を要素単位に分割し、使用状況に応じて選択される構文と処理を部品に定義することにより意味のあるテストプログラムが生成可能であり、かつ構文の組合せ情報数を増やすことなく、乱数による部品選択により構文の組合せを決定していくため、多くのテストプログラムを生成すれば構文の組合せも自動で増えていくことになり、人手を介在させることなく意味のあるテストプログラムが生成でき、かつ構文組合せのテストプログラムも生成できる。
【００２１】
図３は、テストプログラム生成器１００で処理するテストプログラム生成時の全体フローを示す図である。まず、ステップ３０１にて、再現情報指示の有無を検査する。ここで、再現情報とは、乱数器１０３より出力されるテストプログラムの再現情報１０７のことである。これが「なし」の場合、後述のステップ３０３に移行する。また「あり」の場合、ステップ３０２にて、再現情報設定処理を行う。この再現情報設定処理３０２では、テストプログラムを生成する初期段階にて、乱数器１０３より出力されるテストプログラムの再現情報１０７を乱数器１０３に指定することで、該当するテストプログラムの再現が可能となる。この再現情報設定処理３０２（テストプログラムの再現）については、後で図１１を用いて詳述する。
【００２２】
次に、ステップ３０３にて、部品重み指示の有無を検査する。これが「なし」の場合、後述のステップ３０５に移行する。また「あり」の場合、ステップ３０４にて、部品重み情報設定処理を行う。この部品重み情報設定処理３０２では、部品重み情報１０５において定義されている要素単位に分割した構文の使用状況に合った選択部品別の重み割合を、該当する部品に対して設定する。この部品重み情報設定処理３０４については、後で図１０を用いて詳述する。
【００２３】
続いて、ステップ３０５にて、テストプログラム生成用部品具現化処理を行う。この部品具現化処理３０５では、テストプログラム生成用部品具現化部１０２において、テストプログラム生成用部品群１０１から乱数器１０３が発生する乱数により選択した部品の具現化を行う。ここで、具現化とは、選択した部品に実体を持たせることでその部品を確定することをいう。実体を持たせるとは、部品の使用状況に特化した内容で動的にメモリを確保することをいう。具現化（確定）された部品は更にそれを構成する部品に何回か展開可能である。展開可能の間、この具現化処理を繰返し行う。具現化された部品がそれ以上展開できなくなった時点で具現化処理を終了する。そして、この末端となる具現化された部品（末端部品）の情報（型、定数、変数、演算子等）を構文の使用状況により選択し確定する。この末端部品の情報がテストプログラムを構成する。以上の処理を次々に行うことにより、テストプログラム出力処理３０６によりテストプログラムを出力する。上記テストプログラム生成用部品具現化処理３０５について、以下図７〜図９を用いて説明する。
【００２４】
図７は、テストプログラム生成用部品具現化処理（具現化処理終了フラグのＯＦＦの場合）の一例を説明するための図である。本例は、構文ｅｘｐｒｅｓｓｉｏｎをテストプログラム生成用部品７０１として登録したものである。ｅｘｐｒｅｓｓｉｏｎ部品７０１は、乱数により選択する具現化対象部品７０２別に、構文の使用状況に合わせて与えられるｅｘｐｒｅｓｓｉｏｎ部品７０１に対する展開指示７０３単位に、乱数により選択され易さを示す具現化対象部品の重みの割合（重み情報）が定義されている。
【００２５】
ｅｘｐｒｅｓｓｉｏｎ部品７０１が持つ構文の部品（具現化対象部品）として、図７に示すように、ａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎ７０４，およびＣｏｍｍａ−Ｅｘｐ７０５がある。選択対象となるこれらの部品は、具現化処理にて実体を持つまでは単なる構文の情報に過ぎない。また、Ｃｏｍｍａ−Ｅｘｐ７０５は構文上存在する定義ではないが、”ｅｘｐｒｅｓｓｉｏｎ，ａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎ”は通常カンマ演算子と呼ばれており、選択される部品単位として”ｅｘｐｒｅｓｓｉｏｎ，ａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎ”を一つにまとめて便宜上使用しているものである。以降、構文を要素単位に分割した部品の具現化処理について説明する。
【００２６】
図８は、部品の具現化処理フローの一例を示す図である。以下、本図と図７にそって部品の具現化処理について説明する。図７に示すように、ｅｘｐｒｅｓｓｉｏｎ部品７０１に対し、展開指示として「ｆｏｒ第１式（代入文の重み）」７０７が与えられた場合、まず図８のステップ８０１にて、具現化処理で構文の制約条件が発生したかどうかを検査する。その結果、制約条件が未発生の場合は、ステップ８０３に移行する。一方、制約条件が発生の場合は、ステップ８０２にて、構文制約条件に沿った部品の重み割合に変更する。次に、ステップ８０３にて、具現化処理終了フラグのＯＮ，ＯＦＦの検査、即ち具現化処理終了の判定を実施する。具現化処理終了の判定とは、構文に沿って具現化されてきた部品について、これ以上の選択要素の存在有無を確認するものであり、ｅｘｐｒｅｓｓｉｏｎ部品７０１に定義されている具現化処理終了フラグ７０６のＯＦＦ／ＯＮがその情報を示す。
【００２７】
図７の例では、具現化処理終了フラグ７０６がＯＦＦと表示されており、これは具現化処理終了でないことを示す。具現化処理終了でない場合、図８のステップ８０４にて、与えられた展開指示別で具現化対象部品別に設定されている重み割合を取得する。図７の例の場合、太点線で囲まれたｆｏｒ第１式部分７０８がそれに該当する。続いて、ステップ８０５にて、乱数器より発生した乱数と取得した重み割合を元に具現化する部品を選択し、ステップ８０６にて、選択した部品に実体を持たせることで部品を具現化する（図７のブロック７０９）。図７では、ａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎ７０４が乱数により選択され具現化された部品に該当する。そして、ステップ８０７にて、具現した部品ａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎ７０４に対して、対応する展開指示を与え（図７の矢印７１０）、以降の構文を決定するための部品の具現化処理を実行する。この具現化処理は繰返し行われる。その結果、具現化処理終了フラグが“ＯＮ”となった場合を次に説明する。
【００２８】
図９は、テストプログラム生成用部品具現化処理（具現化処理終了フラグのＯＮの場合）の一例を説明するための図である。部品の具現化処理を繰返し行った結果、該当する部品内の具現化処理フラグが“ＯＮ”となった場合、該当する部品は、構文の末端部品であることを示す。図９において、ａｓｓｉｇｎｍｅｎｔ＿ｏｐｅｒａｔｏｒ９０１は、代入文の代入演算子構文の部品である。ａｓｓｉｇｎｍｅｎｔ＿ｏｐｅｒａｔｏｒ９０１も、先に説明したｅｘｐｒｅｓｓｉｏｎ７０１と同様に、乱数により選択する具現化対象部品９０２別に、構文の使用状況に合わせて与えられるａｓｓｉｇｎｍｅｎｔ＿ｏｐｅｒａｔｏｒ部品９０１に対する展開指示９０３単位に、乱数により選択され易さを示す具現化対象部品の重みの割合が定義されている。代入演算子構文では、構文の使用状況により使用可能な演算子は制限されるが、代入演算子以降の構文の展開はない。つまり、具現化処理終了フラグが“ＯＮ”の場合は、末端となる具現化部品の情報（型、定数、変数、演算子等）を構文の使用状況により選択し確定し、そして以降の具現処理を行わず、呼出元に戻ることになる。すなわち、図８のステップ８０８にて、末端となる具現化部品（末端部品）の情報（型、定数、変数、演算子等）を構文の使用状況により選択し確定する。これがテストプログラムの構成要素となる。次に、以上の具現化処理に基づいて行われるテストプログラムの生成方法を説明する。
【００２９】
図１２は、テストプログラム生成用部品の具現化処理によるテストプログラム生成方法の一例を示す図である。図示のように、まず、テストプログラム生成用部品群の中から構文の基礎となる部品１０９を選択し確定する。次に、この部品１０９に対して具現すべき部品をテストプログラム生成用部品群の中から乱数を用いて部品１１０を選択し具現化（確定）する。このとき、部品１１０では代入文の構文が確定されたとして以後説明する。まず代入文を構成するために、テストプログラム生成用部品群の中から乱数を用いてテストプログラム生成用部品の１つを部品１１１として選択し確定する。次に、この部品１１１を構成する部品の１つを選択し具現化（確定）することで具現化部品１１２を得る。同様にして、この部品１１２を構成する部品の１つを乱数を用いて選択し具現化（確定）することで具現化部品１１３を得る。さらに同様にして、順次、具現化部品１１４・・・１１ａを得る。この場合、構成部品を持たない部品１１ａが末端部品（最終要素）となる。その末端部品の情報（型、定数、変数、演算子等）を構文の使用状況により選択し確定する。ここで選択し確定した末端部品の情報は本図では例えば「Ａ」である。これがテストプログラムの構成要素となる。続いて、元に戻り、テストプログラム生成用部品群の中から乱数を用いてテストプログラム生成用部品の１つを部品１１２として選択し確定し、上記と同様にして具現化部品１２２、１２３、１２４・・・１２ｂを得る。この場合、構成部品を持たない部品１２ｂが末端部品（最終要素）となる。その末端部品の情報（型、定数、変数、演算子等）を構文の使用状況により選択し確定する。ここで選択し確定した末端部品の情報は本図では例えば「＝」である。これがテストプログラムの構成要素となる。本例では、このようにしてテストプログラムの構成要素を次々と選択し確定し、これに基づいてテストプログラムを生成する。以上の工程を一般化すると次のようになる。すなわち、テスト対象のコンピュータプログラムのテストプログラム生成用部品を複数集めたテストプログラム生成用部品群の中から乱数を用いてテストプログラム生成用部品の１つを第１部品として選択し確定する第１工程と、選択し確定した第（ｎ−１）部品を構成する複数の第ｎ部品の中から乱数を用いて第ｎ部品の１つを選択し確定する工程をｎを２から始めて順次大きくなる整数で繰返し行う第２工程と、前記選択し確定した第ｎ部品がそれを構成する部品を持たない場合に前記選択し確定した第ｎ部品の情報をテストプログラムの構成要素として選択し確定する第３工程とを備え、第１工程乃至第３工程を繰返し行うことにより得られた複数のテストプログラムの構成要素に基づいてテストプログラムを生成するものである。
【００３０】
以上のテストプログラムの生成において、選択部品の重み割合変更について説明する。図９には、制約事項による選択部品重み割合変更の一例が示されている。部品の具現化処理において、確定した構文により以降の構文確定に制約が発生する場合がある。例えば、代入先の変数型がポインタ型と確定された場合（図９のブロック９０５）、部品ａｓｓｉｇｎｍｅｎｔ＿ｏｐｅｒａｔｏｒ９０１に対してポインタ代入式のみ（＝，＋＝，−＝のみ可）という構文制約条件が発生（図９のブロック９０６）する。既に具現化されているａｓｓｉｇｎｍｅｎｔ＿ｏｐｅｒａｔｏｒ９０１には「代入式（ａｌｌ）」の展開指示９０７が既に指示されており、この重み割合のままでは、構文の制約に当てはまらない構文が選択されてしまうことになる。そこで、この場合、図８のステップ８０１からステップ８０２に移行する。このステップ８０２にて、ａｓｓｉｇｎｍｅｎｔ＿ｏｐｅｒａｔｏｒ９０１に与えられた展開指示９０７の具現化対象部品の重み割合を、構文制約条件に沿った具現化部品の重み割合に変更する（図９の太点線９０８）する。これにより、以降の部品選択処理において、構文制約外の部品が選択されることをなくすることができる。
【００３１】
図１０は、部品重み情報を指定した場合の選択部品重み割合変更の一例を示す図である。図示のように、部品重み情報１００１を指定した場合（図３のステップ３０３で指示ありの場合）、選択部品の重み変更は次のようにして行われる。すなわち、部品重み情報１００１には、該当する具現化部品１００２とそれに与えられる展開指示１００３別に、具現化対象部品単位の選択され易さを示す重み割合１００４が定義されている。テストプログラム生成時、具現化用部品重み指示がされていた場合に、具現化用部品重み情報設定処理１００５（図３のステップ３０４）では、指示された部品重み情報１００１を展開し、該当する具現化部品ｅｘｐｒｅｓｓｉｏｎ１００６の展開指示部分情報１００７を、展開した内容１００８に変更する。これにより、以降のテストプログラム生成用部品具現処理（図３のステップ３０５）では、乱数により選択される具現化対象部品の重み割合が、部品重み情報１００１で指示された内容に変更される。これにより、使用者が期待する構文の部品が選択されやすくなる。
【００３２】
図１１は、乱数器および乱数利用処理の一例を説明するための図である。以下、本図に沿って、テストプログラムの再現について説明する。図１のテストプログラム生成器１００では、本図に示す乱数利用処理１１１０が行われる。乱数利用処理１１１０は、部品選択による具現化処理１１０３、変数の再利用処理１１０４、数値処理１１０５など構文・数値等を決定する処理毎に、乱数器１１０１を実行し、乱数値１１０２を発生させ、その値を基に部品の選択、変数再利用、数値設定を決定している。
【００３３】
乱数器１１０１は、乱数基準値設定処理１１０６、乱数基準値１１０７、および乱数値発生器１１０８を備える。乱数基準値設定処理１１０６は、乱数値発生器１１０８で使用する最初の乱数基準値１１０７を生成して設定する。この最初に設定する基準値は実行毎にユニークとなるように生成される。また、乱数基準値１１０７の内容は、再現情報１１０９として外部に出力される。乱数値発生器１１０８は、乱数器１１０１に乱数発生の依頼があると、乱数基準値１１０７を入力し、乱数値１１０２を出力する。また、その時に生成した乱数値を乱数基準値１１０７に設定し、次回に乱数値発生の基準値にする。これにより、毎回設定されるユニークな値の乱数基準値１１０７を自動で設定することで、次回の乱数値生成を可能としている。この乱数器１１０１では、乱数基準値１１０７を基に乱数値を発生させるため、乱数器を使用するときは必ず乱数基準値１１０７を毎回ユニークにする必要がある。また、最初に設定する乱数基準値１１０７を前回と同じにすると、以降の乱数器１１０１から生成される乱数値１１０２は、前に生成した内容と同一になる。これを利用し乱数基準値設定処理１１０６で出力した再現情報１１０９をテストプログラム生成時に乱数基準値設定処理１１０６を介して乱数基準値１１０７に設定することで、乱数器１１０１から生成される乱数値が前回と同一なため選択される部品・具現処理も同じものとなり、前回生成したテストプログラムの再現が可能となる。また、再現情報１１０９は、乱数基準値設定処理１１０６が出力した内容だけでなく、テストプログラム生成器を実行させるときに使用者が設定可能である。
テストプログラム生成器１００に関する内容は、テストプログラムの構文が要素単位に分割可能なもので部品化することが出来るものであれば他のテストプログラム生成方式でも使用可能である。また、コンピュータプログラムの検査システムは、例えば特許文献１のコンパイラ検査システムと同様に構成することができる。
【産業上の利用可能性】
【００３４】
本発明は、乱数を用いてテストプログラムを自動で生成するコンピュータプログラムのテストプログラム生成方法に関するものであり、産業上の利用可能性を有する。
【図面の簡単な説明】
【００３５】
【図１】コンピュータプログラムのテストプログラムを自動生成するテストプログラム生成器１００の構成例を示す図である。
【図２】従来のテストプログラム生成方法の一例を示す図である。
【図３】テストプログラム生成器で処理するテストプログラム生成時の全体フローを示す図である。
【図４】テストデータとなるテストプログラムのＣ言語構文例（バッカス記法）の一部を示す図である。
【図５】テストデータとなるテストプログラムのＣ言語構文例（構文木）の一部を示す図である。
【図６】テストデータとなるテストプログラムのＣ言語構文例（バッカス記法）の一部を示す図である。
【図７】テストプログラム生成用部品具現化処理（具現化処理終了フラグのＯＦＦの場合）の一例を説明するための図である。
【図８】部品の具現化処理フローの一例を示す図である。
【図９】テストプログラム生成用部品具現化処理（具現化処理終了フラグのＯＮの場合）の一例を説明するための図である。
【図１０】部品重み情報を指定した場合の選択部品重み割合変更の一例を示す図である。
【図１１】乱数器および乱数利用処理の一例を説明するための図である。
【図１２】テストプログラム生成用部品の具現化処理によるテストプログラム生成方法の一例を示す図である。
【符号の説明】
【００３６】
１００  テストプログラム生成器
１０１  テストプログラム生成用部品群
１０２  テストプログラム生成用部品具現化部
１０３  乱数器
１０４  テストプログラム出力部
１０５  部品重み情報
１０６  テストプログラム
１０７  再現情報
３０１  再現情報指示
３０２  再現情報設定処理
３０３  テストプログラム生成用部品重み指示
３０４  部品重み情報設定処理
３０５  テストプログラム生成用部品具現化処理
３０６  テストプログラム出力処理
７０１  ｅｘｐｒｅｓｓｉｏｎ部品
７０２  ｅｘｐｒｅｓｓｉｏｎが持つ具現化対象部品
７０３  具現されたｅｘｐｒｅｓｓｉｏｎに与えられる展開指示
７０４  ａｓｓｉｇｎｍｅｎｔ−ｅｘｐｒｅｓｓｉｏｎ部品
７０５  Ｃｏｍｍａ−Ｅｘｐ部品
７０６  ｅｘｐｒｅｓｓｉｏｎの具現化処理終了フラグ
７０７  ｅｘｐｒｅｓｓｉｏｎに与えられた展開指示（ｆｏｒ第１式）
７０８  ｆｏｒ第１式時の選択部品重み割合
７０９  乱数による部品の選択
７１０  乱数により選択した部品の具現化処理
８０１  構文制約条件
８０２  構文制約発生時の処理
８０３  具現化処理終了フラグ
８０４  展開指示別重み割合取得
８０５  乱数による部品選択
８０６  選択部品の具現化
８０７  部品に対する具現化処理
８０８  具現化処理終了時の処理
９０１  ａｓｓｉｇｎｍｅｎｔ＿ｏｐｅｒａｔｏｒ部品
９０２  ａｓｓｉｇｎｍｅｎｔ＿ｏｐｅｒａｔｏｒが持つ具現化対象部品
９０３  ａｓｓｉｇｎｍｅｎｔ＿ｏｐｅｒａｔｏｒに与えられる展開指示
９０４  ａｓｓｉｇｎｍｅｎｔ＿ｏｐｅｒａｔｏｒの具現化処理終了フラグ
９０５  構文の制約発生条件例
９０６  発生した構文制約条件例
９０７  ａｓｓｉｇｎｍｅｎｔ＿ｏｐｅｒａｔｏｒに与えられる展開指示
９０８  構文制約条件により変更された展開指示別の選択部品重み割合
１００１  部品重み情報
１００２  具現化部品
１００３  具現化部品別展開指示
１００４  具現化対象部品重み割合
１００５  具現化用部品重み情報設定処理
１００６  ｅｘｐｒｅｓｓｉｏｎ部品
１００７  ｅｘｐｒｅｓｓｉｏｎの該当展開指示
１００８  変更された具現化対象部品の重み割合
１１１０  乱数利用処理
１１０１  乱数器
１１０２  乱数値
１１０３  乱数を利用する部品の具現化処理
１１０４  乱数を利用する変数再利用処理
１１０５  乱数を利用する数値処理
１１０６  乱数基準値設定処理
１１０７  乱数基準値
１１０８  乱数値発生器
１１０９  再現情報
【図１】
0004847102.tif 000002
【図２】
0004847102.tif 000003
【図３】
0004847102.tif 000004
【図４】
0004847102.tif 000005
【図５】
0004847102.tif 000006
【図６】
0004847102.tif 000007
【図７】
0004847102.tif 000008
【図８】
0004847102.tif 000009
【図９】
0004847102.tif 000010
【図１０】
0004847102.tif 000011
【図１１】
0004847102.tif 000012
【図１２】
0004847102.tif 000013