(57)【特許請求の範囲】
【請求項１】
シンボリック実行エンジンによるテスト対象のプログラムに含まれる前記シンボリック実行エンジンが解析できないスタブ化対象の記述を検出し、
検出された前記スタブ化対象の記述が実行される際のパス条件を充足する変数値を設定し、
設定された前記変数値を用いて前記スタブ化対象の記述を前記シンボリック実行エンジンが解析できない記述を解析できる情報処理部に実行させ、該情報処理部からの返却値に基づいてスタブを生成し、
前記テスト対象のプログラムの前記スタブ化対象の記述を前記スタブで置換する、処理をコンピュータが実行するスタブ化方法。
【請求項２】
前記検出する処理では、スタブ化する必要のある記述を格納した格納部に基づいて、前記テスト対象のプログラムの中から前記スタブ化対象の記述を検出することを特徴とする請求項１に記載のスタブ化方法。
【請求項３】
シンボリック実行エンジンによるテスト対象のプログラムに含まれる前記シンボリック実行エンジンが解析できないスタブ化対象の記述を検出し、
検出された前記スタブ化対象の記述が実行される際のパス条件を充足する変数値を設定し、
設定された前記変数値を用いて前記スタブ化対象の記述を前記シンボリック実行エンジンが解析できない記述を解析できる情報処理部に実行させ、該情報処理部からの返却値に基づいてスタブを生成し、
前記テスト対象のプログラムの前記スタブ化対象の記述を前記スタブで置換する、処理をコンピュータに実行させるスタブ化プログラム。
【請求項４】
シンボリック実行エンジンによるテスト対象のプログラムに含まれる前記シンボリック実行エンジンが解析できないスタブ化対象の記述を検出する検出部と、
前記検出部が検出した前記スタブ化対象の記述が実行される際のパス条件を充足する変数値を設定する設定部と、
前記設定部が設定した前記変数値を用いて前記スタブ化対象の記述を前記シンボリック実行エンジンが解析できない記述を解析できる情報処理部に実行させ、該情報処理部からの返却値に基づいてスタブを生成する生成部と、
前記テスト対象のプログラムの前記スタブ化対象の記述を前記スタブで置換する置換部と、を備えるスタブ化装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、スタブ化方法、プログラム及び装置に関する。
【背景技術】
【０００２】
プログラムテストにおいて、プログラム中の変数値を具体化せずに、記号（シンボル値）のまま実行する技術（シンボリック実行技術）が用いられることがある。このプログラムテストでは、シンボリック実行によって得たパス条件の充足値をテストデータとして用いる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１２−１８１６６６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
しかしながら、実際のプログラムには、シンボリック実行エンジンが解析対象とできないが、一般的な処理系では実行可能な記述が存在する。このような記述が存在する場合、当該記述を置き換えるスタブを用意して使用する必要がある。なお、スタブは一般的には人手で記述する必要があり、手間が掛かる。
【０００５】
これに対し、ＪＵｎｉｔ（Ｊａｖａ（登録商標）で開発されたプログラムにおいてユニットテスト（単体テスト）の自動化を行うためのフレームワーク）では、戻り値の型に応じて予め決められた定数を返すスタブの自動生成は可能である。例えば、戻り値の型が整数であれば、０を返すスタブを生成し、戻り値の型が真偽値であれば、falseを返すスタブを生成するなどである。しかし、このように予め決められた定数を返すスタブを生成すると、プログラムのうち元々実行し得ない文まで実行されてしまい、テスト結果の信頼性が低下するおそれがある。
【０００６】
なお、従来においては、特許文献１のような技術も知られているが、本技術ではスタブの自動生成はできない。
【０００７】
１つの側面では、本発明は、プログラムのテスト結果の信頼性低下を抑制することが可能なプログラムのスタブ化方法、プログラム及び装置を提供することを目的とする。
【課題を解決するための手段】
【０００８】
一つの態様では、スタブ化方法は、シンボリック実行エンジンによるテスト対象のプログラムに含まれる前記シンボリック実行エンジンが解析できないスタブ化対象の記述を検出し、検出された前記スタブ化対象の記述が実行される際のパス条件を充足する変数値を設定し、設定された前記変数値を用いて前記スタブ化対象の記述を前記シンボリック実行エンジンが解析できない記述を解析できる情報処理部に実行させ、該情報処理部からの返却値に基づいてスタブを生成し、前記テスト対象のプログラムの前記スタブ化対象の記述を前記スタブで置換する、処理をコンピュータが実行する。
【発明の効果】
【０００９】
プログラムのテスト結果の信頼性低下を抑制することができる。
【図面の簡単な説明】
【００１０】
【図１】一実施形態に係る情報処理装置のハードウェア構成を示す図である。
【図２】情報処理装置の機能ブロック図である。
【図３】情報処理装置の処理を示すフローチャートである。
【図４】図４（ａ）〜図４（ｄ）は、図３の処理を説明するための図（その１）である。
【図５】図５（ａ）、図５（ｂ）は、図３の処理を説明するための図（その２）である。
【図６】図３の処理を説明するための図（その３）である。
【図７】図７（ａ）、図７（ｂ）は、図３の処理を説明するための図（その４）である。
【図８】図３の処理を説明するための図（その５）である。
【図９】図９（ａ）、図９（ｂ）は、実施形態の効果を説明するための図である。
【発明を実施するための形態】
【００１１】
以下、情報処理装置の一実施形態について、図１〜図９に基づいて詳細に説明する。本実施形態の情報処理装置は、テスト対象のプログラム（スタブ化前プログラム）の入力を受け付け、スタブ化を実行した後、スタブ化後プログラムを出力するスタブ化装置としての機能を有している。
【００１２】
図１には、本実施形態にかかる情報処理装置１０のハードウェア構成が示されている。図１に示すように、情報処理装置１０は、ＣＰＵ（Central Processing Unit）９０、ＲＯＭ（Read Only Memory）９２、ＲＡＭ（Random Access Memory）９４、記憶部（ここではＨＤＤ（Hard Disk Drive））９６、ネットワークインタフェース９７、表示部９３、入力部９５、及び可搬型記憶媒体用ドライブ９９等を備えている。これら情報処理装置１０の構成各部は、バス９８に接続されている。表示部９３は、液晶ディスプレイ等を含み、入力部９５は、キーボードやマウス、タッチパネル等を含む。情報処理装置１０では、ＲＯＭ９２あるいはＨＤＤ９６に格納されているプログラム（スタブ化プログラムを含む）、或いは可搬型記憶媒体用ドライブ９９が可搬型記憶媒体９１から読み取ったプログラム（スタブ化プログラムを含む）をＣＰＵ９０が実行することにより、図２に示す各部としての機能が実現されている。
【００１３】
図２は、情報処理装置１０の機能ブロック図である。図２に示すように、ＣＰＵ９０がプログラムを実行することにより、シンボリック実行部１２、検出部としてのスタブ化対象記述検出部１４、設定部としての具体値入力生成部１６、生成部としてのスタブ生成部１８、置換部としてのスタブ挿入部２０、として情報処理装置１０を機能させる。なお、図２には、ＨＤＤ９６等に格納されている格納部としてのスタブ化対象記述ＤＢ４０も記載されている。また、図２には、シンボリック実行部１２（シンボリック実行エンジン）とは異なる一般的な処理系である情報処理部としての処理部３０も記載されている。
【００１４】
シンボリック実行部１２は、テスト対象のプログラムをシンボリック実行する。本実施形態では、シンボリック実行部１２は、スタブ化前プログラムの入力を受け付け、スタブ化後プログラムを出力する。
【００１５】
スタブ化対象記述検出部１４は、シンボリック実行部１２から入力されるプログラム内の各記述を、スタブ化対象記述データベース（ＤＢ）４０の内容と比較し、スタブ化対象とするかを判定する。すなわち、スタブ化対象記述検出部１４は、プログラムに含まれるスタブ化対象の記述を検出する。なお、スタブ化対象記述ＤＢ４０には、スタブ化する必要のある記述（スタブ化対象記述）、すなわちシンボリック実行部１２では解析できないが一般的な処理系（処理部３０）では解析できる記述を格納しているものとする。なお、スタブ化対象記述は、スタブ化対象記述ＤＢ４０に対して人手で入力されてもよいが、過去のテストにおいてシンボリック実行部１２が処理できなかった記述をスタブ化対象記述ＤＢ４０に自動的に格納してもよい。
【００１６】
具体値入力生成部１６は、スタブ化対象記述が実行される際のパス条件を充足する各変数の具体値（変数値）をＳＭＴ（Satisfiability Modulo Theories）ソルバを用いて算出する。この場合、過去に同一のスタブ化対象記述がスタブ化されていた場合であっても、具体値入力生成部１６は、実行時のパス条件が異なる場合にはそのパス条件に応じた各変数の具体値を新たに算出する。
【００１７】
スタブ生成部１８は、具体値入力生成部１６で得られた具体値入力を用いて一般的な処理系（処理部３０）にスタブ化対象記述を実行させる。処理部３０では、シンボリック実行部１２が解析対象とできない記述も実行可能であり、スタブ生成部１８は、処理部３０からの返却値を取得すると、当該返却値に基づいてスタブを生成する。
【００１８】
スタブ挿入部２０は、スタブ生成部１８において生成されたスタブによって、テスト対象のプログラムのスタブ化対象記述を置換することで、プログラムにスタブを挿入し、シンボリック実行部１２の解析対象にできるようにする。
【００１９】
（情報処理装置１０の処理）
次に、情報処理装置１０の処理について、図３のフローチャートに沿って、その他図面を適宜参照しつつ、詳細に説明する。
【００２０】
ステップＳ１０では、シンボリック実行部１２が、スタブ化前プログラムの入力を受け付け、初期パス条件をｃとする。例えば、シンボリック実行部１２は、スタブ化前プログラムとして、図４（ａ）に示すようなテスト対象関数main2の入力を受け付けたものとする。なお、テスト対象関数main2の制御構造は、図４（ｄ）に示すようになっている。また、シンボリック実行においては、テスト対象関数main2の引数ａをシンボルとして指定する。また、プログラム実行中においてシンボルの値が満たすべき条件をパス条件と呼ぶものとする。なお、本実施形態では、説明の簡素化のため、図４（ｂ）に示すように、関数func1(a)（a>0）をスタブ化対象関数と仮定し、図４（ｃ）に示すように、関数func2(a)(a==0)をスタブ化対象外関数と仮定している。
【００２１】
次いで、ステップＳ１２では、シンボリック実行部１２が、スタブ化前プログラム内の次命令ｉを読み出す。ここでは、シンボリック実行部１２は、図４（ａ）のテスト対象関数main2のfunc2を読み出したものとする。なお、シンボリック実行部１２は、読み出した命令ｉをスタブ化対象記述検出部１４に送信する。
【００２２】
ステップＳ１４では、スタブ化対象記述検出部１４が、シンボリック実行部１２から受信した命令ｉがスタブ化対象記述ＤＢ４０に含まれるか否かを判断する。ここで、func2は、図４（ｃ）に示すようにスタブ化対象外関数であるものとする。すなわち、func2は、スタブ化対象記述ＤＢ４０に含まれていないため、ステップＳ１４の判断は否定され、ステップＳ２６に移行する。
【００２３】
ステップＳ２６に移行すると、シンボリック実行部１２は、命令ｉのシンボリック実行を行いパス条件ｃを更新する（ここでは、a==0とする）。その後は、ステップＳ２８に移行し、シンボリック実行部１２は、プログラムの次命令が存在しないか否かを判断する。ここでは、次の命令が存在しているので、ステップＳ２８の判断は否定され、ステップＳ１２に戻る。
【００２４】
ステップＳ１２に戻ると、シンボリック実行部１２は、スタブ化前プログラム内の次命令ｉを読み出す。ここでは、シンボリック実行部１２は、図４（ａ）のテスト対象関数main2のfunc1を読み出したものとする。
【００２５】
次いで、ステップＳ１４では、スタブ化対象記述検出部１４が、シンボリック実行部１２から受信した命令ｉ（func1）がスタブ化対象記述ＤＢ４０に含まれるか否かを判断する。ここで、func1は、図４（ｂ）に示すようにスタブ化対象関数であるものとする。すなわち、func1は、スタブ化対象記述ＤＢ４０に含まれているため、ステップＳ１４の判断は肯定され、ステップＳ１６に移行する。
【００２６】
ステップＳ１６に移行すると、具体値入力生成部１６が、パス条件ｃ（a==0）を充足する具体値入力を生成する。ここでは、図５（ａ）に示すように、具体値（変数値）として、パス条件ｃ（a==0）を充足するａ＝０が生成される。
【００２７】
次いで、ステップＳ１８では、スタブ生成部１８が、具体値入力を用いて、処理部３０において命令ｉまでスタブ化前プログラムを実行する。この場合、図５（ｂ）に示すように、処理部３０では、func1(a)＝func1(0)＝falseという返却値が得られるので、処理部３０は、この返却値（false）をスタブ生成部１８に戻す。
【００２８】
次いで、ステップＳ２０では、スタブ生成部１８が、処理部３０による命令ｉの返却値（評価値）に基づいてスタブを生成する。この場合、スタブ生成部１８は、図６において太線枠で示すようなスタブ関数を生成する。次いで、ステップＳ２２では、スタブ挿入部２０が、生成されたスタブをプログラムに挿入する。なお、スタブ挿入部２０は、スタブ挿入後のプログラムをシンボリック実行部１２に送信する。
【００２９】
次いで、ステップＳ２４では、シンボリック実行部１２が、スタブ挿入後のプログラムを命令ｉまでシンボリック実行し、パス条件ｃを更新する。この場合、シンボリック実行部１２は、スタブ化前に実行し得ない記述、すなわち、図６において下線を付して示すif-if側の分岐内記述（print(“positive”)）を実行しないようにすることができる。また、シンボリック実行部１２は、パス条件ｃを、次のパス条件（a!=0）に更新する。
【００３０】
次いで、ステップＳ２８では、シンボリック実行部１２が、プログラムの次命令が存在しないか否かを判断するが、プログラムには、次命令が存在しているので、ステップＳ１２に再度戻る。
【００３１】
ステップＳ１２に戻ると、シンボリック実行部１２は、スタブ化前プログラム内の次命令ｉを読み出す。ここでは、シンボリック実行部１２は、図４（ａ）のテスト対象関数main2の下側のfunc1（else-if側のfunc1(a)）を読み出したものとする。
【００３２】
次いで、ステップＳ１４では、スタブ化対象記述検出部１４が、シンボリック実行部１２から受信した命令ｉ（func1）がスタブ化対象記述ＤＢ４０に含まれるか否かを判断する。ここで、func1は、スタブ化対象記述ＤＢ４０に含まれているため、ステップＳ１４の判断は肯定され、ステップＳ１６に移行する。
【００３３】
ステップＳ１６に移行すると、具体値入力生成部１６が、パス条件ｃ（a!=0）を充足する具体値入力を生成する。ここでは、一例として、図７（ａ）に示すように、具体値（変数値）として、パス条件ｃ（a!=0）を充足するａ＝１が生成されたものとする。
【００３４】
次いで、ステップＳ１８では、スタブ生成部１８が、具体値入力を用いて、処理部３０において命令ｉまでスタブ化前プログラムを実行する。この場合、図５（ｂ）に示すように、処理部３０では、func1(a)＝func1(1)＝trueという返却値が得られるので、処理部３０は、この返却値（true）をスタブ生成部１８に戻す。
【００３５】
次いで、ステップＳ２０では、スタブ生成部１８が、処理部３０による命令ｉの返却値（評価値）に基づいてスタブを生成する。この場合、スタブ生成部１８は、図８において太線枠で示すようなスタブ関数を生成する。次いで、ステップＳ２２では、スタブ挿入部２０が、生成されたスタブをプログラムに挿入し、該プログラムをシンボリック実行部１２に送信する。
【００３６】
次いで、ステップＳ２４では、シンボリック実行部１２が、スタブ挿入後のプログラムを命令ｉまでシンボリック実行し、パス条件ｃを更新する。ここで、シンボリック実行部１２は、図８において下線を付して示すelse-if側の分岐内記述（print(“positive”)）をシンボリック実行する。なお、この段階では、パス条件ｃは更新されずに、ステップＳ２８に移行する。
【００３７】
なお、パス条件ｃがa!=0の場合、例えば、具体値入力をａ＝−１とすることもできる（Ｓ１６）。このようにした場合、処理部３０からの返却値はfalseとなるので、シンボリック実行部１２は、else-else側の分岐内記述（print(“negative”)）を実行することになる（Ｓ２４）。
【００３８】
次いで、ステップＳ２８では、シンボリック実行部１２が、プログラムの次命令が存在しないか否かを判断するが、プログラムには、次命令が存在していないので、ステップＳ３０に移行する。
【００３９】
ステップＳ３０に移行した場合、シンボリック実行部１２は、スタブ化後プログラムを出力する。
【００４０】
ここで、本実施形態では、図９（ａ）において×印で示すように、スタブ化前に実行し得ない記述であるif-if側の分岐内記述が実行されることがなく、スタブ化前に実行可能な記述のみが実行されるようになっている。これにより、テスト結果において一定の信頼性を確保することができるようになる。なお、比較例としては、予めfunc1に対しては、trueなどの定数を返却するスタブを生成する技術がある。このような比較例では、func1に対してはtrueが返却されると、スタブ化前に実行し得ない記述であるif-if側の分岐内記述（図９（ａ）において×印で示す記述）が実行されてしまうため、テスト結果において信頼性が低くなるおそれがある。
【００４１】
また、本実施形態では、スタブ化対象記述の処理及び返却値の決定処理を一般的な処理系である処理部３０が実行するため、シンボリック実行部（シンボリック実行エンジン）が解析対象とできない記述も解析することが可能となる。この結果、図９（ｂ）に太線及び白抜きの線にて示すように、関数func1の記述を解析できずに、解析が停止してしまうのを防止することができる。なお、図９（ｂ）のように解析が停止した場合、解析を継続するためには、func1のスタブを手動で記述する必要があるが、本実施形態では、このような人手の介入が不要である。
【００４２】
以上、詳細に説明したように、本実施形態によると、スタブ化対象記述検出部１４がシンボリック実行によるテスト対象のプログラムに含まれるスタブ化対象記述を検出し（Ｓ１４：肯定）、具体値入力生成部１６が、スタブ化対象記述が実行される際のパス条件を充足する変数値を生成し（Ｓ１６）、スタブ生成部１８が、生成された変数値を用いてスタブ化対象記述を処理部３０に実行させ、処理部３０からの返却値に基づいてスタブを生成し（Ｓ１８、Ｓ２０）、スタブ挿入部２０が、スタブ化対象記述を生成されたスタブで置換する（プログラムにスタブを挿入する）（Ｓ２２）。これにより、プログラム実行時のパス条件を考慮したスタブが生成されるので、スタブ化前プログラムで実行可能な記述のみが実行され、スタブ化前プログラムでは実行され得ない記述が実行されるのを防止することができる。これにより、テスト結果の信頼性の低下を抑制することが可能である。また、処理部３０にスタブ化対象記述を実行させ、スタブを自動生成し、スタブ化後のプログラムをシンボリック実行部１２がシンボリック実行するため、シンボリック実行部１２による解析が停止することがなくなる。これにより、人手によるスタブの記述の手間を省くことが可能となる。
【００４３】
また、本実施形態では、スタブ化対象記述検出部１４は、スタブ化する必要のある記述（スタブ化対象記述）を格納したスタブ化対象記述ＤＢ４０に基づいて、プログラム中の記述がスタブ化対象記述であるかを判断する。これにより、簡易に、スタブ化対象記述であるかどうかの判断を行うことができる。
【００４４】
なお、上記実施形態では、情報処理装置１０が処理部３０を有する場合について説明したが、これに限らず、情報処理装置１０とネットワーク等により接続された外部の装置が処理部３０と同等の機能を有していてもよい。
【００４５】
なお、上記の処理機能は、コンピュータによって実現することができる。その場合、処理装置が有すべき機能の処理内容を記述したプログラムが提供される。そのプログラムをコンピュータで実行することにより、上記処理機能がコンピュータ上で実現される。処理内容を記述したプログラムは、コンピュータで読み取り可能な記録媒体（ただし、搬送波は除く）に記録しておくことができる。
【００４６】
プログラムを流通させる場合には、例えば、そのプログラムが記録されたＤＶＤ（Digital Versatile Disc）、ＣＤ−ＲＯＭ（Compact Disc Read Only Memory）などの可搬型記録媒体の形態で販売される。また、プログラムをサーバコンピュータの記憶装置に格納しておき、ネットワークを介して、サーバコンピュータから他のコンピュータにそのプログラムを転送することもできる。
【００４７】
プログラムを実行するコンピュータは、例えば、可搬型記録媒体に記録されたプログラムもしくはサーバコンピュータから転送されたプログラムを、自己の記憶装置に格納する。そして、コンピュータは、自己の記憶装置からプログラムを読み取り、プログラムに従った処理を実行する。なお、コンピュータは、可搬型記録媒体から直接プログラムを読み取り、そのプログラムに従った処理を実行することもできる。また、コンピュータは、サーバコンピュータからプログラムが転送されるごとに、逐次、受け取ったプログラムに従った処理を実行することもできる。
【００４８】
上述した実施形態は本発明の好適な実施の例である。但し、これに限定されるものではなく、本発明の要旨を逸脱しない範囲内において種々変形実施可能である。
【００４９】
なお、以上の実施形態の説明に関して、更に以下の付記を開示する。
（付記１）  シンボリック実行によるテスト対象のプログラムに含まれるスタブ化対象の記述を検出し、
検出された前記スタブ化対象の記述が実行される際のパス条件を充足する変数値を設定し、
設定された前記変数値を用いて前記スタブ化対象の記述を情報処理部に実行させ、該情報処理部からの返却値に基づいてスタブを生成し、
前記テスト対象のプログラムの前記スタブ化対象の記述を前記スタブで置換する、処理をコンピュータが実行するスタブ化方法。
（付記２）  前記検出する処理では、スタブ化する必要のある記述を格納した格納部に基づいて、前記テスト対象のプログラムの中から前記スタブ化対象の記述を検出することを特徴とする付記１に記載のスタブ化方法。
（付記３）  シンボリック実行によるテスト対象のプログラムに含まれるスタブ化対象の記述を検出し、
検出された前記スタブ化対象の記述が実行される際のパス条件を充足する変数値を設定し、
設定された前記変数値を用いて前記スタブ化対象の記述を情報処理部に実行させ、該情報処理部からの返却値に基づいてスタブを生成し、
前記テスト対象のプログラムの前記スタブ化対象の記述を前記スタブで置換する、処理をコンピュータに実行させるスタブ化プログラム。
（付記４）  前記検出する処理では、スタブ化する必要のある記述を格納した格納部に基づいて、前記テスト対象のプログラムの中から前記スタブ化対象の記述を検出することを特徴とする付記３に記載のスタブ化プログラム。
（付記５）  シンボリック実行によるテスト対象のプログラムに含まれるスタブ化対象の記述を検出する検出部と、
前記検出部が検出した前記スタブ化対象の記述が実行される際のパス条件を充足する変数値を設定する設定部と、
前記設定部が設定した前記変数値を用いて前記スタブ化対象の記述を情報処理部に実行させ、該情報処理部からの返却値に基づいてスタブを生成する生成部と、
前記テスト対象のプログラムの前記スタブ化対象の記述を前記スタブで置換する置換部と、を備えるスタブ化装置。
（付記６）  スタブ化する必要のある記述を格納した格納部を更に備え、
前記検出部は、前記格納部に基づいて、前記テスト対象のプログラムの中から前記スタブ化対象の記述を検出することを特徴とする付記５に記載のスタブ化装置。
【符号の説明】
【００５０】
１０  情報処理装置（スタブ化装置）
１４  スタブ化対象記述検出部（検出部）
１６  具体値入力生成部（設定部）
１８  スタブ生成部（生成部）
２０  スタブ挿入部（置換部）
３０  処理部（情報処理部）
４０  スタブ化対象記述ＤＢ（格納部）
【図１】
0006503724.tif 000002
【図２】
0006503724.tif 000003
【図３】
0006503724.tif 000004
【図４】
0006503724.tif 000005
【図５】
0006503724.tif 000006
【図６】
0006503724.tif 000007
【図７】
0006503724.tif 000008
【図８】
0006503724.tif 000009
【図９】
0006503724.tif 000010