(57)【要約】【課題】分析対象のプログラムのうちバグが存在する行のリスクが増大するように各行のリスクを算出する。【解決手段】テストケース毎に与えられたテスト条件に従って分析対象のプログラムのテストをテストケース毎に実行することを、テストケース毎のテスト結果(成功／失敗)及び分析対象のプログラムの各行毎の実行回数を記録しながら行い、テストケース毎のテスト結果及び分析対象のプログラムの各行毎の実行回数に基づいて、分析対象のプログラムの各行と実行回数の組毎(図の各行毎)にリスクを算出する。これにより、バグの存在する行とバグが顕在化する実行回数の組(図の例では行＝Ｓ５と実行回数＝１０１回の組)のリスクが増大し、バグの抽出が容易になる。【選択図】図１０
2014182451.tif 000002
【特許請求の範囲】
【請求項１】
テストケース毎に与えられたテスト条件に従って分析対象のプログラムのテストをテストケース毎に実行することを、テストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況を記録しながら行うテストケース実行部と、
前記テストケース実行部によって記録されたテストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況に基づいて、前記分析対象のプログラムの各行と実行状況の組毎にリスクを算出するリスク算出部と、
を含むプログラム分析装置。
【請求項２】
前記テストケース実行部は、前記分析対象のプログラムの各行毎の実行状況として、個々のテストケースにおける前記分析対象のプログラムの各行毎の実行回数を記録し、
前記リスク算出部は、前記分析対象のプログラムの各行と前記実行回数の組毎にリスクを算出する請求項１記載のプログラム分析装置。
【請求項３】
前記テストケース実行部は、前記分析対象のプログラムの各行毎の実行状況として、個々のテストケースにおける前記分析対象のプログラムの各行毎に、どのような条件で前記分析対象のプログラムの分岐を通ってきたかを表すパス条件を記録し、
前記リスク算出部は、前記分析対象のプログラムの各行と前記パス条件の組毎にリスクを算出する請求項１記載のプログラム分析装置。
【請求項４】
前記リスク算出部によって前記分析対象のプログラムの各行と実行状況の組毎に算出されたリスクを、当該リスクの降順にソートして出力する出力部を更に備えた請求項１〜請求項３の何れか１項記載のプログラム分析装置。
【請求項５】
テストケース毎に与えられたテスト条件に従って分析対象のプログラムのテストをテストケース毎に実行することを、テストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況を記録しながら行い、
記録したテストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況に基づいて、前記分析対象のプログラムの各行と実行状況の組毎にリスクを算出する
ことを含むプログラム分析方法。
【請求項６】
コンピュータに、
テストケース毎に与えられたテスト条件に従って分析対象のプログラムのテストをテストケース毎に実行することを、テストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況を記録しながら行い、
記録したテストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況に基づいて、前記分析対象のプログラムの各行と実行状況の組毎にリスクを算出する
ことを含む処理を実行させるためのプログラム分析プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はプログラム分析装置、プログラム分析方法及びプログラム分析プログラムに関する。
【背景技術】
【０００２】
従来より、プログラムに対してテストを行うことで、プログラムに存在しているバグの抽出を可能とする技術が知られている。例えば第１の技術として、被テストプログラムに対するオペレータの操作手順データを記録し、操作手順データより入力操作の入力項目を抽出し、入力項目毎に入力値を設定し、入力値の組み合せより複数のテストケースを自動生成する技術が開示されている。第１の技術では、自動生成した各テストケース毎の新しい操作手順データを作成して被テストプログラムのテストを行い、各テストケース毎にテスト結果を評価している。
【０００３】
また、第２の技術として、被テストプログラムに対して複数のテストケースを実施し、個々のテストケースの結果(成功／失敗)を行単位に記録する技術が開示されている。但し、第１の技術及び第２の技術はプログラムの各行のリスクを算出することについては開示されていない。
【０００４】
一方、第３の技術として、複数のテストケースを用意してプログラムのテストを実行し、テストの成功/失敗を記録し、個々の行において成功したテストケース数と、失敗したテストケース数の割合を計算し、各行におけるリスクを算出する技術が提案されている。第３の技術では、算出されたリスクが高い行が、バグが存在している箇所の候補としてテスト者によって精査される。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０００−１１２７８４号公報
【特許文献２】特開昭６２−２１６０４７号公報
【非特許文献】
【０００６】
【非特許文献１】”Empirical Evaluation of the arantula Automatic Fault Localization Technique”、[online]、[平成２５年１月２３日検索]、インターネット＜ＵＲＬ：http://pleuma.cc.gatech.edu/aristotle/Publications/Papers/ase05.pdf＞
【発明の概要】
【発明が解決しようとする課題】
【０００７】
図２１には、第３の技術を適用してプログラムのテストを行って評価した結果の一例を示す。図２１には、テスト対象のプログラムとして１３行のプログラムが示され、入力値ｘ,ｙ,ｚの値の組み合わせが互いに異なる６個のテストケースが６個の列として示されている。図２１の表に示されている"●"は個々のテストケースで通った行に付されており、各テストケースの下端に表記されているＰ／Ｆは、Ｐがテスト結果が成功、Ｆがテスト結果が失敗であることを表す。テスト結果から各行毎にリスクが算出される。例えば行ＳｎのリスクＲｉｓｋは次式で算出される。
【０００８】
Ｒｉｓｋ＝(Ｆ(Ｓｎ)／Ｆ(Ａｌｌ))／(Ｆ(Ｓｎ)／Ｆ(Ａｌｌ)＋Ｐ(Ｓｎ)／Ｐ(Ａｌｌ))
【０００９】
なお、Ｐ(Ｓｎ)は行Ｓｎを通りテスト結果が成功のテストケースの数、Ｆ(Ｓｎ)は行Ｓｎを通りテスト結果が失敗のテストケースの数、Ｐ(Ａｌｌ)はテスト結果が成功のテストケースの総数、Ｆ(Ａｌｌ)はテスト結果が失敗のテストケースの総数である。そして、算出されたリスクの高い行ほどバグが存在している可能性が高い行と認識される。
【００１０】
しかしながら、上記技術ではバグが存在する行のリスクが高くならないことがある。例えば図２２(Ａ)に示すように行Ｓ６にバグが存在するプログラムに対してテストを実行した場合、図２２(Ｂ)に示すように、入力値ａ＝０〜99の各テストケースではテスト結果が成功となり、入力値ａ＝100のテストケースでのみテスト結果が失敗となる。このため、行Ｓ６のリスクは他の行と等しい"0.5"となり、図２２(Ａ)に示すプログラムに対して行Ｓ６をバグが存在している可能性が高い行と認識することは困難である。
【００１１】
また、図２３(Ａ)に示すように行Ｓ７にバグが存在するプログラムに対してテストを実行した場合、図２３(Ｂ)に示すように、入力値ａ＝1,0,-1の各テストケースのうち入力値ａ＝0のテストケースでのみテスト結果が失敗となる。そして、行Ｓ７のリスクは行Ｓ１〜３,５と等しい"0.5"となり、図２３(Ａ)に示すプログラムに対して行Ｓ７をバグが存在している可能性が高い行と認識することは困難である。
【００１２】
一つの側面では、本発明は、分析対象のプログラムのうちバグが存在する行のリスクが増大するように各行のリスクを算出することを目的とする。
【課題を解決するための手段】
【００１３】
一つの形態では、テストケース実行部により、テストケース毎に与えられたテスト条件に従って分析対象のプログラムのテストをテストケース毎に実行することが、テストケース毎のテスト結果及び分析対象のプログラムの各行毎の実行状況を記録しながら行われる。そして、リスク算出部は、テストケース実行部によって記録されたテストケース毎のテスト結果及び分析対象のプログラムの各行毎の実行状況に基づいて、分析対象のプログラムの各行と実行状況の組毎にリスクを算出する。
【発明の効果】
【００１４】
分析対象のプログラムのうちバグが存在する行のリスクが増大するように各行のリスクを算出できる、という効果を有する。
【図面の簡単な説明】
【００１５】
【図１】実施形態に係るプログラム分析装置の機能ブロック図である。
【図２】プログラム分析装置として機能することが可能なコンピュータの概略ブロック図である。
【図３】プログラム分析処理のフローチャートである。
【図４】第１実施形態に係るテストケース実行処理のフローチャートである。
【図５】第１実施形態に係るリスク算出処理のフローチャートである。
【図６】第１実施形態における、(Ａ)は分析対象のプログラムの一例を示すリスト、(Ｂ)はテストケースセットの一例を示す図表である。
【図７】第１実施形態における、(Ａ)はテストケース実行結果の一例、(Ｂ)は実行トレース情報の一例を示す図表である。
【図８】第１実施形態における実行状況情報の一例を示す図表である。
【図９】第１実施形態におけるテストケース数集計情報の一例を示す図表である。
【図１０】第１実施形態における処理実行結果の一例を示す図表である。
【図１１】第１実施形態におけるリスク情報の一例を示す図表である。
【図１２】第１実施形態におけるレポート出力結果の一例を示す図表である。
【図１３】第２実施形態に係るテストケース実行処理のフローチャートである。
【図１４】第２実施形態に係るリスク算出処理のフローチャートである。
【図１５】第２実施形態における、(Ａ)は分析対象のプログラムの一例を示すリスト、(Ｂ)はテストケースセットの一例を示す図表である。
【図１６】第２実施形態における、(Ａ)はテストケース実行結果の一例、(Ｂ)は実行状況情報の一例を示す図表である。
【図１７】第２実施形態におけるテストケース数集計情報の一例を示す図表である。
【図１８】第２実施形態における処理実行結果の一例を示す図表である。
【図１９】第２実施形態におけるリスク情報の一例を示す図表である。
【図２０】第２実施形態におけるレポート出力結果の一例を示す図表である。
【図２１】先行技術におけるテスト結果の一例を示す図表である。
【図２２】先行技術における、(Ａ)はテスト対象のプログラムの一例を示すリスト、(Ｂ)はテスト結果の他の例を示す図表である。
【図２３】先行技術における、(Ａ)はテスト対象のプログラムの一例を示すリスト、(Ｂ)はテスト結果の他の例を示す図表である。
【発明を実施するための形態】
【００１６】
以下、図面を参照して開示の技術の実施形態の一例を詳細に説明する。
【００１７】
〔第１実施形態〕
図１には、本第１実施形態に係るプログラム分析装置１０が示されている。プログラム分析装置１０は、分析対象のプログラムに対し予め設定されたテストケースのテストを実行し、実行結果からリスクを演算して出力することで、分析対象のプログラムのうちバグが存在している行の特定を容易にする装置である。プログラム分析装置１０は、第１記憶部１２、テストケース実行部１４、第２記憶部１６、リスク算出部１８及び出力部２０を備えている。
【００１８】
第１記憶部１２は、分析対象のプログラム２２と、予め設定されたテストケースを表すテストケースセット２４と、を記憶している。テストケースセット２４は、個々のテストケース毎に、テストケースのＩＤと、テスト条件(変数の入力値)を含んでいる。なお、テストケースの設定は、人手で行ってもよいし、ツールによって自動的に生成することも可能である。
【００１９】
テストケース実行部１４は、テストケースセット２４が表すテストケース毎のテスト条件に従って分析対象のプログラム２２のテストをテストケース毎に実行する。またテストケース実行部１４は、分析対象のプログラム２２のテストを行いながら、テストケース毎のテスト結果をテストケース実行結果２６として、分析対象のプログラムの各行毎の実行状況を実行状況情報２８として、各々第２記憶部１６に記録する。
【００２０】
リスク算出部１８は、テストケース実行部１４によって第２記憶部１６に記録されたテストケース実行結果２６及び実行状況情報２８に基づいて、分析対象のプログラム２２の各行と実行状況の組毎にリスクを算出する。出力部２０は、リスク算出部１８によって算出されたリスクをソートし、ソート結果をリストとして出力する。
【００２１】
プログラム分析装置１０は、例えば図２に示すコンピュータ３０で実現することができる。コンピュータ３０はＣＰＵ３２、メモリ３４、不揮発性の記憶部３６、入力部３８、表示部４０を備えている。ＣＰＵ３２、メモリ３４、記憶部３６、入力部３８、表示部４０はバス４２を介して互いに接続されている。
【００２２】
記憶部３６はＨＤＤ(Hard Disk Drive)やフラッシュメモリ等によって実現できる。記憶部３６には、分析対象プログラム２２及びテストケースセット２４が記憶されており、テストケース実行結果２６及び実行状況情報２８が記憶される。従って、記憶部３６は第１記憶部１２及び第２記憶部１６として機能する。また、記録媒体としての記憶部３６には、コンピュータ３０をプログラム分析装置１０として機能させるためのプログラム分析プログラム４６が記憶されている。ＣＰＵ３２は、プログラム分析プログラム４６を記憶部３６から読み出してメモリ３４に展開し、プログラム分析プログラム４６が有するプロセスを順次実行する。
【００２３】
プログラム分析プログラム４６は、テストケース実行プロセス４８、リスク算出プロセス５０及び出力プロセス５２を有する。ＣＰＵ３２は、テストケース実行プロセス４８を実行することで、図１に示すテストケース実行部１４として動作する。またＣＰＵ３２は、リスク算出プロセス５０を実行することで、図１に示すリスク算出部１８として動作する。またＣＰＵ３２は、出力プロセス５２を実行することで、図１に示す出力部２０として動作する。
【００２４】
これにより、プログラム分析プログラム４６を実行したコンピュータ３０が、プログラム分析装置１０として機能することになる。なお、プログラム分析プログラム４６は開示の技術におけるプログラム分析プログラムの一例である。また、コンピュータ３０としてはパーソナル・コンピュータ(ＰＣ：Personal Computer)が好適であるが、コンピュータ３０はサーバ・コンピュータ等であってもよい。
【００２５】
なお、プログラム分析装置１０は、例えば半導体集積回路、より詳しくはＡＳＩＣ(Application Specific Integrated Circuit)等で実現することも可能である。
【００２６】
次に本第１実施形態の作用を説明する。なお、第１実施形態では、開示の技術における分析対象のプログラムの各行毎の実行状況の一例として、分析対象プログラム２２の各行毎の実行回数を適用した態様を説明する。
【００２７】
まず、分析対象プログラム２２の一例を図６(Ａ)に示す。図６(Ａ)に示す分析対象プログラムは行Ｓ０〜Ｓ６の７行のプログラムで、行Ｓ６に、変数ｉ＝100になったときに０割演算をしてしまう、というバグが存在している。また、第１実施形態におけるテストケースセット２４の一例を図６(Ｂ)に示す。図６(Ｂ)に示すテストケースセット２４は、テストケースＩＤ＝T001〜T101の101個のテストケースを含み、各テストケースは変数ａの値が互いに相違されている(ａ＝0〜100)。
【００２８】
分析対象プログラム２２及びテストケースセット２４が第１記憶部１２に記憶されている状態で、分析対象プログラム２２に対する分析の実行が指示されると、プログラム分析プログラム４６が実行されることで図３に示すプログラム分析処理が行われる。プログラム分析処理では、まずステップ６０において、テストケース実行部１４によってテストケース実行処理が行われる。以下、図４を参照し、テストケース実行部１４によって行われるテストケース実行処理を説明する。
【００２９】
テストケース実行処理のステップ７０において、テストケース実行部１４は、第１記憶部１２に記憶されているテストケースセット２４から未実行のテストケースを１つ選択する。次のステップ７２において、テストケース実行部１４は、第１記憶部１２に記憶されている分析対象プログラム２２に対し、選択したテストケースに対応するテストを、実行状況情報として実行トレース情報をメモリ３４に記録しながら実行する。一例として図７(Ｂ)に示すように、実行トレース情報１００は、個々のテストケースに対応するテストにおいて、分析対象プログラム２２のうち実行した行を順に記録した情報である。テストケース実行部１４は、分析対象プログラム２２のテストに際し、テスト対象の行が切り替わる度にテスト対象の行の情報をメモリ３４に記録する。これにより、図７(Ｂ)に示すような実行トレース情報１００が記録される。
【００３０】
次のステップ７４において、テストケース実行部１４は、ステップ７０で選択したテストケースに対応するテストの実行が終了したか否か判定する。ステップ７４の判定が否定された場合はステップ７２に戻り、ステップ７４の判定が肯定される迄、ステップ７２,７４を繰り返す。ステップ７０で選択したテストケースに対応するテストの実行が終了すると、ステップ７４の判定が肯定されてステップ７６へ移行する。
【００３１】
ステップ７６において、テストケース実行部１４は、選択したテストケースに対応するテスト実行結果(成功又は失敗)を判定し、判定結果をテストケース実行結果２６として第２記憶部１６に記憶させる。図７(Ａ)に示すように、テストケース実行結果２６は、個々のテストケースに対応するテストの実行結果を、対応するテストケースのＩＤと対応付けて登録した情報である。
【００３２】
次のステップ７８において、テストケース実行部１４は、メモリ３４に記録した実行トレース情報１００に基づいて、分析対象プログラム２２の各行が何回実行されたかを実行状況情報２８として集計し、集計した実行状況情報２８を第２記憶部１６に記憶させる。図８に示すように、実行状況情報２８は、分析対象プログラム２２の各行毎の実行回数がテストケース毎に記録され、テストケースＩＤ及び行を識別する情報と対応付けられている。
【００３３】
次のステップ８０において、テストケース実行部１４は、第１記憶部１２に記憶されたテストケースセット２４に含まれる全てのテストケースを実行したか否か判定する。ステップ８０の判定が否定された場合はステップ７０に戻り、ステップ８０の判定が肯定される迄ステップ７０〜ステップ８０を繰り返す。これにより、テストケースセット２４に含まれる全てのテストケースに対応するテストが順次行われ、各テストケースに対応するテストケース実行結果２６及び実行状況情報２８が第２記憶部１６に各々記憶される。
【００３４】
ステップ８０の判定が肯定されると、テストケース実行処理を終了し、図３のステップ６２へ移行する。図３のステップ６２では、リスク算出部１８によってリスク算出処理が行われる。以下、図５を参照し、リスク算出部１８によって行われるリスク算出処理を説明する。
【００３５】
リスク算出処理のステップ８４において、リスク算出部１８は、第２記憶部１６に記憶されているテストケース実行結果２６から、実行結果が「成功」の成功テストケース数Ｐ(All)と実行結果が「失敗」の失敗テストケース数Ｆ(All)を算出する。例えばテストケース実行結果２６が図７(Ａ)に示す内容の場合、成功テストケース数Ｐ(All)＝100、失敗テストケース数Ｆ(All)＝1が算出される。
【００３６】
次のステップ８６において、リスク算出部１８は、第２記憶部１６に記憶されている実行状況情報２８から１レコードを選択する。これにより、例として図８に示すように、或るテストケースにおける、或る行の実行回数を表すデータ(レコード)が選択される。次のステップ８８において、リスク算出部１８は、選択したレコードの「テストケースＩＤ」のテストケースが、テストケース実行結果２６で実行結果が「成功」になっているか否か判定する。
【００３７】
ステップ８８の判定が肯定された場合はステップ９０へ移行する。ステップ９０において、リスク算出部１８は、ステップ８６で選択したレコードの「行」と「実行回数」の組に対応する成功テストケース数Ｐ(行,実行回数)をテストケース数集計情報１０２から探索して１を加算する。図９に示すように、テストケース数集計情報１０２は、分析対象プログラム２２の行と実行回数の組毎に、成功テストケース数Ｐ(行,実行回数)と失敗テストケース数Ｆ(行,実行回数)が設定されている(個々のテストケース数の初期値は０)。例えば、選択したレコードの行がＳ１、実行回数が１回、テストケースの実行結果が「成功」の場合、テストケース数集計情報１０２のうち対応する成功テストケース数Ｐ(Ｓ１,１)に１が加算される。
【００３８】
一方、ステップ８８の判定が否定された場合はステップ９２へ移行する。ステップ９２において、リスク算出部１８は、ステップ８６で選択したレコードの「行」と「実行回数」の組に対応する失敗テストケース数Ｆ(行,実行回数)をテストケース数集計情報１０２から探索して１を加算する。例えば、選択したレコードの行がＳ３、実行回数が１０１回、テストケースの実行結果が「失敗」の場合、テストケース数集計情報１０２のうち対応する失敗テストケース数Ｆ(Ｓ３,１０１)に１が加算される。
【００３９】
ステップ９０又はステップ９２の処理を行うとステップ９４へ移行する。ステップ９４において、リスク算出部１８は、実行状況情報２８に含まれる全てのレコードを選択して処理したか否か判定する。ステップ９４の判定が否定された場合はステップ８６に戻り、ステップ９４の判定が肯定される迄ステップ８６〜ステップ９４を繰り返す。これにより、実行状況情報２８に含まれる全てのレコードが順次選択され、各レコードに設定された情報に応じてテストケース数集計情報１０２が更新される。
【００４０】
ステップ９４の判定が肯定されるとステップ９６へ移行し、ステップ９６において、リスク算出部１８は、テストケース数集計情報１０２に設定されている「行」と「実行回数」の組毎にリスクＲＩＳＫを算出し、リスク情報１０４(図１１参照)として記録する。なお、行Ｓｎの特定の実行回数毎のリスクＲｉｓｋは次式で算出できる。
Ｒｉｓｋ＝(Ｆ(Ｓｎ)／Ｆ(Ａｌｌ))／(Ｆ(Ｓｎ)／Ｆ(Ａｌｌ)＋Ｐ(Ｓｎ)／Ｐ(Ａｌｌ))
但し、Ｐ(Ｓｎ)は行Ｓｎを通りテスト結果が成功のテストケースの数、Ｆ(Ｓｎ)は行Ｓｎを通りテスト結果が失敗のテストケースの数、Ｐ(Ａｌｌ)はテスト結果が成功のテストケースの総数、Ｆ(Ａｌｌ)はテスト結果が失敗のテストケースの総数である。
【００４１】
図１０には、「行」と「実行回数」の組毎に、個々のテストケースにおける実行の有無を"○"の有無で示すと共に、リスクＲＩＳＫの演算結果を併せて示す。また図１１にはリスク情報１０４の一例を示す。図１０,１１に示すように、「行」と「実行回数」の組毎にリスクを演算することで、行Ｓ３と実行回数＝１０１回の組や、行Ｓ４と実行回数＝１０１回の組、行Ｓ５と実行回数＝１０１回の組、行Ｓ６と実行回数＝１０１回の組はリスクが高い値になっている。一方、行Ｓ３,Ｓ４,Ｓ５,Ｓ６と実行回数＝１０１回以外の回数の組はリスクが０になっており、バグの存在しない行Ｓ１,Ｓ２もリスクが0.5と低い値に抑えられている。
【００４２】
ステップ９６でリスクを算出するとリスク算出処理を終了し、図３のステップ６４へ移行する。図３のステップ６４において、出力部２０は、リスク算出部１８によって算出されたリスクを降順にソートし、例として図１２に示すようなレポート１０６として出力する。ステップ６４の処理を行うとプログラム分析処理を終了する。
【００４３】
テスト者は、出力部２０によって出力されたレポートを参照することで、分析対象プログラム２２に存在するバグを容易に抽出することができる。例えば図１２に示すレポート１０６が出力された場合、テスト者は、分析対象プログラム２２のうち行Ｓ４やＳ５,Ｓ３,Ｓ６辺りに、実行回数＝１０１回のときに実行結果が失敗となるバグが存在しているらしいことを容易に把握できる。このため、分析対象プログラム２２を参照することで、分析対象プログラム２２のうちの行Ｓ５に、実行回数＝１０１回のときに不具合が生ずるバグが存在していることを容易に認識することができる。
【００４４】
上記のように、本第１実施形態では、分析対象プログラム２２の各行毎の実行状況として各行の実行回数を記録し、分析対象プログラム２２の「行」と「実行回数」の組毎にリスクを演算している。これにより、分析対象プログラム２２のうちバグの存在する行のリスクが高くならないことが抑止され、バグの存在する行とバグが顕在化する実行回数の組のリスクが高くなることで、バグの存在する行がバグの存在する可能性の高い行として認識される。従って、本第１実施形態では、分析対象プログラム２２のうちバグが存在する行のリスクが増大するように各行のリスクを算出することができ、バグの存在する行をテスト者に容易に認識させることができる。
【００４５】
〔第２実施形態〕
次に開示の技術の第２実施形態について説明する。なお、第２実施形態は第１実施形態と同一の構成であるので、各部分に同一の符号を付して構成の説明を省略し、以下、本第２実施形態の作用を説明する。なお、第２実施形態では、開示の技術における分析対象のプログラムの各行毎の実行状況の一例として、分析対象プログラム２２の各行毎のパス条件を適用した態様を説明する。
【００４６】
本第２実施形態における分析対象プログラム２２の一例を図１５(Ａ)に示す。図１５(Ａ)に示す分析対象プログラムは行Ｓ１〜Ｓ７の７行のプログラムで、行Ｓ７に、変数ａ＝0のときに０割演算をしてしまう、というバグが存在している。また、第２実施形態におけるテストケースセット２４の一例を図１５(Ｂ)に示す。図１５(Ｂ)に示すテストケースセット２４は、テストケースＩＤ＝T2001〜T2003の３個のテストケースを含み、各テストケースは変数ａの値が互いに相違されている(ａ＝1,0,-1)。
【００４７】
以下、図１３を参照し、本第２実施形態に係るテストケース実行処理を説明する。テストケース実行処理のステップ７０において、テストケース実行部１４は、第１記憶部１２に記憶されているテストケースセット２４から未実行のテストケースを１つ選択する。次のステップ７３において、テストケース実行部１４は、第１記憶部１２に記憶されている分析対象プログラム２２に対し、選択したテストケースに対応するテストを、パス条件を含む実行状況情報をメモリ３４に記録しながら実行する。
【００４８】
一例として図１６(Ｂ)に示すように、実行状況情報２８は、個々のテストケースに対応するテストにおいて、分析対象プログラム２２のうち実行した行と実行した行のパス条件を記録した情報である。パス条件は、分析対象プログラム２２のテストにおいて、どのような条件で分析対象プログラム２２の分岐を通ってきたかを表す情報である。例えば図１６(Ｂ)の実行状況情報２８におけるＩＤ＝T2001のテストケースのパス条件は、行Ｓ３で変数ａが０より大きいか否かの判定(図１５(Ａ)参照)が「肯定」となることで、行Ｓ３以降に"α＞０"(αは変数ａの値)のパス条件が記録される。また、行Ｓ５で変数ａが０より小さいか否かの判定(図１５(Ａ)参照)が「否定」となることで、行Ｓ３以降に"not(α＞０)"のパス条件が記録される。
【００４９】
テストケース実行部１４は、分析対象プログラム２２のテストに際し、テスト対象の行が切り替わる度にテスト対象の行の情報及びパス条件をメモリ３４に記録する。これにより、図１６(Ｂ)に示すような実行状況情報２８が記録される。なお、パス条件の記録には、公知のパス条件収集技術(例えばJava PathFinder等、インターネット＜ＵＲＬ：http://babelfish.arc.nasa.gov/trac/jpf＞参照)を適用したツールを利用することができる。
【００５０】
次のステップ７４において、テストケース実行部１４は、ステップ７０で選択したテストケースに対応するテストの実行が終了したか否か判定する。ステップ７４の判定が否定された場合はステップ７３に戻り、ステップ７４の判定が肯定される迄、ステップ７３,７４を繰り返す。ステップ７０で選択したテストケースに対応するテストの実行が終了すると、ステップ７４の判定が肯定されてステップ７６へ移行する。
【００５１】
ステップ７６において、テストケース実行部１４は、選択したテストケースに対応するテスト実行結果(成功又は失敗)を判定し、判定結果をテストケース実行結果２６として第２記憶部１６に記憶させる。図１６(Ａ)に示すように、テストケース実行結果２６は、個々のテストケースに対応するテストの実行結果を、対応するテストケースのＩＤと対応付けて登録した情報である。
【００５２】
次のステップ８０において、テストケース実行部１４は、第１記憶部１２に記憶されたテストケースセット２４に含まれる全てのテストケースを実行したか否か判定する。ステップ８０の判定が否定された場合はステップ７０に戻り、ステップ８０の判定が肯定される迄ステップ７０〜ステップ８０を繰り返す。これにより、テストケースセット２４に含まれる全てのテストケースに対応するテストが順次行われ、各テストケースに対応するテストケース実行結果２６及び実行状況情報２８が第２記憶部１６に各々記憶される。ステップ８０の判定が肯定されると、テストケース実行処理を終了する。
【００５３】
次に図１４を参照し、本第２実施形態に係るリスク算出処理を説明する。リスク算出処理のステップ８４において、リスク算出部１８は、第２記憶部１６に記憶されているテストケース実行結果２６から、実行結果が「成功」の成功テストケース数Ｐ(All)と実行結果が「失敗」の失敗テストケース数Ｆ(All)を算出する。例えばテストケース実行結果２６が図１６(Ａ)に示す内容の場合、成功テストケース数Ｐ(All)＝2、失敗テストケース数Ｆ(All)＝1が算出される。
【００５４】
次のステップ８６において、リスク算出部１８は、第２記憶部１６に記憶されている実行状況情報２８から１レコードを選択する。これにより、例として図１６(Ｂ)に示すように、或るテストケースにおける或る行のパス条件を表すデータ(レコード)が選択される。次のステップ８８において、リスク算出部１８は、選択したレコードの「テストケースＩＤ」のテストケースが、テストケース実行結果２６で実行結果が「成功」になっているか否か判定する。
【００５５】
ステップ８８の判定が肯定された場合はステップ９１へ移行する。ステップ９０において、リスク算出部１８は、ステップ８６で選択したレコードの「行」と「パス条件」の組に対応する成功テストケース数Ｐ(行,実行回数)をテストケース数集計情報１０８から探索して１を加算する。図１７に示すように、本第２実施形態に係るテストケース数集計情報１０２は、分析対象プログラム２２の行とパス条件の組毎に、成功テストケース数Ｐ(行,パス条件)と失敗テストケース数Ｆ(行,パス条件)が設定されている(個々のテストケース数の初期値は０)。例えば、選択したレコードの行がＳ３、パス条件が"α＞0"、テストケースの実行結果が「成功」の場合、テストケース数集計情報１０８のうち対応する成功テストケース数Ｐ(Ｓ３, α＞0)に１が加算される。
【００５６】
一方、ステップ８８の判定が否定された場合はステップ９３へ移行する。ステップ９３において、リスク算出部１８は、ステップ８６で選択したレコードの「行」と「パス条件」の組に対応する失敗テストケース数Ｆ(行,パス条件)をテストケース数集計情報１０８から探索して１を加算する。例えば、選択したレコードの行がＳ３、パス条件が"not(α＞0)"、テストケースの実行結果が「失敗」の場合、テストケース数集計情報１０８のうち対応する失敗テストケース数Ｆ(Ｓ３, not(α＞0))に１が加算される。
【００５７】
ステップ９１又はステップ９３の処理を行うとステップ９４へ移行する。ステップ９４において、リスク算出部１８は、実行状況情報２８に含まれる全てのレコードを選択して処理したか否か判定する。ステップ９４の判定が否定された場合はステップ８６に戻り、ステップ９４の判定が肯定される迄ステップ８６〜ステップ９４を繰り返す。これにより、実行状況情報２８に含まれる全てのレコードが順次選択され、各レコードに設定された情報に応じてテストケース数集計情報１０８が更新される。
【００５８】
ステップ９４の判定が肯定されるとステップ９７へ移行し、ステップ９７において、リスク算出部１８は、テストケース数集計情報１０８に設定されている「行」と「パス条件」の組毎にリスクＲＩＳＫを算出し、リスク情報１１０(図１９参照)として記録する。
【００５９】
図１８には、「行」と「パス条件」の組毎に、個々のテストケースにおける実行の有無を"○"の有無で示すと共に、リスクＲＩＳＫの演算結果を併せて示す。また図１９にはリスク情報１１０の一例を示す。図１８,１９に示すように、「行」と「実行回数」の組毎にリスクを演算することで、バグが存在する行Ｓ７とパス条件"not(α＞0)&not(α＜0)"の組や、行Ｓ５とパス条件"not(α＞0)&α＜0"の組、行Ｓ３とパス条件"not(α＞0)"の組はリスクが高い値になっている。一方、バグの存在しない行Ｓ１,Ｓ２はリスクが0.5と低い値に抑えられている。
【００６０】
ステップ９７でリスクを算出するとリスク算出処理を終了し、図３のステップ６４へ移行する。図３のステップ６４において、出力部２０は、リスク算出部１８によって算出されたリスクを降順にソートし、例として図２０に示すようなレポート１１２として出力する。ステップ６４の処理を行うとプログラム分析処理を終了する。
【００６１】
テスト者は、出力部２０によって出力されたレポートを参照することで、分析対象プログラム２２に存在するバグを容易に抽出することができる。例えば図２０に示すレポート１１２が出力された場合、テスト者は、分析対象プログラム２２のうち行Ｓ７やＳ５辺りに、パス条件がnot(α＞0)のときに実行結果が失敗となるバグが存在しているらしいことを容易に把握できる。このため、分析対象プログラム２２を参照することで、分析対象プログラム２２のうちの行Ｓ７に、パス条件ａ＝α＝0のときに不具合が生ずるバグが存在していることを容易に認識することができる。
【００６２】
上記のように、本第２実施形態では、分析対象プログラム２２の各行毎の実行状況として各行のパス条件を記録し、分析対象プログラム２２の「行」と「パス条件」の組毎にリスクを演算している。これにより、分析対象プログラム２２のうちバグの存在する行のリスクが高くならないことが抑止され、バグの存在する行とバグが顕在化するパス条件の組のリスクが高くなることで、バグの存在する行がバグの存在する可能性の高い行として認識される。従って、本第２実施形態においても、分析対象プログラム２２のうちバグが存在する行のリスクが増大するように各行のリスクを算出することができ、バグの存在する行をテスト者に容易に認識させることができる。
【００６３】
なお、上記では分析対象のプログラムの各行毎の実行状況の一例として、第１実施形態は分析対象プログラム２２の各行毎の実行回数を適用した態様を、第２実施形態は分析対象プログラム２２の各行毎のパス条件を適用した態様を説明した。上記各態様は、抽出できるバグの種類が異なるため、分析対象プログラム２２に対しては各態様を各々適用することが望ましいが、何れか一方の態様のみを適用しても構わない。
【００６４】
また、図６(Ａ)及び図１５(Ａ)に例示したプログラムは分析対象のプログラムの単なる一例であり、分析対象のプログラムは、図６(Ａ)及び図１５(Ａ)に例示したプログラムに限定されるものではなく、例えば別の言語で記述したプログラム等であってもよい。
【００６５】
また、上記では開示の技術に係るプログラム分析プログラム４６が記憶部３６に予め記憶（インストール）されている態様を説明したが、これに限定されるものではない。開示の技術に係るプログラム分析プログラムは、ＣＤ−ＲＯＭやＤＶＤ−ＲＯＭ等の記録媒体に記録されている形態で提供することも可能である。
【００６６】
本明細書に記載された全ての文献、特許出願及び技術規格は、個々の文献、特許出願及び技術規格が参照により取り込まれることが具体的かつ個々に記された場合と同程度に、本明細書中に参照により取り込まれる。
【００６７】
以上の実施形態に関し、更に以下の付記を開示する。
【００６８】
（付記１）
テストケース毎に与えられたテスト条件に従って分析対象のプログラムのテストをテストケース毎に実行することを、テストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況を記録しながら行うテストケース実行部と、
前記テストケース実行部によって記録されたテストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況に基づいて、前記分析対象のプログラムの各行と実行状況の組毎にリスクを算出するリスク算出部と、
を含むプログラム分析装置。
【００６９】
（付記２）
前記テストケース実行部は、前記分析対象のプログラムの各行毎の実行状況として、個々のテストケースにおける前記分析対象のプログラムの各行毎の実行回数を記録し、
前記リスク算出部は、前記分析対象のプログラムの各行と前記実行回数の組毎にリスクを算出する付記１記載のプログラム分析装置。
【００７０】
（付記３）
前記テストケース実行部は、前記分析対象のプログラムの各行毎の実行状況として、個々のテストケースにおける前記分析対象のプログラムの各行毎に、どのような条件で前記分析対象のプログラムの分岐を通ってきたかを表すパス条件を記録し、
前記リスク算出部は、前記分析対象のプログラムの各行と前記パス条件の組毎にリスクを算出する付記１記載のプログラム分析装置。
【００７１】
（付記４）
前記リスク算出部によって前記分析対象のプログラムの各行と実行状況の組毎に算出されたリスクを、当該リスクの降順にソートして出力する出力部を更に備えた付記１〜付記３の何れか１項記載のプログラム分析装置。
【００７２】
（付記５）
前記リスク算出部は、行Ｓｎを通りテスト結果が成功のテストケースの数をＰ(Ｓｎ)、行Ｓｎを通りテスト結果が失敗のテストケースの数をＦ(Ｓｎ)、テスト結果が成功のテストケースの総数をＰ(Ａｌｌ)、テスト結果が失敗のテストケースの総数をＦ(Ａｌｌ)としたときに、行Ｓｎの実行状況毎のリスクＲｉｓｋを、
Ｒｉｓｋ＝(Ｆ(Ｓｎ)／Ｆ(Ａｌｌ))／(Ｆ(Ｓｎ)／Ｆ(Ａｌｌ)＋Ｐ(Ｓｎ)／Ｐ(Ａｌｌ))
に従って演算する付記１〜付記４の何れか１項記載のプログラム分析装置。
【００７３】
（付記６）
テストケース毎に与えられたテスト条件に従って分析対象のプログラムのテストをテストケース毎に実行することを、テストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況を記録しながら行い、
記録したテストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況に基づいて、前記分析対象のプログラムの各行と実行状況の組毎にリスクを算出する
ことを含むプログラム分析方法。
【００７４】
（付記７）
前記分析対象のプログラムの各行毎の実行状況として、個々のテストケースにおける前記分析対象のプログラムの各行毎の実行回数を記録し、
前記分析対象のプログラムの各行と前記実行回数の組毎にリスクを算出する付記６記載のプログラム分析方法。
【００７５】
（付記８）
前記分析対象のプログラムの各行毎の実行状況として、個々のテストケースにおける前記分析対象のプログラムの各行毎に、どのような条件で前記分析対象のプログラムの分岐を通ってきたかを表すパス条件を記録し、
前記分析対象のプログラムの各行と前記パス条件の組毎にリスクを算出する付記６記載のプログラム分析方法。
【００７６】
（付記９）
前記分析対象のプログラムの各行と実行状況の組毎に算出したリスクを、当該リスクの降順にソートして出力する付記６〜付記８の何れか１項記載のプログラム分析方法。
【００７７】
（付記１０）
行Ｓｎを通りテスト結果が成功のテストケースの数をＰ(Ｓｎ)、行Ｓｎを通りテスト結果が失敗のテストケースの数をＦ(Ｓｎ)、テスト結果が成功のテストケースの総数をＰ(Ａｌｌ)、テスト結果が失敗のテストケースの総数をＦ(Ａｌｌ)としたときに、行Ｓｎの実行状況毎のリスクＲｉｓｋを、
Ｒｉｓｋ＝(Ｆ(Ｓｎ)／Ｆ(Ａｌｌ))／(Ｆ(Ｓｎ)／Ｆ(Ａｌｌ)＋Ｐ(Ｓｎ)／Ｐ(Ａｌｌ))
に従って演算する付記６〜付記９の何れか１項記載のプログラム分析方法。
【００７８】
（付記１１）
コンピュータに、
テストケース毎に与えられたテスト条件に従って分析対象のプログラムのテストをテストケース毎に実行することを、テストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況を記録しながら行い、
記録したテストケース毎のテスト結果及び前記分析対象のプログラムの各行毎の実行状況に基づいて、前記分析対象のプログラムの各行と実行状況の組毎にリスクを算出する
ことを含む処理を実行させるためのプログラム分析プログラム。
【００７９】
（付記１２）
前記分析対象のプログラムの各行毎の実行状況として、個々のテストケースにおける前記分析対象のプログラムの各行毎の実行回数を記録し、
前記分析対象のプログラムの各行と前記実行回数の組毎にリスクを算出する付記１１記載のプログラム分析プログラム。
【００８０】
（付記１３）
前記分析対象のプログラムの各行毎の実行状況として、個々のテストケースにおける前記分析対象のプログラムの各行毎に、どのような条件で前記分析対象のプログラムの分岐を通ってきたかを表すパス条件を記録し、
前記分析対象のプログラムの各行と前記パス条件の組毎にリスクを算出する付記１１記載のプログラム分析プログラム。
【００８１】
（付記１４）
前記分析対象のプログラムの各行と実行状況の組毎に算出したリスクを、当該リスクの降順にソートして出力する付記１１〜付記１３の何れか１項記載のプログラム分析プログラム。
【００８２】
（付記１５）
行Ｓｎを通りテスト結果が成功のテストケースの数をＰ(Ｓｎ)、行Ｓｎを通りテスト結果が失敗のテストケースの数をＦ(Ｓｎ)、テスト結果が成功のテストケースの総数をＰ(Ａｌｌ)、テスト結果が失敗のテストケースの総数をＦ(Ａｌｌ)としたときに、行Ｓｎの実行状況毎のリスクＲｉｓｋを、
Ｒｉｓｋ＝(Ｆ(Ｓｎ)／Ｆ(Ａｌｌ))／(Ｆ(Ｓｎ)／Ｆ(Ａｌｌ)＋Ｐ(Ｓｎ)／Ｐ(Ａｌｌ))
に従って演算する付記１１〜付記１４の何れか１項記載のプログラム分析プログラム。
【符号の説明】
【００８３】
１０  プログラム分析装置
１２  第１記憶部
１４  テストケース実行部
１６  第２記憶部
１８  リスク算出部
２０  出力部
２２  分析対象プログラム
２４  テストケースセット
２６  テストケース実行結果
２８  実行状況情報
３０  コンピュータ
３２  ＣＰＵ
３４  メモリ
３６  記憶部
４６  プログラム分析プログラム
【図１】
2014182451.tif 000003
【図２】
2014182451.tif 000004
【図３】
2014182451.tif 000005
【図４】
2014182451.tif 000006
【図５】
2014182451.tif 000007
【図６】
2014182451.tif 000008
【図７】
2014182451.tif 000009
【図８】
2014182451.tif 000010
【図９】
2014182451.tif 000011
【図１０】
2014182451.tif 000012
【図１１】
2014182451.tif 000013
【図１２】
2014182451.tif 000014
【図１３】
2014182451.tif 000015
【図１４】
2014182451.tif 000016
【図１５】
2014182451.tif 000017
【図１６】
2014182451.tif 000018
【図１７】
2014182451.tif 000019
【図１８】
2014182451.tif 000020
【図１９】
2014182451.tif 000021
【図２０】
2014182451.tif 000022
【図２１】
2014182451.tif 000023
【図２２】
2014182451.tif 000024
【図２３】
2014182451.tif 000025