(57)【要約】【課題】カバレッジ情報の算出対象となるプログラムに関係なく、カバレッジ情報を効率的に算出することを課題とする。【解決手段】カバレッジ情報算出装置は、カバレッジ情報の算出対象であるプログラムを実行する前に、該プログラムに含まれるコードの枠組み毎にカウンタをメモリなどに設けておく。そして、カバレッジ情報算出装置は、プログラムを実行し、メモリなどに設けられた枠組みごとのカウンタを用いて、抽出された枠組みが実行された回数を計数する。その後、カバレッジ情報算出装置は、抽出された枠組みの数と、計数された枠組みごとの実行回数とから、カバレッジ情報としてプログラムの実行網羅率などを算出する。【選択図】図１
2011113474.tif 000002
【特許請求の範囲】
【請求項１】
カバレッジ情報の算出対象であるプログラムに含まれるコードの枠組み毎に設けられたカウンタを用いて、該プログラムを実行した場合に該枠組みが実行された回数を計数する回数計数手順と、
前記カウンタが設けられた枠組みの数と、前記回数計数手順によって実行回数が計数された枠組みの数とから、カバレッジ情報を算出するカバレッジ情報算出手順と
をコンピュータに実行させることを特徴とするカバレッジ情報算出プログラム。
【請求項２】
前記プログラムを実行する前に、前記プログラムに含まれるコードの枠組みを抽出する枠組み抽出手順と、
前記枠組み抽出手順によって抽出された枠組み毎に、前記カウンタを生成するカウンタ生成手順とをさらにコンピュータに実行させることを特徴とする請求項１に記載のカバレッジ情報算出プログラム。
【請求項３】
前記カバレッジ情報算出手順は、前記枠組み抽出手順によって抽出された枠組みの数における前記回数計数手順によって実行回数が計数された枠組みの数の割合を示すプログラムの実行網羅率を、前記カバレッジ情報として算出することを特徴とする請求項２に記載のカバレッジ情報算出プログラム。
【請求項４】
カバレッジ情報の算出対象であるプログラムに含まれるコードの枠組み毎のカウンタを記憶するカウンタ記憶部と、
前記カウンタ記憶部に記憶される枠組み毎のカウンタを用いて、前記プログラムを実行した場合に該枠組みが実行された回数を計数する回数計数部と、
前記カウンタ記憶部に記憶されるカウンタが設けられた枠組みの数と、前記回数計数部によって実行回数が計数された枠組みの数とから、カバレッジ情報を算出するカバレッジ情報算出部と
を有することを特徴とするカバレッジ情報算出装置。
【請求項５】
カバレッジ情報の算出対象であるプログラムに含まれるコードの枠組み毎に設けられたカウンタを用いて、該プログラムを実行した場合に該枠組みが実行された回数を計数する回数計数工程と、
前記カウンタが設けられた枠組みの数と、前記回数計数工程によって実行回数が計数された枠組みの数とから、カバレッジ情報を算出するカバレッジ情報算出工程と
を含んだことを特徴とするカバレッジ情報算出方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、カバレッジ情報算出プログラム、カバレッジ情報算出装置およびカバレッジ情報算出方法に関する。
【背景技術】
【０００２】
従来、開発されたプログラムまたは開発段階のプログラムをテストする場合に、プログラムのクラス、メソッド、関数、サブルーチンなど各コードのテスト漏れを防止する技術として、カバレッジ情報を用いた技術が利用されている。このようなカバレッジ情報の算出手法の一例としては、プログラム内に記述される実行されるべき行がどのくらい実際に実行されたかを示す「実行網羅率」を算出するカバレッジ情報算出装置が開示されている。
【０００３】
具体的には、カバレッジ情報算出装置は、プログラムの何処が実行されたかを示す「実行位置」をプログラム実行中にログデータとして記録し、記録した実行位置から実行位置の種類数を示す「実行行数」を計数する。そして、カバレッジ情報算出装置は、計数した「実行行数」をプログラム全体の実行可能な行数を示す「有効全体行数」で除算し、さらに１００を乗算した結果である「実行網羅率」をカバレッジ情報として算出する。こうして算出された「実行網羅率」が高い程、プログラム内に記述される実行されるべき行の多くが実際に実行されたことが示される。また、「実行網羅率」が低い程、プログラム内に記述される実行されるべき行の多くが実際には実行されていないことが示される。
【０００４】
ここで、図１１と図１２を用いて、カバレッジ情報として「実行網羅率」を算出するカバレッジ情報算出装置をより具体的に説明する。図１１は、プログラム実行時に実行位置を取得する例を示す図であり、図１２は、実行位置から実行行数を取得する例を示す図である。
【０００５】
図１１に示すように、Java（登録商標）VM（Java（登録商標）  Virtual  Machine）上には、classA、classB、classCを有するプログラムが実行されている。そして、カバレッジ情報算出装置は、このプログラムの構成として、「クラス名」と「メソッド名」と「有効行番号」とを対応付けて記憶し、さらに「有効全体行数」を記憶する。ここで、「クラス名」とは、データとその処理方法であるメソッドをまとめたオブジェクトを定義したクラスの名称を示す情報である。また、「メソッド名」とは、クラスで定義されるメソッドの名称を示す情報であり、「有効行番号」とは、実行されるべきクラス内の行番号を示す情報である。また、「有効全体行数」は、各クラスの「有効行番号」の数を計数した情報であり、プログラム全体で実行されるべき行の総数を示す情報である。
【０００６】
例えば、カバレッジ情報算出装置は、図１１の（ａ）に示すように、「クラス名、メソッド名、有効行番号」として「classA、methodA１、3，4，5，6」や「classA、methodA２、9，10，13」と記憶する。また、カバレッジ情報算出装置は、「classB、methodB１、1，2，4，5」、「classB、methodB2、8，9，12」、「classB、methodB3、13，14，16，19」と記憶する。そして、カバレッジ情報算出装置は、「classC、methodC1、2，3，4，5，7，9」と、さらに「有効全体行数」として、「24」を記憶する。
【０００７】
つまり、この例の場合、classAは、プログラムの３行目〜６行目が実行可能な行であるmethodA1と、プログラムの９行目、１０行目、１３行目が実行可能な行であるmethodA2とを有している。また、classBは、プログラムの１、２、４、５行目が実行可能な行であるmethodB1と、プログラムの８、９、１２行目が実行可能な行であるmethodB2とを有している。さらに、classBは、プログラムの１３、１４、１６、１９行目が実行可能な行であるmethodB3を有している。また、classCは、プログラムの２、３、４、５、７、９行目が実行可能な行であるmethodC1を有している。
【０００８】
このような状態において、カバレッジ情報算出装置は、Java（登録商標）VM上でclassA〜Cを有するプログラムを実行すると、実行された「クラス名、メソッド名、行番号」を示す「実行位置」をログデータとしてファイルに出力する。例えば、カバレッジ情報算出装置は、図１１の（ｂ）に示すように、「classA、methodA1、3行目」、「classA、methodA1、4行目」、「classB、methodB2、8行目」を出力する。また、カバレッジ情報算出装置は、「classB、methodB2、9行目」、「classB、methodB2、12行目」、「classB、methodB2、8行目」、「classB、methodB2、9行目」を出力する。また、カバレッジ情報算出装置は、「classB、methodB2、12行目」、「classA、methodA1、5行目」を出力する。
【０００９】
その後、カバレッジ情報算出装置は、プログラムの実行を停止した場合やプログラムが終了した場合に、出力された「実行位置」の種類を計数する。例えば、カバレッジ情報算出装置は、図１２に示すように、「classA、methodA1、3行目」の登場回数を「1」、「classA、methodA1、4行目」の登場回数を「1」と計数する。同様に、カバレッジ情報算出装置は、「classA、methodA1、5行目」の登場回数を「1」と計数する。さらに、カバレッジ情報算出装置は、「classB、methodB2、8行目」の登場回数を「2」、「classB、methodB2、9行目」の登場回数を「2」、「classB、methodB2、12行目」の登場回数を「2」と計数する。したがって、カバレッジ情報算出装置は、全６種類の「実行位置」、言い換えると、全６種類の「行」が実行されたと計数する。
【００１０】
そして、カバレッジ情報算出装置は、算出した「実行位置」の種類数「6」を「有効全体行数＝24」で除算した「6/24＝0.25」を算出し、さらに「0.25」に100を乗算した「25」を「実行網羅率」として算出する。この結果、例示したプログラム全体のうち「25％」が実際に実行され、「75％」が実際には実行されていないことがわかる。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特開平９−２５１４００号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
しかしながら、従来の技術では、カバレッジ情報の算出対象であるプログラムが複雑な場合など、プログラムの実行によって出力されるデータであって、カバレッジ情報の算出に必要なデータを格納する領域が膨大になる。この結果、カバレッジ情報を効率的に算出することができないという課題があった。
【００１３】
例えば、プログラム全体の「実行網羅率」を算出する場合には、カバレッジ情報算出装置は、プログラムを最初から最後まで全体的に実行して、上記「実行位置」を取得する。また、カバレッジ情報算出装置は、プログラム内の行が実行されるたびに、「実行位置」を１行ずつログデータとして出力する。これらのため、カバレッジ情報算出装置は、複雑なプログラムや大規模なプログラムのカバレッジを算出する場合には、膨大な数の「実行位置」をログデータとして出力する。そして、カバレッジ情報算出装置は、出力した膨大な数の「実行位置」から「実行位置」の種類を計数するのに多くの時間を必要とし、結果として「実行網羅率」の算出にも多くの時間を必要する。
【００１４】
また、プログラムの所定範囲の「実行網羅率」を算出する場合には、カバレッジ情報算出装置は、所定範囲内のプログラムを実行して、上記「実行位置」を取得する。このような所定範囲の「実行網羅率」を算出する場合とは、対象となる所定範囲のプログラムが非常に複雑であることが多い。このため、所定範囲内のプログラムの実行によって出力される「実行位置」は、膨大な数になることが多い。したがって、この場合であっても、カバレッジ情報算出装置は、出力した膨大な数の「実行位置」から「実行位置」の種類を計数するのに多くの時間を必要とし、結果として「実行網羅率」の算出にも多くの時間を必要とする。
【００１５】
また、繰り返し実行されるプログラムの「実行網羅率」を算出する場合には、カバレッジ情報算出装置は、プログラムを所定時間実行して、上記「実行位置」を取得する。この場合、プログラムを実行する時間が長ければ長いほど、ログデータとして出力される「実行位置」が多くなる。つまり、カバレッジ情報算出装置は、プログラムを実行する時間が長いほど、出力した「実行位置」から「実行位置」の種類を計数するのに時間を必要とし、「実行網羅率」の算出にも多くの時間を必要とする。
【００１６】
開示の技術は、上記に鑑みてなされたものであって、カバレッジ情報の算出対象となるプログラムに関係なく、カバレッジ情報を効率的に算出することが可能であるカバレッジ情報算出プログラム、カバレッジ情報算出装置およびカバレッジ情報算出方法を提供することを目的とする。
【課題を解決するための手段】
【００１７】
本願の開示するカバレッジ情報算出プログラムは、カバレッジ情報の算出対象であるプログラムに含まれるコードの枠組み毎に設けられたカウンタを用いて、該プログラムを実行した場合に該枠組みが実行された回数を計数する回数計数手順を有する。そして、前記カウンタが設けられた枠組みの数と、前記回数計数手順によって実行回数が計数された枠組みの数とから、カバレッジ情報を算出するカバレッジ情報算出手順を有する。そして、これらの手順をコンピュータに実行させる。
【発明の効果】
【００１８】
本願の開示するカバレッジ情報算出プログラム、カバレッジ情報算出装置およびカバレッジ情報算出方法の一つの態様によれば、カバレッジ情報の算出対象となるプログラムに関係なく、カバレッジ情報を効率的に算出することが可能であるという効果を奏する。
【図面の簡単な説明】
【００１９】
【図１】図１は、実施例１に係るカバレッジ情報算出装置の構成を示すブロック図である。
【図２】図２は、実施例２に係るカバレッジ情報算出装置の構成を示すブロック図である。
【図３】図３は、プログラムＤＢに記憶される情報の例を示す図である。
【図４】図４は、プログラムがＣ言語で記述されている場合に、枠組みカウンタＤＢに記憶される情報の例を示す図である。
【図５】図５は、プログラムがJava（登録商標）で記述されている場合に、枠組みカウンタＤＢに記憶される情報の例を示す図である。
【図６】図６は、カバレッジ情報ＤＢに記憶される情報の例を示す図である。
【図７】図７は、Ｃ言語で記述されたソースコードから枠組みを抽出する例を示す図である。
【図８】図８は、Java（登録商標）で記述されたソースファイルから枠組みを抽出する例を示す図である。
【図９】図９は、実施例２に係るカバレッジ情報算出装置における処理の流れを示すフローチャートである。
【図１０】図１０は、カバレッジ情報算出プログラムを実行するコンピュータシステムの例を示す図である。
【図１１】図１１は、プログラム実行時に実行位置を取得する例を示す図である。
【図１２】図１２は、実行位置から実行行数を取得する例を示す図である。
【発明を実施するための形態】
【００２０】
以下に、本願の開示するカバレッジ情報算出プログラム、カバレッジ情報算出装置およびカバレッジ情報算出方法の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
【実施例１】
【００２１】
図１は、実施例１に係るカバレッジ情報算出装置の構成を示すブロック図である。図１に示すカバレッジ情報算出装置１は、例えば、開発途中のプログラムをテストし、行カバレッジ、クラスカバレッジ、メソッドカバレッジなどの任意の単位で、実行網羅率を算出する装置である。このカバレッジ情報算出装置１は、図１に示すように、回数計数部１ａとカバレッジ情報算出部１ｂとを有する。
【００２２】
回数計数部１ａは、カバレッジ情報の算出対象であるプログラムに含まれるコードの枠組み毎に設けられたカウンタを用いて、該プログラムを実行した場合に該枠組みが実行された回数を計数する。例えば、カバレッジ情報算出装置１は、カバレッジ情報の算出対象であるプログラムソースコード２に含まれるコードの枠組み毎のカウンタをメモリなどに記憶する。そして、回数計数部１ａは、プログラムソースコード２を実行し、メモリなどに記憶される枠組み毎のカウンタを用いて、プログラムソースコード２の枠組み毎に実行された回数を計数する。その後、回数計数部１ａは、プログラムソースコード２の実行が終了すると、プログラムの実行が終了したことをカバレッジ情報算出部１ｂに通知する。
【００２３】
カバレッジ情報算出部１ｂは、カウンタが設けられた枠組みの数と、回数計数部１ａによって実行回数が計数された枠組みの数とから、カバレッジ情報を算出する。例えば、カバレッジ情報算出部１ｂは、行カバレッジ、メソッドカバレッジ、クラスカバレッジ、関数カバレッジなど任意の単位で、カバレッジ情報３を算出する。一例としては、カバレッジ情報算出部１ｂは、プログラム中の実行すべき行がどのくらい実際に実行されたか示す実行網羅率やプログラム中の実行すべき関数がどのくらい実際に実行されたかなどを示す実行網羅率などを算出する。
【００２４】
このように、実施例１によれば、カバレッジ情報算出装置１は、カバレッジ情報算出対象のプログラムの枠組みに対応するカウンタをメモリなどに設けておく。そして、カバレッジ情報算出装置１は、実際に実行された枠組みの数をメモリに設けられたカウンタをインクリメントすることで計数し、実行網羅率などを算出する。つまり、カバレッジ情報算出装置１は、プログラムを実行するたびに、実行ログデータをファイルやメモリに出力する必要はなく、プログラムの規模に応じたカウンタを用いて、実行回数のみを計数すればよい。
【００２５】
したがって、実施例１に係るカバレッジ情報算出装置１では、プログラムが複雑な場合であっても、プログラムの実行によって出力されるデータであって、カバレッジ情報の算出に必要なデータを格納する領域は必要ない。また、実施例１に係るカバレッジ情報算出装置１では、プログラム実行前に作成した枠組みごとのカウンタで、実行されるたびに実行回数を計数するので、プログラムの実行によって出力されたログデータから枠組みごとの実行回数を解析する必要もない。
【００２６】
この結果、実施例１に係るカバレッジ情報算出装置１では、カバレッジ情報の算出対象となるプログラムに関係なく、カバレッジ情報を効率的に算出することが可能である。また、プログラム開発者などは、開発中のプログラムのクラス、メソッド、関数、サブルーチンなど各コードのテスト漏れを迅速に確認することができる。
【実施例２】
【００２７】
ところで、本願が開示するカバレッジ情報算出装置は、実施例１で説明した制御部以外にも様々な制御部を有していてもよい。そこで、実施例２では、実施例１で説明した制御部以外の様々な制御部を有するカバレッジ情報算出装置について説明する。
【００２８】
［カバレッジ情報算出装置の構成］
まず、図２を用いて、様々な制御部を有するカバレッジ情報算出装置の構成について説明する。図２は、実施例２に係るカバレッジ情報算出装置の構成を示すブロック図である。図２に示すように、カバレッジ情報算出装置１０は、通信制御Ｉ／Ｆ部１１と、入力部１２と、表示部１３と、記憶部１５と、制御部２０とを有している。
【００２９】
通信制御Ｉ／Ｆ部１１は、少なくとも１つの通信ポートを有するインタフェースであり、他の装置との間でやり取りされる情報を制御する。例えば、通信制御Ｉ／Ｆ部１１は、プログラム開発者が利用する管理コンピュータと接続され、カバレッジ情報算出対象のプログラムを管理コンピュータから受信し、また、算出されたカバレッジ情報を管理コンピュータに送信する。
【００３０】
入力部１２は、例えば、キーボードやマウス、マイクなどであり、カバレッジ情報算出開始指示や終了指示の入力を受付け、後述する制御部２０等に入力する。また、入力部１２は、ＣＤ（Compact  Disc）、ＤＶＤ（Digital  Versatile  Disc）や磁気ディスクなどの記憶媒体を読み込んで情報を読み出したり、情報を書き込んだりすることができる。例えば、入力部１２は、カバレッジ情報算出対象のプログラムを記憶媒体から読み出して記憶部１５に格納したり、算出されたカバレッジ情報を記憶媒体に書き込んだりすることができる。
【００３１】
なお、後述する表示部１３も、マウスと協働してポインティングディバイス機能を実現する。表示部１３は、例えば、モニタ、ディスプレイ、タッチパネルやスピーカなどであり、後述する制御部２０で生成されたカバレッジ情報などを表示出力する。
【００３２】
記憶部１５は、制御部２０による各種処理に必要なデータおよびプログラムを格納するとともに、プログラムＤＢ（DataBase）１６と、枠組みカウンタＤＢ１７と、カバレッジ情報ＤＢ１８とを有する。このプログラムＤＢ１６、枠組みカウンタＤＢ１７、カバレッジ情報ＤＢ１８は、例えば、ＲＡＭ（Random  Access  Memory）などの半導体メモリ素子やハードディスク、光ディスクなどの記憶装置である。
【００３３】
プログラムＤＢ１６は、カバレッジ情報算出対象のプログラムを記憶し、例えば、通信制御Ｉ／Ｆ部１１によって受信されたプログラムや入力部１２によって記憶媒体から読み出されたプログラムなどを記憶する。例えば、プログラムＤＢ１６は、図３に示すようなＣ言語で記述されたソースプログラムを記憶する。図３は、プログラムＤＢに記憶される情報の例を示す図である。
【００３４】
図３に示すソースプログラムであるSampleSource.cは、includeによって、ライブラリであるヘッダーファイル「stdio.h」と「string.h」を読み込み、入出力と文字列操作の宣言を行っている。そして、SampleSource.cは、コマンドライン引数を用いた関数を実行する。具体的には、SampleSource.cには、引数の総個数（int  argc）と引数の文字列を示すポインタの配列（char  *argc［］）を引数とし、戻り値を「０」とするfunctionA1が定義されている。
【００３５】
枠組みカウンタＤＢ１７は、プログラムの枠組みごとに、当該枠組みが実行された回数を計数するカウンタを記憶する。具体的には、枠組みカウンタＤＢ１７は、カバレッジ情報算出対象のプログラムが有するソースファイル名、関数名、クラス名、メソッド名、行番号ごとに実行回数を計数するカウンタを記憶する。
【００３６】
例えば、枠組みカウンタＤＢ１７は、図４に示すように、ソースファイル「SampleSource.c」の実行回数と、「関数functionA1、B1、C1」各々の実行回数を計数するカウンタを記憶する。また、枠組みカウンタＤＢ１７は、「関数functionA1の行番号3、5、11」各々の実行回数と、「関数functionB1の行番号2」の実行回数と、「関数functionC1の行番号5、9」各々の実行回数とを計数するカウンタを記憶する。
【００３７】
この例の場合、カバレッジ情報算出対象のプログラムのソースファイル「SampleSource.c」を実行した場合に、実行されるべき関数がA1、B1、C1の3つある。そして、関数A1には、実行されるべき行が3、5、11行目の計3行あり、関数B1には、実行されるべき行が2行目の計1行あり、関数C1には、実行されるべき行が5、9行目の計2行ある。なお、図４は、プログラムがＣ言語で記述されている場合に、枠組みカウンタＤＢに記憶される情報の例を示す図である。
【００３８】
また、枠組みカウンタＤＢ１７は、図５に示すように、プログラムのクラス「classA」の実行回数と、「classAのmethodA1、A2」各々の実行回数を計数するカウンタとを計数するカウンタを記憶する。例えば、枠組みカウンタＤＢ１７は、「methodA1の行番号2、4」各々の実行回数を計数するカウンタと、「methodA2の行番号2、12」各々の実行回数を計数するカウンタとを計数するカウンタを記憶する。同様に、枠組みカウンタＤＢ１７は、プログラムのクラス「classB」の実行回数と、「classBのmethodB1」の実行回数を計数するカウンタとを計数するカウンタと、「methodB1の行番号4、7」各々の実行回数を計数するカウンタとを計数するカウンタを記憶する。
【００３９】
この例の場合、カバレッジ情報算出対象のプログラムを実行した場合に、実行されるべきクラスがA、Bの2つあり、クラスAには、実行されるべきメソッドがA1とA2の2つある。そして、メソッドA1には、実行されるべき行が2、4行目の計2行あり、メソッドA2には、実行されるべき行が2、12行目の計2行ある。また、クラスBには、実行されるべきメソッドがB1の1つあり、メソッドB1には、実行されるべき行が4、7行目の計2行ある。なお、図５は、プログラムがJava（登録商標）で記述されている場合に、枠組みカウンタＤＢに記憶される情報の例を示す図である。
【００４０】
カバレッジ情報ＤＢ１８は、後述するカバレッジ情報算出部２４によって算出されたカバレッジ情報を記憶する。例えば、カバレッジ情報ＤＢ１８は、図６に示すように、「算出日、算出範囲、カバレッジ値（実行網羅率）」として「2009/9/30、functionA〜functionC、25％」や「2009/9/30、全部、50％」などと記憶する。ここで記憶される「算出日」とは、カバレッジ値を算出した日であり、「算出範囲」とは、カバレッジ値を算出したプログラムの範囲であり、「カバレッジ値」とは、算出された実行網羅率である。なお、図６は、カバレッジ情報ＤＢに記憶される情報の例を示す図である。
【００４１】
制御部２０は、例えば、ＡＳＩＣ（Application  Specific  Integrated  Circuit）などの集積回路やＣＰＵ（Central  Processing  Unit）やＭＰＵ（Micro  Processing  Unit）などの電子回路である。この制御部２０は、ＯＳ（Operating  System）などの制御プログラム、各種の処理手順などを規定したプログラムおよび所要データを格納するための内部メモリを有する。さらに、制御部２０は、枠組み抽出部２１と、カウンタ生成部２２と、回数計数部２３と、カバレッジ情報算出部２４とを有し、これらによって各種処理を実行する。
【００４２】
枠組み抽出部２１は、カバレッジ情報算出対象のプログラムに含まれるコードの枠組みを抽出する。具体的には、枠組み抽出部２１は、入力部１２によってカバレッジ情報算出開始指示が受け付けられると、算出対象のプログラムをプログラムＤＢ１６から読み出し、プログラムが有するコードを抽出してカウンタ生成部２２に出力する。
【００４３】
例えば、枠組み抽出部２１は、プログラムＤＢ１６から読み出したプログラムがＣ言語で記述されている場合には、図７に示すように、プログラムのソースコード「SampleSource.c」から関数情報を抽出する。続いて、枠組み抽出部２１は、抽出した関数情報内において、演算や出力などの実質的な処理が実施される関数内の行を抽出する。図７は、Ｃ言語で記述されたソースコードから枠組みを抽出する例を示す図である。
【００４４】
また、枠組み抽出部２１は、プログラムＤＢ１６から読み出したプログラムがJava（登録商標）で記述されている場合には、図８に示すように、Java（登録商標）VM（Java（登録商標）  Virtual  Machine）上のモジュール構成情報からクラス情報を抽出する。続いて、枠組み抽出部２１は、抽出した各クラス情報内で定義されるメソッド情報を抽出する。そして、枠組み抽出部２１は、抽出した各メソッド内において、演算や出力などの実質的な処理が実施される関数内の行を抽出する。図８は、Java（登録商標）で記述されたソースファイルから枠組みを抽出する例を示す図である。
【００４５】
カウンタ生成部２２は、枠組み抽出部２１によって抽出された枠組みごとに、当該枠組みが実行された回数を計数するカウンタを生成する。具体的には、カウンタ生成部２２は、枠組み抽出部２１から枠組みが抽出されると、図４や図５に示すように、抽出された枠組みごとのカウンタを生成して枠組みカウンタＤＢ１７に格納し、カウンタを生成したことを回数計数部２３に通知する。
【００４６】
例えば、カウンタ生成部２２は、カバレッジ情報算出対象のプログラムがＣ言語で記述されている場合には、枠組み抽出部２１によって抽出されたソースファイル名、関数、関数内の行ごとに、カウンタを生成する。また、カウンタ生成部２２は、カバレッジ情報算出対象のプログラムがjava（登録商標）で記述されている場合には、枠組み抽出部２１によって抽出されたクラス、メソッド、メソッド内の行ごとにカウンタを生成する。
【００４７】
そして、カウンタ生成部２２は、枠組み抽出部２１によって抽出された枠組みと、生成したカウンタとを対応付ける。例えば、カウンタ生成部２２は、枠組みとカウンタとの対応関係を生成する。そして、カウンタ生成部２２は、枠組みが実行された場合に、実行された枠組みを特定する情報を示す実行通知を回数計数部２３に出力するプログラムを、プログラムＤＢ１６に記憶されるプログラムソースコードに追記する。なお、プログラムソースコードに追記されたプログラムは、後述するカバレッジ情報算出部２４によって、カバレッジ情報算出後に削除される。また、カウンタ生成部２２は、プログラムＤＢ１６に記憶されるプログラムソースコードをコピーしたものに上記プログラムを追記し、これをカバレッジ情報算出対象としてもよい。
【００４８】
また、枠組みを特定する情報の一例としては、プログラム全体での行番号や一意に割り振ったＩＤなど特定できる情報であれば、カウンタと対応関係を生成できる情報であればよい。また、追記するプログラムの一例としては、コメント文を挿入して実行通知を出力するなど様々な通知手法を用いることができる。
【００４９】
回数計数部２３は、カバレッジ情報算出対象のプログラムを実行し、カウンタ生成部２２によって生成された枠組みごとのカウンタを用いて、枠組み抽出部２１によって抽出された枠組みが実行された回数を計数する。例えば、回数計数部２３は、カウンタ生成部２２からカウンタを生成したことが通知されると、プログラムＤＢ１６からプログラムを読み出して実行し、実行したプログラムを監視する。そして、回数計数部２３は、カウンタ生成部２２によって生成されたカウンタと枠組みとの対応関係と、枠組みが実行されるたびに受信する実行通知とを用いて、実行された枠組みを計数する。例えば、回数計数部２３は、プログラム内の行が実行されるたびに実行通知を受信し、実行された行、この行を含む関数、この関数を含むソースファイル各々のカウンタをインクリメントする。その後、回数計数部２３は、プログラムが終了すると、終了通知をカバレッジ情報算出部２４に通知する。
【００５０】
図５を例にして説明すると、回数計数部２３は、例えば、methodA2の12行目が実行された場合、methodA2の12行目のカウンタをインクリメントし、さらに、methodA2のカウンタをインクリメントし、さらに、classAのカウンタをインクリメントする。その後、回数計数部２３は、例えば、methodB1の7行目が実行された場合、methodB1の7行目のカウンタをインクリメントし、さらに、methodB1のカウンタをインクリメントし、さらに、classBのカウンタをインクリメントする。
【００５１】
カバレッジ情報算出部２４は、カウンタ生成部２２によって抽出された枠組みの数と、回数計数部２３によって計数された枠組みごとの実行回数とから、カバレッジ情報としてプログラムの実行網羅率を算出する。カバレッジ情報算出部２４は、プログラムの実行終了を回数計数部２３から受信すると、カバレッジ情報の算出を実施する。
【００５２】
例えば、行単位を示す行カバレッジで実行網羅率を算出する場合、カバレッジ情報算出部２４は、枠組みカウンタＤＢ１７に記憶される行ごとのカウンタの数を計数するとともに、インクリメントされているカウンタの数を計数する。続いて、カバレッジ情報算出部２４は、インクリメントされているカウンタの数を行ごとのカウンタの総数で除算し、実行されるべき行のうち、実際に実行された行の割合を算出する。そして、カバレッジ情報算出部２４は、算出した割合と算出した時間、さらに、算出対象となったプログラムの範囲とを対応付けてカバレッジ情報ＤＢ１８に格納する。
【００５３】
具体的な例として、プログラム全体を実行し、図４に示した枠ごとのカウンタのうち、functionA1の行番号＝3、11とfunctionB1の行番号＝2の実行回数が１以上であったとする。この場合、カバレッジ情報算出部２４は、枠組みカウンタＤＢ１７に記憶される行ごとのカウンタの総数を「6」と計数し、実際に実行された行の数を「3」と計数する。続いて、カバレッジ情報算出部２４は、実行したプログラムの実行網羅率（行）を「3/6*100＝50％」と算出する。そして、カバレッジ情報算出部２４は、実行網羅率を算出した日「2009/10/30」、実行した範囲「全部」、算出した実行網羅率「50％」を対応付けて、カバレッジ情報ＤＢ１８に格納する。
【００５４】
また、プログラム全体を実行し、メソッドカバレッジで実行網羅率を算出する場合、図５を用いて説明する。ここでは、図５に示したmethodA1の行番号＝2、4と、methodB1の行番号＝4、7との実行回数が１以上であったとする。すなわち、methodA1の実行回数とmethodB1の実行回数が１以上である。この場合、カバレッジ情報算出部２４は、枠組みカウンタＤＢ１７に記憶されるメソッドごとのカウンタの総数を「3」と計数し、実際に実行されたメソッドの数を「2」と計数する。続いて、カバレッジ情報算出部２４は、実行したプログラムの実行網羅率（行）を「2/3*100＝66.66％」と算出する。そして、カバレッジ情報算出部２４は、実行網羅率を算出した日「2009/10/30」、実行した範囲「全部」、算出したメソッドカバレッジの実行網羅率「66％」を対応付けて、カバレッジ情報ＤＢ１８に格納する。
【００５５】
なお、カバレッジ情報算出部２４は、プログラムを実行した範囲については、枠組み抽出部２１によって入力部１２を介して受け付けられた範囲を受け付けることで、実行したプログラムの範囲、すなわち、カバレッジ情報算出対象範囲を取得することができる。
【００５６】
［処理の流れ］
次に、図９を用いて、実施例２に係るカバレッジ情報算出装置における処理の流れを説明する。図９は、実施例２に係るカバレッジ情報算出装置における処理の流れを示すフローチャートである。
【００５７】
図９に示すように、入力部１２によってカバレッジ情報算出処理開始指示が受け付けられると（ステップＳ１０１肯定）、カバレッジ情報算出装置１０の枠組み抽出部２１は、算出対象のプログラムをプログラムＤＢ１６から読み込む（ステップＳ１０２）。
【００５８】
続いて、枠組み抽出部２１は、読み込んだプログラムの構造を解析してプログラムが有するコードを抽出し、カウンタ生成部２２は、枠組み抽出部２１によって抽出された枠組みごとに、枠組みが実行された回数を計数するカウンタを生成する（ステップＳ１０３）。
【００５９】
その後、回数計数部２３は、カバレッジ情報算出対象のプログラムを実行する（ステップＳ１０４）。そして、回数計数部２３は、カウンタ生成部２２によって生成された枠組みごとのカウンタを用いて、実際に実行された枠組みのカウンタをインクリメントし、枠組みごとの実行回数を計数する（ステップＳ１０５）。なお、回数計数部２３は、プログラムの実行が終了するまで、ステップＳ１０５を繰り返して実行する（ステップＳ１０６否定）。
【００６０】
そして、プログラムの実行が終了すると（ステップＳ１０６肯定）、カバレッジ情報算出部２４は、抽出された枠組みの数と、計数された枠組みごとの実行回数とから、カバレッジ情報としてプログラムの実行網羅率を算出する（ステップＳ１０７）。
【００６１】
［実施例２による効果］
このように、実施例２に係るカバレッジ情報算出装置１０は、プログラム実行前の枠組みを用いて、関数などのコードの枠組みごとに実行回数を計数するので、実行ログを生成する必要も無く、実行ログから枠組みごとの実行回数を生成する必要もない。この結果、カバレッジ情報算出装置１０は、カバレッジ情報の算出対象となるプログラムに関係なく、カバレッジ情報を効率的に算出することが可能である。また、例えば、メモリなどの記憶領域に、実行ログを出力する領域を設ける必要も無いので、記憶領域を圧迫することもなく、記憶領域の無駄な使用を防止することができる。
【実施例３】
【００６２】
さて、これまで本発明の実施例について説明したが、本発明は上述した実施例以外にも、種々の異なる形態にて実施されてよいものである。そこで、以下に異なる実施例を説明する。
【００６３】
（カバレッジ情報算出範囲）
例えば、本願が開示するカバレッジ情報算出装置は、実施例１や２で説明したようなプログラム全体に対してカバレッジ情報を算出する以外にも、プログラムの所定範囲内だけを対象として、カバレッジ情報を算出することができる。例えば、枠組み抽出部２１は、カバレッジ情報の算出対象とする場合には、入力部１２を介して、対象プログラムの関数Ａのみや関数Ａから関数Ｃまでなど範囲の指定を受け付けて、受け付けた範囲についてのみ、枠組みを抽出する。そして、枠組み抽出部２１は、抽出した枠組みと指定された範囲とをカウンタ生成部２２に出力する。
【００６４】
続いて、カウンタ生成部２２は、枠組み抽出部２１によって抽出された枠組みについてのみカウンタを生成し、カウンタ生成が完了したことと指定された範囲とを回数計数部２３に通知する。その後、回数計数部２３は、指定された範囲についてのみ実行し、生成されたカウンタを用いて枠組みごとの実行回数を計数し、プログラムの実行が完了すると、完了したことと指定された範囲とをカバレッジ情報算出部２４に通知する。そして、カバレッジ情報算出部２４は、指定された範囲について、カバレッジ情報を算出する。この結果、カバレッジ情報算出装置１０は、プログラムの所定範囲内について、カバレッジ情報を効率的に算出することが可能である。
【００６５】
（カバレッジ情報算出対象プログラム）
また、実施例１や２に係るカバレッジ情報算出装置は、カバレッジ情報算出対象プログラムとして、Ｃ言語やJava（登録商標）で記述されたプログラムを例示したが、本願はこれに限定されるものではない。例えば、カバレッジ情報算出装置は、手続き型言語で記述されたプログラムであれば、実施例１や２と同様に処理することができる。また、本願が開示するカバレッジ情報算出装置は、ソースプログラムからだけでなく、例えば、コンパイル後のモジュールから枠組みを抽出することができる。
【００６６】
（実行回数の計数手法）
また、実施例２に係るカバレッジ情報算出装置は、プログラムの枠組みとカウンタとを対応付けて、実行された枠組みの情報をプログラムから受信することで、枠組み毎の実行回数を計数する例について説明したが、本願はこれに限定されるものではない。例えば、カバレッジ情報算出装置は、コンパイラ後のモジュールから枠組み毎のカウンタを作成した場合には、コンパイラ後のモジュールとカウンタとを対応付ける。そして、カバレッジ情報算出装置は、実行したモジュールを監視し、実行された枠組みを計数する。なお、実行された枠組みを検知する手法は、実施例２で説明した手法以外の様々な技術を用いることができる。
【００６７】
（カバレッジ情報の単位）
また、実施例１や２に係るカバレッジ情報算出装置は、カバレッジ情報として行カバレッジにおける実行網羅率、つまり、実際にどのくらいの行が実行されたかを示す実行網羅率を算出する例について説明したが、本願はこれに限定されるものではない。例えば、実施例１や２で用いたプログラムの行に注目した行カバレッジ以外にも、クラスに注目したクラスカバレッジ、メソッドに注目したメソッドカバレッジ、関数に注目した関数カバレッジなど、コードにおける任意の単位で実行網羅率を算出することができる。
【００６８】
一例としては、カバレッジ情報算出装置は、実行されるべきメソッドの合計と実際に実行されたメソッドの数とから、メソッドカバレッジでの実行網羅率を算出することができる。また、カバレッジ情報算出装置は、実行されるべきクラスの合計と実際に実行されたクラスの数とから、クラスカバレッジでの実行網羅率を算出することができる。
【００６９】
（システム構成等）
また、本実施例において説明した各処理のうち、自動的におこなわれるものとして説明した処理の全部または一部を手動的におこなうこともできる。あるいは、手動的におこなわれるものとして説明した処理の全部または一部を公知の方法で自動的におこなうこともできる。この他、上記文書中や図面中で示した処理手順、制御手順、具体的名称、例えば図３〜図６等に示した各種のデータやパラメータを含む情報については、特記する場合を除いて任意に変更することができる。
【００７０】
また、図示した各装置の各構成要素は機能概念的なものであり、必ずしも物理的に図示の如く構成されていることを要しない。すなわち、例えば枠組み抽出部２１とカウンタ生成部２２とを統合するなど各装置の分散・統合の具体的形態は図示のものに限られず、その全部または一部を、各種の負荷や使用状況などに応じて、任意の単位で機能的または物理的に分散・統合して構成することができる。さらに、各装置にて行なわれる各処理機能は、その全部または任意の一部が、ＣＰＵおよび当該ＣＰＵにて解析実行されるプログラムにて実現され、あるいは、ワイヤードロジックによるハードウェアとして実現され得る。
【００７１】
（プログラム）
ところで、上記の実施例で説明した各種の処理は、あらかじめ用意されたプログラムをパーソナルコンピュータやワークステーションなどのコンピュータシステムで実行することによって実現することができる。そこで、以下では、上記の実施例と同様の機能を有するプログラムを実行するコンピュータシステムの一例を説明する。
【００７２】
図１０は、カバレッジ情報算出プログラムを実行するコンピュータシステムの例を示す図である。図１０に示すように、コンピュータシステム１００は、ＲＡＭ１０１と、ＨＤＤ１０２と、ＲＯＭ１０３と、ＣＰＵ１０４とを有する。ここで、ＲＯＭ１０３には、上の実施例と同様の機能を発揮するプログラムがあらかじめ記憶されている。つまり、図１０に示すように、ＲＯＭ１０３には、枠組み抽出プログラム１０３ａ、カウンタ生成プログラム１０３ｂ、回数計数プログラム１０３ｃ、カバレッジ情報算出プログラム１０３ｄがあらかじめ記憶されている。
【００７３】
そして、ＣＰＵ１０４には、これらのプログラム１０３ａ〜１０３ｄを読み出して実行することで、図１０に示すように、各プロセスとなる。つまり、プログラム１０３ａ〜１０３ｄ各々は、枠組み抽出プロセス１０４ａ、カウンタ生成プロセス１０４ｂ、回数計数プロセス１０４ｃ、カバレッジ情報算出プロセス１０４ｄとなる。なお、枠組み抽出プロセス１０４ａは、図２に示した枠組み抽出部２１に対応し、同様に、カウンタ生成プロセス１０４ｂは、カウンタ生成部２２に対応する。また、回数計数プロセス１０４ｃは、図２に示した回数計数部２３に対応し、カバレッジ情報算出プロセス１０４ｄは、カバレッジ情報算出部２４に対応する。
【００７４】
また、ＨＤＤ１０２には、プログラムテーブル１０２ａと、枠組みカウンタテーブル１０２ｂと、カバレッジ情報テーブル１０２ｃとが設けられる。プログラムテーブル１０２ａは、図２に示したプログラムＤＢ１６に対応し、枠組みカウンタテーブル１０２ｂは、枠組みカウンタＤＢ１７に対応し、カバレッジ情報テーブル１０２ｃは、カバレッジ情報ＤＢ１８に対応する。
【００７５】
ところで、上記したプログラム１０３ａ〜１０３ｄは、必ずしもＲＯＭ１０３に記憶させておく必要はない。例えば、プログラム１０３ａ〜１０３ｄは、コンピュータシステム１００に挿入されるフレキシブルディスク（ＦＤ）、ＣＤ−ＲＯＭ、ＭＯディスク、ＤＶＤディスク、光磁気ディスク、ＩＣカードなどの「可搬用の物理媒体」に記憶させておくようにしてもよい。また、コンピュータシステム１００の内外に備えられるハードディスクドライブ（ＨＤＤ）などの「固定用の物理媒体」に記憶させておいてもよい。さらに、公衆回線、インターネット、ＬＡＮ、ＷＡＮなどを介してコンピュータシステム１００に接続される「他のコンピュータシステム」に記憶させておいてもよい。そして、コンピュータシステム１００がこれらからプログラムを読み出して実行するようにしてもよい。
【００７６】
すなわち、この他の実施例でいうプログラムは、上記した「可搬用の物理媒体」、「固定用の物理媒体」、「通信媒体」などの記録媒体に、コンピュータ読み取り可能に記録されるものである。そして、コンピュータシステム１００は、このような記録媒体からプログラムを読み出して実行することで上記した実施例と同様の機能を実現する。なお、この他の実施例でいうプログラムは、コンピュータシステム１００によって実行されることに限定されるものではない。例えば、他のコンピュータシステムまたはサーバがプログラムを実行する場合や、これらが協働してプログラムを実行するような場合にも、本発明を同様に適用することができる。
【００７７】
以上の各実施例を含む実施形態に関し、さらに以下の付記を開示する。
【００７８】
（付記１）カバレッジ情報の算出対象であるプログラムに含まれるコードの枠組み毎に設けられたカウンタを用いて、該プログラムを実行した場合に該枠組みが実行された回数を計数する回数計数手順と、
前記カウンタが設けられた枠組みの数と、前記回数計数手順によって実行回数が計数された枠組みの数とから、カバレッジ情報を算出するカバレッジ情報算出手順と
をコンピュータに実行させることを特徴とするカバレッジ情報算出プログラム。
【００７９】
（付記２）前記プログラムを実行する前に、前記プログラムに含まれるコードの枠組みを抽出する枠組み抽出手順と、
前記枠組み抽出手順によって抽出された枠組み毎に、該枠組みが実行された回数を計数するカウンタを生成するカウンタ生成手順とをさらにコンピュータに実行させることを特徴とする付記１に記載のカバレッジ情報算出プログラム。
【００８０】
（付記３）前記カバレッジ情報算出手順は、前記枠組み抽出手順によって抽出された枠組みの数における前記回数計数手順によって実行回数が計数された枠組みの数の割合を示すプログラムの実行網羅率を、前記カバレッジ情報として算出することを特徴とする付記２に記載のカバレッジ情報算出プログラム。
【００８１】
（付記４）カバレッジ情報の算出対象であるプログラムに含まれるコードの枠組み毎のカウンタを記憶するカウンタ記憶部と、
前記カウンタ記憶部に記憶される枠組み毎のカウンタを用いて、前記プログラムを実行した場合に該枠組みが実行された回数を計数する回数計数部と、
前記カウンタ記憶部に記憶されるカウンタが設けられた枠組みの数と、前記回数計数部によって実行回数が計数された枠組みの数とから、カバレッジ情報を算出するカバレッジ情報算出部と
を有することを特徴とするカバレッジ情報算出装置。
【００８２】
（付記５）前記プログラムを実行する前に、前記プログラムに含まれるコードの枠組みを抽出する枠組み抽出部と、
前記枠組み抽出部によって抽出された枠組み毎に、前記カウンタを生成して前記カウンタ記憶部に格納するカウンタ生成部とをさらにコンピュータに実行させることを特徴とする付記４に記載のカバレッジ情報算出装置。
【００８３】
（付記６）前記カバレッジ情報算出部は、前記枠組み抽出部によって抽出された枠組みの数における前記回数計数部によって実行回数が計数された枠組みの数の割合を示すプログラムの実行網羅率を、前記カバレッジ情報として算出することを特徴とする付記５に記載のカバレッジ情報算出装置。
【００８４】
（付記７）カバレッジ情報の算出対象であるプログラムに含まれるコードの枠組み毎に設けられたカウンタを用いて、該プログラムを実行した場合に該枠組みが実行された回数を計数する回数計数工程と、
前記カウンタが設けられた枠組みの数と、前記回数計数工程によって実行回数が計数された枠組みの数とから、カバレッジ情報を算出するカバレッジ情報算出工程と
を含んだことを特徴とするカバレッジ情報算出方法。
【００８５】
（付記８）前記プログラムを実行する前に、前記プログラムに含まれるコードの枠組みを抽出する枠組み抽出工程と、
前記枠組み抽出工程によって抽出された枠組み毎に、前記カウンタを生成するカウンタ生成工程とをさらにコンピュータに実行させることを特徴とする付記７に記載のカバレッジ情報算出方法。
【００８６】
（付記９）前記カバレッジ情報算出工程は、前記枠組み抽出工程によって抽出された枠組みの数における前記回数計数工程によって実行回数が計数された枠組みの数の割合を示すプログラムの実行網羅率を、前記カバレッジ情報として算出することを特徴とする付記８に記載のカバレッジ情報算出方法。
【符号の説明】
【００８７】
１  カバレッジ情報算出装置
１ａ  回数計数部
１ｂ  カバレッジ情報算出部
２  プログラムソースコード
３  カバレッジ情報
１０  カバレッジ情報算出装置
１１  通信制御Ｉ／Ｆ部
１２  入力部
１３  表示部
１５  記憶部
１６  プログラムＤＢ
１７  枠組みカウンタＤＢ
１８  カバレッジ情報ＤＢ
２０  制御部
２１  枠組み抽出部
２２  カウンタ生成部
２３  回数計数部
２４  カバレッジ情報算出部
【図１】
2011113474.tif 000003
【図２】
2011113474.tif 000004
【図３】
2011113474.tif 000005
【図４】
2011113474.tif 000006
【図５】
2011113474.tif 000007
【図６】
2011113474.tif 000008
【図７】
2011113474.tif 000009
【図８】
2011113474.tif 000010
【図９】
2011113474.tif 000011
【図１０】
2011113474.tif 000012
【図１１】
2011113474.tif 000013
【図１２】
2011113474.tif 000014