(19)【発行国】日本国特許庁(JP)
(12)【公報種別】公開特許公報(A)
(11)【公開番号】P2024109206
(43)【公開日】2024-08-14
(54)【発明の名称】カバレッジ測定装置およびカバレッジ測定方法
(51)【国際特許分類】
G06F 11/36 20060101AFI20240806BHJP
G06F 8/30 20180101ALI20240806BHJP
【FI】
G06F11/36 176
G06F8/30
【審査請求】未請求
【請求項の数】5
【出願形態】OL
(21)【出願番号】P 2023013877
(22)【出願日】2023-02-01
(71)【出願人】
【識別番号】000005234
【氏名又は名称】富士電機株式会社
(74)【代理人】
【識別番号】110004185
【氏名又は名称】インフォート弁理士法人
(74)【代理人】
【識別番号】100121083
【弁理士】
【氏名又は名称】青木 宏義
(74)【代理人】
【識別番号】100138391
【弁理士】
【氏名又は名称】天田 昌行
(74)【代理人】
【識別番号】100132067
【弁理士】
【氏名又は名称】岡田 喜雅
(74)【代理人】
【識別番号】100131521
【弁理士】
【氏名又は名称】堀口 忍
(72)【発明者】
【氏名】内田 修平
(72)【発明者】
【氏名】深井 悠介
(72)【発明者】
【氏名】坂野 正太郎
【テーマコード(参考)】
5B042
5B376
【Fターム(参考)】
5B042HH18
5B042HH30
5B042LA02
5B042MA08
5B042MA13
5B042MC13
5B376BC31
5B376BC61
(57)【要約】
【課題】メモリサイズに制約があるデバイスにおいてソースコードのカバレッジを適切に測定できる方法を提供する。
【解決手段】カバレッジ測定装置は、ソースコードのカバレッジを測定するために、分配部、生成部、カバレッジ実行部、結合部を備える。分配部は、ソースコードを構成する複数のソースコードファイルを複数のグループに分配する。生成部は、グループ毎に、分配部により分配されたソースコードファイルに対応するカバレッジ測定用情報が埋め込まれたロードモジュールを生成する。カバレッジ実行部は、グループ毎に、ロードモジュールをコンピュータに実行させてカバレッジデータを取得する。結合部は、複数のカバレッジデータを結合する。分配部は、各グループのロードモジュールがコンピュータ上で実行可能となるように、複数のソースコードファイルを複数のグループに分配する。
【選択図】
図2
【特許請求の範囲】
【請求項1】
コンピュータ上で動作するロードモジュールのソースコードのカバレッジを測定するカバレッジ測定装置であって、
前記ソースコードを構成する複数のソースコードファイルを複数のグループに分配する分配部と、
前記複数のグループそれぞれに対して、前記分配部により分配されたソースコードファイルに対応するカバレッジ測定用情報が埋め込まれた、前記ソースコードのロードモジュールを生成する生成部と、
前記複数のグループそれぞれに対して生成されたロードモジュールを前記コンピュータに実行させて複数のカバレッジデータを取得するカバレッジ実行部と、
前記複数のカバレッジデータを結合する結合部と、を備え、
前記分配部は、各グループに対して生成されるロードモジュールが、前記コンピュータ上で実行可能となるように、前記複数のソースコードファイルを前記複数のグループに分配する
ことを特徴とするカバレッジ測定装置。
【請求項2】
前記分配部は、
前記複数のソースコードファイルの中から選択した1以上のソースコードファイルのステップ数の合計が前記ソースコードの総ステップ数に対して指定された割合となるように、前記複数のソースコードファイルの中から1以上のソースコードファイルを選択する第1の工程と、
前記第1の工程で選択したソースコードファイルに対応するカバレッジ測定用情報が埋め込まれたロードモジュールを前記生成部に生成させる第2の工程と、
前記第2の工程で生成されたロードモジュールを前記コンピュータ上で実行可能か否かを判定する第3の工程と、
前記第3の工程の判定結果に応じて前記割合を変更する第4の工程と、
前記割合が所定の範囲に収束するまで、前記第1~第4の工程を繰り返し実行する第5の工程と、
前記所定の範囲に収束した割合に基づいて、前記複数のソースコードファイルを前記複数のグループに分配する第6の工程と、を実行する
ことを特徴とする請求項1に記載のカバレッジ測定装置。
【請求項3】
前記コンピュータにおいて前記ソースコードに割り当てられているメモリ容量は既知であり、
前記分配部は、
カバレッジ測定用情報が埋め込まれていないロードモジュール、または、前記複数のソースコードファイルの中から選択される1以上のソースコードファイルに対応するカバレッジ測定用情報が埋め込まれたロードモジュールである第1のロードモジュールを生成し、前記第1のロードモジュールのサイズを表す第1のサイズ値および前記第1のロードモジュールに埋め込まれたカバレッジ測定用情報に対応するソースコードファイルのステップ数を表す第1のステップ数のペアを取得する第1の工程と、
前記複数のソースコードファイルの中から選択される1以上のソースコードファイルに対応するカバレッジ測定用情報が埋め込まれた、前記第1のロードモジュールと異なる第2のロードモジュールを生成し、前記第2のロードモジュールのサイズを表す第2のサイズ値および前記第2のロードモジュールに埋め込まれたカバレッジ測定用情報に対応するソースコードファイルのステップ数を表す第2のステップ数のペアを取得する第2の工程と、
前記複数のソースコードファイルの中から選択される1以上のソースコードファイルに対応するカバレッジ測定用情報が埋め込まれた、前記第1および第2のロードモジュールと異なる第3のロードモジュールを生成し、前記第3のロードモジュールのサイズを表す第3のサイズ値および前記第3のロードモジュールに埋め込まれたカバレッジ測定用情報に対応するソースコードファイルのステップ数を表す第3のステップ数のペアを取得する第3の工程と、
横軸が前記ソースコードファイルのステップ数を表し、縦軸がメモリ使用量を表すグラフにおいて、前記第1のサイズ値および前記第1のステップ数のペア、前記第2のサイズ値および前記第2のステップ数のペア、および前記第3のサイズ値および前記第3のステップ数のペアに対する近似直線を求める第4の工程と、
前記近似直線および前記メモリ容量に基づいて、前記ソースコードの総ステップ数に対する、前記複数のソースコードファイルの中から選択される1以上のソースコードファイルのステップ数の合計の割合を決定する第5の工程と、
前記第5の工程で決定した割合に基づいて、前記複数のソースコードファイルを前記複数のグループに分配する第6の工程と、を実行する
ことを特徴とする請求項1に記載のカバレッジ測定装置。
【請求項4】
前記分配部は、
各ソースコードファイルについて、カバレッジ測定用情報を挿入すべき場所の数を求める第1の工程と、
各ソースコードファイルについて、前記カバレッジ測定用情報を挿入すべき場所の数に基づいて、前記カバレッジ測定用情報が埋め込まれることに起因して生じるロードモジュールのサイズの増加分を計算する第2の工程と、
前記コンピュータにおいて前記ソースコードに割り当てられているメモリ容量および前記カバレッジ測定用情報が埋め込まれない前記ソースコードのロードモジュールのサイズに基づいて、前記ロードモジュールの増加可能サイズを計算する第3の工程と、
前記第2の工程で各ソースコードファイルについて計算される増加分および前記第3の工程で計算される増加可能サイズに基づいて、前記複数のソースコードファイルを前記複数のグループに分配する第4の工程と、を実行する
ことを特徴とする請求項1に記載のカバレッジ測定装置。
【請求項5】
コンピュータ上で動作するロードモジュールのソースコードのカバレッジを測定するカバレッジ測定方法であって、
前記ソースコードを構成する複数のソースコードファイルを複数のグループに分配する第1の工程と、
前記複数のグループそれぞれに対して、前記第1の工程により分配されたソースコードファイルに対応するカバレッジ測定用情報が埋め込まれた、前記ソースコードのロードモジュールを生成する第2の工程と、
前記複数のグループそれぞれに対して生成されたロードモジュールを前記コンピュータに実行させて複数のカバレッジデータを取得する第3の工程と、
前記複数のカバレッジデータを結合する第4の工程と、を含み、
前記第1の工程において、各グループに対して生成されるロードモジュールが、前記コンピュータ上で実行可能となるように、前記複数のソースコードファイルを前記複数のグループに分配する
ことを特徴とするカバレッジ測定方法。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、ソースコードのカバレッジを測定する装置および方法に係わる。
【背景技術】
【0002】
ソフトウェアの品質を確保するために、多くのケースにおいて、カバレッジが測定される。カバレッジは、ソースコード全体に対してテストを実行した箇所の割合を表し、ソフトウェアの品質を定量的に認識するための重要な指標の1つである。なお、カバレッジの測定については、例えば、特許文献1に記載されている。
【先行技術文献】
【特許文献】
【0003】
【発明の概要】
【発明が解決しようとする課題】
【0004】
ソースコードのカバレッジを測定する際には、カバレッジ測定用のマーカーをロードモジュールに埋め込む必要があるので、ロードモジュールのサイズが大きくなってしまう。このため、組込機器などのメモリサイズに制約があるデバイスにおいては、カバレッジの測定時に、カバレッジ測定用のマーカーを含むロードモジュールがメモリに格納できなくなるおそれがある。
【0005】
本発明の1つの側面に係わる目的は、メモリサイズに制約があるデバイスにおいてもソースコードのカバレッジを適切に測定できる方法を提供することである。
【課題を解決するための手段】
【0006】
本発明の1つの態様のカバレッジ測定装置は、コンピュータ上で動作するロードモジュールのソースコードのカバレッジを測定する。このカバレッジ測定装置は、前記ソースコードを構成する複数のソースコードファイルを複数のグループに分配する分配部と、前記複数のグループそれぞれに対して、前記分配部により分配されたソースコードファイルに対応するカバレッジ測定用情報が埋め込まれた、前記ソースコードのロードモジュールを生成する生成部と、前記複数のグループそれぞれに対して生成されたロードモジュールを前記コンピュータに実行させて複数のカバレッジデータを取得するカバレッジ実行部と、前記複数のカバレッジデータを結合する結合部と、を備える。前記分配部は、各グループに対して生成されるロードモジュールが、前記コンピュータ上で実行可能となるように、前記複数のソースコードファイルを前記複数のグループに分配する。
【発明の効果】
【0007】
上述の態様によれば、メモリサイズに制約があるデバイスにおいてもソースコードのカバレッジを適切に測定できる。
【図面の簡単な説明】
【0008】
【
図2】本発明の実施形態に係わるカバレッジ測定方法の概要を説明する図である。
【
図3】本発明の第1の実施形態に係わるカバレッジ測定装置の一例を示す図である。
【
図4】ロードモジュール情報保存部に保存される情報の一例を示す図である。
【
図5】実行設定ファイルの記載内容の一例を示す図である。
【
図6】メモリの空き容量の計算値を取得するためのコマンドの処理の一例を示すフローチャートである。
【
図7】カバレッジ測定装置の処理の一例を示すフローチャートである。
【
図8】ソースコードファイルのグループ化の一例を示す図である。
【
図9】メモリ空き容量検出部の処理の一例を示すフローチャートである。
【
図10】メモリ空き容量検出部により更新されたロードモジュール情報保存部の一例を示す図である。
【
図11】分配部の処理の一例を示すフローチャートである。
【
図12】分割割合を決定する処理の一例を示すフローチャートである。
【
図13】分割割合を決定する手順の一例を示す図である。
【
図14】分割割合の決定時に更新されたロードモジュール情報保存部の一例を示す図である。
【
図15】グループ毎にロードモジュールを生成する処理の一例を示すフローチャートである。
【
図16】分配部により更新されたロードモジュール情報保存部の一例を示す図である。
【
図17】分割割合に基づくソースコードファイルのグループ化の一例を示す図である。
【
図18】カバレッジ実行部の処理の一例を示すフローチャートである。
【
図19】カバレッジデータ結合部の処理の一例を示すフローチャートである。
【
図20】カバレッジデータの結合の一例を示す図である。
【
図21】カバレッジ測定の対象となるソースコードのステップ数とメモリ使用量との関係を示す図である。
【
図22】第2の実施形態において分割割合を決定する方法の一例を示すフローチャートである。
【
図23】第2の実施形態において分割割合を決定する方法の実施例を示す図である。
【
図24】カバレッジ測定用マーカーを挿入する場所を検出する方法の一例を示す図である。
【
図25】ロードモジュールのサイズの計算の一例を示す図である。
【
図26】カバレッジ測定の対象とすることに起因する、ロードモジュールのサイズの増加分を示す図である。
【
図27】第3の実施形態におけるグループ化の一例を示す図である。
【
図28】第3の実施形態におけるグループ化の他の例を示す図である。
【
図29】第3の実施形態においてソースコードファイルを複数のグループに分配する方法の一例を示すフローチャートである。
【
図30】カバレッジ測定装置のハードウェア構成の一例を示す図である。
【発明を実施するための形態】
【0009】
図1は、カバレッジ測定の一例を示す。この例では、ソースコード1は、組込機器2に実装されるオペレーティングシステムを記述している。また、組込機器2は、メモリ3を備える。
【0010】
ソースコード1のカバレッジを測定する際には、ビルド時に、カバレッジ測定用マーカーが埋め込まれる。すなわち、ロードモジュールは、カーネル本体およびカバレッジ測定用マーカーを含む。このため、カバレッジの測定時には、カバレッジの測定を行わないときと比較して、ロードモジュールのサイズが大きくなる。そして、組込機器2においてこのロードモジュールを実行することにより、ソースコード1のカバレッジが測定される。
【0011】
但し、組込機器2は、多くのケースにおいて、小型化/低コスト化を実現するために、小容量のメモリが実装される。ここで、メモリ領域は、通常、用途(オペレーティングシステムのカーネル、アプリケーションプログラム、アプリケーションデータ等)に応じて分割される。また、アプリケーションプログラム/データのための領域を大きくすることが要求される。このため、カバレッジ測定用マーカーを含むロードモジュールのサイズに合わせてカーネル用領域を大きく設計することは好ましくない。ここで、この問題は、例えば、カバレッジの測定時にカーネル用領域を一時的に大きくすれば、解決され得る。しかし、この場合、組込機器2が実際に動作するときと異なる環境で測定が行われるので、カバレッジ測定の信頼性が低下してしまう。
【0012】
このように、メモリサイズに制約があるデバイス(ここでは、組込機器2)において、カバレッジ測定に必要なマーカー等が埋め込まれたロードモジュールを格納するメモリ領域を確保する方法が求められる。そこで、本発明の実施形態に係わるカバレッジ測定装置は、この課題を解決する機能を備える。
【0013】
図2は、本発明の実施形態に係わるカバレッジ測定方法の概要を説明する図である。この実施例では、ソースコード1は、組込機器2に実装されるオペレーティングシステムを記述している。なお、ソースコード1は、複数のソースコードファイルSC1~SCnから構成される。また、ソースコードファイルSC1~SCnのカバレッジをそれぞれ測定するためのカバレッジ測定用マーカーCM1~CMnが用意されているものとする。
【0014】
ソースコード1のカバレッジを測定する際には、ソースコードファイルSC1~SCnのうちから1または複数のソースコードファイルが選択される。そして、ソースコード1のビルド時に、選択されたソースコードファイルに対応するカバレッジ測定用マーカーがロードモジュールに埋め込まれる。このとき、カーネル本体および選択されたソースコードファイルに対応するカバレッジ測定用マーカーを含むロードモジュールのサイズが、組込機器2のメモリ容量を超えないように、1または複数のソースコードファイルが選択される。ソースコードファイルの選択は、メモリ3の空き容量、ロードモジュール中のカーネル本体のサイズ、各カバレッジ測定用マーカーCM1~CMnに起因して生じるロードモジュールのサイズの増加分などに基づいて決定される。どのソースコードファイルを選択するのかは、例えば、カバレッジ設定ファイルにより指定される。この場合、選択したソースコードファイルに対して「有効」が設定され、選択しなかったソースコードファイルに対して「無効」が設定される。そして、ソースコード1からロードモジュールを生成するソフトウェアは、この設定に従って、対応するカバレッジ測定用マーカーをロードモジュールに埋め込む。
【0015】
図2に示す実施例では、ソースコード1のビルド時に、まず、ソースコードファイルSC1が選択され、対応するカバレッジ測定用マーカーCM1がロードモジュールに埋め込まれる。これにより、ロードモジュールLM1が生成される。なお、ロードモジュールLM1に含まれる「カーネル本体」は、ソースコード1全体に対応する。そして、組込機器2においてロードモジュールLM1を実行することにより、ソースコードファイルSC1についてのカバレッジデータCD1が作成される。
【0016】
同様に、各ソースコードファイルSC1~SCnが少なくとも1回選択されるように、上述の手順が繰り返し実行される。これにより、複数のカバレッジデータが作成される。
図2に示す例では、ソースコードファイルSC1~SCnが1つずつ順番に選択され、カバレッジデータCD1~CDnが作成されている。この後、カバレッジデータCD1~CDnを結合することにより、ソースコード1全体に対するカバレッジ測定結果が作成される。
【0017】
このように、本発明の実施形態に係わるカバレッジ測定方法によれば、ソースコード1を構成するソースコードファイルSC1~SCnが少なくとも1回は選択されるように、組込機器2のメモリ3の空き容量に応じて、1または複数のソースコードファイルが順次選択される。したがって、ソースコード1のサイズに合わせてメモリ3の容量を可能な限り小さく抑えながら、ソースコード全体のカバレッジを適切に測定することができる。
【0018】
<第1の実施形態>
図3は、本発明の第1の実施形態に係わるカバレッジ測定装置の一例を示す。本発明の第1の実施形態に係わるカバレッジ測定装置10は、この実施例では、カバレッジ測定対象機器30に実装されるソフトウェアのカバレッジを測定する。カバレッジ測定対象機器30は、CPU31およびメモリ32を備える。CPU31は、ロードモジュール41に記述されている処理を実行することができる。メモリ32は、プログラムおよびデータを保存することができる。なお、メモリ32は、この実施例では、不揮発性メモリおよびRAM等の揮発性メモリを含むものとする。カバレッジ測定対象機器30は、コンピュータを含む組込機器であってもよい。
【0019】
カバレッジ測定装置10は、
図3に示すように、ビルド用ソフトウェア11、ロードモジュール格納部12、ロードモジュール情報保存部13、カバレッジデータ保存部14、メモリ空き容量検出部15、分配部16、カバレッジ実行部17、およびカバレッジデータ結合部18を備える。なお、カバレッジ測定装置10は、
図3に示していない他の機能をさらに備えてもよい。
【0020】
カバレッジ測定装置10には、ソースコード21、測定対象外パス設定ファイル22、実行設定ファイル23、およびカバレッジ測定用ソフトウェア24が与えられる。なお、
図3に示していない他のファイル、データ、または情報がカバレッジ測定装置10にさらに与えられてもよい。
【0021】
ビルド用ソフトウェア11は、カバレッジ測定対象機器30において実行可能なロードモジュール41をビルドするためのソフトウェアであり、コンパイラを含む。ロードモジュール格納部12は、1または複数のロードモジュール41を格納するための領域に相当する。
【0022】
ロードモジュール情報保存部13は、カバレッジ測定の対象となるソースコードの名称などを格納する領域に相当する。具体的には、ロードモジュール情報保存部13には、例えば、下記の情報が格納される。
(1)カバレッジ測定の対象となるソースコードのパス。このパスは、ソースコード21を構成する複数のソースコードファイルの中で、カバレッジ測定の対象となる1または複数のソースコードファイルを表す。
(2)全ステップ数に対するカバレッジ測定対象ステップ数の割合。なお、この割合は、上記(1)のパスにより指定されるソースコードファイルのステップ数の合計を、ソースコード21の全ステップ数で割算することで計算される。
(3)メモリ32の空き容量。この空き容量は、カバレッジ測定対象機器30にロードモジュール41を格納したときのメモリ32の空き容量を表してもよい。なお、メモリ32の空き容量を管理する代わりに、不揮発性メモリの空き容量およびRAMの空き容量を個々に管理することも可能であるが、この明細書では、記載を簡潔にするために、不揮発性メモリの空き容量およびRAMの空き容量をまとめて「メモリ32の空き容量」として管理するものとする。
(4)ロードモジュール41のパス。このパスは、カバレッジ測定装置10においてロードモジュール41が格納される領域を表す。
(5)実行可否情報。この情報は、カバレッジ測定対象機器30においてロードモジュール41の実行が成功したか否かを表す。
(6)カバレッジデータ42のパス。このパスは、カバレッジ測定対象機器30においてカバレッジデータ42が格納される領域を表す。
【0023】
ロードモジュール情報保存部13に保存される情報の一例を
図4に示す。なお、
図4に示す項目(1)~(6)は、それぞれ上記(1)~(6)に対応する。
【0024】
カバレッジデータ保存部14は、カバレッジデータ42を保存する。メモリ空き容量検出部15は、カバレッジ測定対象機器30に実装されているメモリ32の空き容量を検出する。分配部16は、ソースコード21を構成する複数のソースコードファイルの中から選択されるソースコードファイルに対応するカバレッジ測定用マーカーが埋め込まれたロードモジュールのサイズが、メモリ32の空き容量を超えないように、複数のソースコードファイルを複数のグループに分配する。カバレッジ実行部17は、カバレッジ測定対象機器30にロードモジュール41を実行させる。これにより、カバレッジデータ42が作成される。このとき、分配部16により指定されるグループ毎にロードモジュールが実行される。よって、複数のカバレッジデータ42が作成される。カバレッジデータ結合部18は、複数のカバレッジデータ42を結合することによりカバレッジ測定結果51を出力する。
【0025】
ソースコード21は、カバレッジ測定対象機器30において実行されるロードモジュール41の元となるソースコードに相当する。この実施例では、ソースコード21は、複数のソースコードファイルから構成される。測定対象外パス設定ファイル22は、ソースコード21を構成する複数のソースコードファイルのうち、カバレッジ測定を行わないソースコードファイルの格納領域を指定するパスを記述する。
【0026】
実行設定ファイル23は、カバレッジ測定対象機器30においてロードモジュールを実行するために必要な情報を表す。実行設定ファイル23は、例えば、下記の情報を含む。
(1)カバレッジ測定対象機器30に接続するための情報。この情報は、IPアドレス、ポート番号、ログインID、パスワードなどを含む。
(2)カバレッジ測定対象機器30においてカバレッジ測定用ソフトウェア24を保存する領域(ファイルのパスなど)。
(3)メモリ32の空き容量の計算値を取得するためのコマンド。このコマンドは、カバレッジ測定装置10において実行される。
【0027】
実行設定ファイル23の記載内容の一例を
図5に示す。なお、
図5に示す項目(1)~(3)は、それぞれ上記(1)~(3)に対応する。
【0028】
図6は、メモリ32の空き容量の計算値を取得するためのコマンドの処理の一例を示すフローチャートである。S1において、カバレッジ測定装置10は、メモリ32におけるプログラム領域サイズおよびデータ領域サイズを表す情報を取得する。このとき、各領域のサイズは、ロードモジュール41のビルドにより作成されたメモリマップファイルの記述から取得してもよい。そして、S2において、カバレッジ測定装置10は、メモリ32のサイズから、プログラム領域サイズおよびデータ領域サイズの合計を減算する。このとき、メモリ32のサイズが仕様等により決まっているケースでは、その値を取得してもよい。或いは、dfコマンドを用いてカバレッジ測定対象機器30から取得してもよい。
【0029】
カバレッジ測定用ソフトウェア24は、カバレッジの測定時にカバレッジ測定対象機器30において実行されるプログラムであり、例えば、オペレーティングシステムのシステムコールを一通り実行する試験プログラムである。カバレッジ測定結果51は、ソースコード21の中で試験が実行された割合を表す。なお、カバレッジ測定結果51は、図表を含むHTMLファイルであってもよい。
【0030】
図7は、カバレッジ測定装置10の処理の一例を示すフローチャートである。このフローチャートの処理は、例えば、カバレッジ測定装置10にソースコード21が与えられたときに実行される。
【0031】
S11において、カバレッジ測定装置10は、メモリ32の空き容量を検出する。S12において、カバレッジ測定装置10は、ソースコード21を構成する複数のソースコードファイルをグループ化する。このとき、カバレッジ測定装置10は、ソースコードファイルに対応するカバレッジ測定用情報(例えば、カバレッジ測定用マーカー)が埋め込まれたときのソースコード21のロードモジュールのサイズが、メモリ32の空き容量を超えないように、複数のソースコードファイルを複数のグループに分配する。なお、カバレッジ測定用マーカーが埋め込まれたロードモジュールのサイズは、例えば、埋め込まれたカバレッジ測定用マーカーに対応するソースコードファイルのステップ数に基づいて推定される。
【0032】
S13において、カバレッジ測定装置10は、各グループについてロードモジュールを生成する。S14において、カバレッジ測定装置10は、各グループのカバレッジデータを取得する。このとき、カバレッジ測定対象機器30がカバレッジ測定用ソフトウェア24を用いて各ロードモジュールを実行することにより、複数のカバレッジデータが作成される。そして、S15において、カバレッジ測定装置10は、複数のカバレッジデータを結合する。これにより、カバレッジ測定結果51が作成される。
【0033】
図8は、ソースコードファイルのグループ化の一例を示す。この例では、ソースコード21は、8個のソースコードファイルSC1~SC8から構成されている。また、ソースコードファイルSC1~SC8に対して、それぞれ、カバレッジ測定用マーカーCM1~CM8が用意されているものとする。
【0034】
カバレッジ測定装置10は、ソースコード21全体(
図8では、カーネル本体)および1または複数のカバレッジ測定用マーカーから構成されるロードモジュールが、メモリ32の空き容量を超えない範囲で可能な限り大きくなるように、ソースコードファイルを選択する。この実施例では、カーネル本体およびカバレッジ測定用マーカーCM1~CM3から構成されるロードモジュールが上記条件を満たしている。したがって、カバレッジ測定用マーカーCM1~CM3に対応するソースコードファイルSC1~SC3が1つのグループを形成する。同様に、ソースコードファイルSC4~SC5が1つのグループを形成し、ソースコードファイルSC6~SC8が1つのグループを形成する。
【0035】
ソースコード21のビルド時に、カバレッジ設定ファイルにより、各グループに対応する処理が指示される。例えば、ソースコードファイルSC1~SC3に対応するグループに対する処理の際には、カバレッジ設定ファイルは、ソースコードファイルSC1~SC3に対するカバレッジ測定が有効である情報を含む。この場合、ソースコード21のビルド時に、ソースコードファイルSC1~SC3に対応するカバレッジ測定用マーカーCM1~CM3が埋め込まれる。他のグループについても同様である。
【0036】
ここで、このビルド処理により生成されるロードモジュールのサイズは、メモリ32の空き容量を超えない。よって、カバレッジ測定対象機器30において、グループ毎に、カバレッジを適切に測定できる。また、各ロードモジュールのサイズは、メモリ32の空き容量を超えない範囲で可能な限り大きくなるように決定されている。したがって、カバレッジ測定対象機器30において実行すべきロードモジュールの個数が少なくなり、測定時間を短縮できる。
【0037】
図9は、メモリ空き容量検出部15の処理の一例を示すフローチャートである。S21において、メモリ空き容量検出部15は、ビルド用ソフトウェア11を使用し、ソースコード21からロードモジュール41をビルドする。このとき、ロードモジュール41は、カバレッジ測定用マーカーを含まない。そして、ロードモジュール41は、ロードモジュール格納部12に格納される。
【0038】
S22において、メモリ空き容量検出部15は、ロードモジュール41に係わるデータをロードモジュール情報保存部13に追加する。
図10に示す例では、「カバレッジ測定の対象となるソースコードのパス」「全ステップ数に対するカバレッジ測定対象ステップ数の割合」「ロードモジュール41のパス」「カバレッジデータ42のパス」が書き込まれる。なお、「全ステップ数に対するカバレッジ測定対象ステップ数の割合」には、初期値としてゼロが設定される。
【0039】
S23において、メモリ空き容量検出部15は、メモリ容量取得コマンドを実行してメモリ32の空き容量を検出する。そして、検出した値をロードモジュール情報保存部13に追加する。S24において、メモリ空き容量検出部15は、カバレッジ測定用ソフトウェア24をカバレッジ測定対象機器30上で実行させる。この実行結果は、ロードモジュール情報保存部13に書き込まれる。
【0040】
図11は、分配部16の処理の一例を示すフローチャートである。S31において、分配部16は、ソースコード21についての分割割合Pを決定する。分割割合Pは、ソースコード21を構成する複数のソースコードファイルを複数のグループにほぼ均等に分配する際に、ソースコード21全体のステップ数に対する、各グループに属するソースコードファイルのステップ数の合計の割合を表す。したがって、例えば、S31で決定される分割割合Pが「0.25」であれば、ソースコード21を構成する複数のソースコードファイルは、4個のグループに分配される。分割割合Pを決定する方法については、後で説明する。
【0041】
S32において、分配部16は、各グループについて、当該グループ内のソースコードファイルに対してカバレッジ測定を有効に設定する。これにより、各グループについて、ソースコード21および当該グループ内のソースコードファイルに対応するカバレッジ測定用マーカーからロードモジュールがビルドされる。
【0042】
図12は、分割割合Pを決定する処理の一例を示すフローチャートである。このフローチャートの処理は、
図11のS31に相当する。
【0043】
S41において、分配部16は、分割割合Pを初期化する。この実施例では分割割合Pの初期値は「1」であるが、ゼロから1の間の任意の値に初期化してもよい。S42において、分配部16は、ソースコード21全体のステップ数を求める。このとき、カバレッジ測定の対象でないソースコードファイルは含まないものとする。すなわち、カバレッジ測定の対象として指定されているソースコードファイルのステップ数の合計がカウントされる。なお、ソースコード21の検証者は各ソースコードファイルについて、カバレッジ測定の対象とするか否かを指定できる。
【0044】
S43において、分配部16は、分割割合Pに応じて1または複数のソースコードファイルを選択する。このとき、ソースコード21全体のステップ数および各ソースコードファイルのステップ数に基づいて、1または複数のソースコードファイルが選択される。一例として、ソースコード21全体のステップ数が「10万ステップ」であり、分割割合Pが「0.2」であるときは、2万ステップ分のソースコードファイルが選択される。
【0045】
S44において、分配部16は、S43で選択したソースコードファイルについてカバレッジ測定が行われるようにロードモジュールを生成する。このとき、選択したソースコードファイルが有効であることを表す情報がビルド用ソフトウェア11に与えられる。そうすると、選択したソースコードファイルに対応するカバレッジ測定用マーカーが埋め込まれたロードモジュールがビルドされる。ビルドされたロードモジュールは、ロードモジュール格納部12に格納される。また、このロードモジュールに係わる情報がロードモジュール情報保存部13に追加される。
【0046】
S45において、分配部16は、メモリ32の空き容量を確認する。S46において、分配部16は、S44で生成したロードモジュールをカバレッジ測定対象機器30上で実行できるか否かを判定する。このとき、実行設定ファイル23(特に、(1)カバレッジ測定対象機器30に接続するための情報)に従って、ロードモジュールがカバレッジ測定対象機器30に実装され、カバレッジ測定対象機器30が再起動される。これにより、カバレッジ測定対象機器30に配置されたロードモジュールが実行される。そして、分配部16は、再起動が正常に完了したか否かを確認する。再起動が正常に完了したときには、「実行結果:可(または、成功)」を取得する。また、再起動が正常に完了しなかったときには、「実行結果:否(または、失敗)」を取得する。尚、再起動が正常に完了したときは、ロードモジュールのサイズがメモリ32の空き容量より小さいと推定される。一方、再起動が正常に完了しなかったときは、ロードモジュールのサイズがメモリ32の空き容量より大きい可能性があると判定される。
【0047】
S47において、分配部16は、再起動の実行結果に応じて分割割合Pを更新する。このとき、再起動の実行結果が「可(または、成功)」であるときは、分配部16は分割割合Pを大きくする。また、再起動の実行結果が「否(または、失敗)」であるときは、分配部16は分割割合Pを小さくする。
【0048】
例えば、再起動後の実行結果が「可(または、成功)」であるときは、分割割合Pは、実行結果が「否(または、失敗)」であったときの分割割合Pの最小値と、現在の分割割合Pとの中間値に更新される。また、再起動の実行結果が「否(または、失敗)」であるときは、分割割合Pは、実行結果が「可(または、成功)」であったときの分割割合Pの最大値と、現在の分割割合Pとの中間値に更新される。
【0049】
S48において、分配部16は、更新前の分割割合Pと更新後の分割割合Pとの差分が所定の閾値より小さいか否かを判定する。すなわち、分割割合Pが所定の範囲内に収束したか否かを判定する。そして、この差分が所定の閾値以上であれば、分配部16の処理はS43に戻る。この後、上記差分が閾値より小さくなるまで、S43~S47の処理が繰り返し実行される。そして、上記差分が閾値より小さくなったときに、分割割合Pの値が確定する。
【0050】
図13は、分割割合Pを決定する手順の一例を示す。この実施例では、分割割合Pの初期値はゼロである。すなわち、「P1=0」が設定されて
図12に示すフローチャートの処理が実行される。
【0051】
分割割合Pは、ソースコード21全体のステップ数に対する、カバレッジ測定を実行すべきソースコードファイルのステップ数の合計を表す。したがって、分割割合P1がゼロであるときは、いずれのソースコードファイルに対してもカバレッジ測定を実行しない。すなわち、カバレッジ測定用マーカーが埋め込まれていないロードモジュールが生成され、カバレッジ測定対象機器30において実行される。ここでは、実行結果が成功であるものとする。この場合、分配部16は、分割割合Pを大きくする。この実施例では、分割割合P2として、現在の分割割合Pの値(すなわち、ゼロ)と分割割合Pがとり得る値の最大値(すなわち、1)との中間点である「0.5」が算出されるものとする。
【0052】
分割割合P2に対しては、ソースコード21全体のステップ数に対して50パーセント分のソースコードファイルが選択される。そして、選択したソースコードファイルに対応するカバレッジ測定用マーカーが埋め込まれたロードモジュールが生成され、カバレッジ測定対象機器30において実行される。ここで、実行結果が失敗であるものとする。この場合、分配部16は、分割割合Pを小さくする。この実施例では、分割割合P3として、現在の分割割合Pの値(すなわち、0.5)とロードモジュールの実行が成功したときの分割割合Pの最大値(すなわち、ゼロ)との中間点である「0.25」が算出される。
【0053】
分割割合P3に対しては、ソースコード21全体のステップ数に対して25パーセント分のソースコードファイルが選択される。そして、選択したソースコードファイルに対応するカバレッジ測定用マーカーが埋め込まれたロードモジュールが生成され、カバレッジ測定対象機器30において実行される。ここで、実行結果が成功であるものとする。この場合、分配部16は、分割割合Pを大きくする。この実施例では、分割割合P4として、現在の分割割合Pの値(すなわち、0.25)とロードモジュールの実行が失敗したときの分割割合Pの最小値(すなわち、0.5)との中間点である「0.375」が算出される。
【0054】
分割割合P4に対しては、ソースコード21全体のステップ数に対して37.5パーセント分のソースコードファイルが選択される。そして、選択したソースコードファイルに対応するカバレッジ測定用マーカーが埋め込まれたロードモジュールが生成され、カバレッジ測定対象機器30において実行される。ここで、実行結果が成功であるものとする。この場合、分配部16は、分割割合Pを小さくする。この実施例では、分割割合P5として、現在の分割割合Pの値(すなわち、0.375)とロードモジュールの実行が成功したときの分割割合Pの最小値(すなわち、0.25)との中間点である「0.3125」が算出される。
【0055】
この後、更新前の分割割合Pと更新後の分割割合Pとの差分が所定の閾値より小さくなるまで同様の処理が繰り返し実行される。すなわち、分割割合Pが収束するまで同様の処理が繰り返し実行される。この例では、収束判定のための閾値は「0.01」であるものとする。この場合、分割割合P7と分割割合P8との差分が閾値より小さくなるので、最終的な分割割合Pとして「0.3359375」が得られる。
【0056】
なお、選択したソースコードファイルのステップ数の合計が分割割合Pに対応する値にならない場合には、所定の誤差を考慮して
図12に示すフローチャートの処理を実行してもよい。たとえば、ソースコード21全体のステップ数が100万であり、分割割合Pが0.1であり、許容誤差が1万ステップであるものとする。この場合、合計ステップ数が9万~11万となるように1または複数のソースコードファイルが選択される。或いは、「マイナス2パーセント」~「ゼロパーセント」の範囲で誤差を許容する場合には、合計ステップ数が8万~10万となるように1または複数のソースコードファイルが選択される。
【0057】
また、分配部16が
図12に示すフローチャートの処理を実行する過程で、随時、ロードモジュール情報保存部13が更新される。分配部16により更新されるロードモジュール情報保存部13の一例を
図14に示す。
【0058】
図15は、分割割合Pに応じて作成されるグループ毎にロードモジュールを生成する処理の一例を示すフローチャートである。このフローチャートの処理は、
図11のS32に相当する。すなわち、このフローチャートの処理が実行される前に、分割割合Pが決定されているものとする。
【0059】
S51において、分配部16は、測定対象集合Sを用意する。測定対象集合Sは、ソースコード21を構成するソースコードファイルのうち、カバレッジを測定すべきソースコードファイルの集合である。このとき、カバレッジを測定すべきソースコードファイルのすべてが測定対象集合Sの中に入れられてもよいし、後述するように、測定対象集合Sから一部のソースコードファイルを除外してもよい。
【0060】
S52において、分配部16は、分割割合Pに応じて測定対象集合Sから1または複数のソースコードファイルを選択する。例えば、ソースコード21全体のステップ数が100万であり、分割割合Pが0.25であるときは、各ソースコードファイルのステップ数の合計が25万となるように1または複数のソースコードファイルが選択される。
【0061】
S53~S55の処理は、
図12に示すS44~S46と実質的に同じである。すなわち、分配部16は、S52で選択したソースコードファイルについてカバレッジ測定が行われるようにロードモジュールを生成する。そして、分配部16は、このロードモジュールをカバレッジ測定対象機器30上で実行できるか否かを判定する。実行結果は、ロードモジュール情報保存部13に書き込まれる。
【0062】
S56において、分配部16は、測定対象集合Sを更新する。具体的には、分配部16は、S52において選択したソースコードファイルを測定対象集合Sから除外する。S57において、分配部16は、測定対象集合Sにソースコードファイルが残っているか否かを判定する。そして、測定対象集合Sにソースコードファイルが残っているときは、分配部16の処理はS52に戻る。この後、測定対象集合Sが空になるまで、S52~S56の処理が繰り返し実行される。そして、測定対象集合Sが空になると、分配部16の処理が終了する。
【0063】
このように、分配部16は、分割割合Pに応じて測定対象集合Sから1または複数のソースコードファイルを選択する処理を繰り返し実行する。この結果、ソースコード21を構成する複数のソースコードファイルが複数のグループに分配される。例えば、分割割合Pが0.25であるときは、ソースコード21を構成する複数のソースコードファイルが4個のグループに分配されることになる。
【0064】
なお、分配部16が
図15に示すフローチャートの処理を実行する過程で、随時、ロードモジュール情報保存部13が更新される。分配部16により更新されるロードモジュール情報保存部13の一例を
図16に示す。
【0065】
また、上述の実施例では、S51において、カバレッジを測定すべきソースコードファイルのすべてが測定対象集合Sの中に入れられるが、測定対象集合Sから一部のソースコードファイルを除外してもよい。例えば、
図12のS46において、再起動が正常に完了したか否かが判定される。すなわち、
図12に示す手順を繰り返し実行するループ処理において最後に判定が行われたソースコードファイルについては、再起動が正常に完了したか否かについての判定結果が残っているので、
図15に示すフローチャートの処理を実行する必要はない。よって、S51において、これらのソースコードファイルを測定対象集合Sに入れる必要はない。
【0066】
図17は、分割割合Pに基づくソースコードファイルのグループ化の一例を示す。この実施例では、ソースコード21は、ソースコードファイルSC1~SC9から構成されている。ソースコード21全体のステップ数は10000である。
図12に示す手順で計算された分割割合Pは0.4である。各ソースコードファイルSC1~SC9はいずれもカバレッジ測定の対象であり、そのステップ数は
図17に示す通りである。この場合、分配部16は、ステップ数の合計が4000となるように、ソースコードファイルSC1~SC9の中から1または複数のソースコードファイルを選択してグループ化する。一例としては、ステップ数の合計が4000を超えない範囲で可能な限り大きくなるように、1または複数のソースコードファイルが選択されてグループ化される。
【0067】
まず、ソースコードファイルSC1~SC9の中から1または複数のソースコードファイルが選択される。ここで、ソースコードファイルSC1~SC3の各ステップ数の合計が4000である。したがって、ソースコードファイルSC1~SC3が1つのグループを構成する。続いて、ソースコードファイルSC4~SC9の中から1または複数のソースコードファイルが選択される。ここで、ソースコードファイルSC4~SC7の各ステップ数の合計が4000である。したがって、ソースコードファイルSC4~SC7が1つのグループを構成する。さらに、ソースコードファイルSC8~SC9の中から1または複数のソースコードファイルが選択される。ここで、ソースコードファイルSC8~SC9の各ステップ数の合計が4000より少ない。したがって、ソースコードファイルSC8~SC9が1つのグループを構成する。このように、ソースコード21を構成するソースコードファイルSC1~SC9は、3個のグループG1~G3に分配される。
【0068】
図18は、カバレッジ実行部17の処理の一例を示すフローチャートである。なお、このフローチャートの処理を実行する前に、分配部16によりロードモジュールがビルドされて保存されているものとする。
【0069】
S61において、カバレッジ実行部17は、カバレッジ測定用ソフトウェア24を読み込んでカバレッジ測定対象機器30に設定する。この後、カバレッジ実行部17は、各ロードモジュールに対してS62~S65の処理を実行する。このとき、ロードモジュール情報保存部13において実行可否情報として「可(または、成功)」が記録されているロードモジュールのみに対してS62~S65の処理を実行してもよい。以下の記載では、S62~S65の処理を実行するロードモジュールを「処理対象ロードモジュール」と呼ぶことがある。
【0070】
S62において、カバレッジ実行部17は、ロードモジュール情報保存部13においてロードモジュール41のパスとして記録されているパスの値に従って処理対象ロードモジュールを読み出す。すなわち、
図15に示すS53でビルドされたロードモジュールが読み出される。
【0071】
S63において、カバレッジ実行部17は、処理対象ロードモジュールに対応するカバレッジデータを作成する。このとき、カバレッジ実行部17は、実行設定ファイル23を使用し、測定対象ロードモジュールをカバレッジ測定対象機器30に設定したうえで、カバレッジ測定用ソフトウェア24を実行させる。S64において、カバレッジ実行部17は、作成されたカバレッジデータをカバレッジデータ保存部14に保存する。S65において、カバレッジ実行部17は、S64においてカバレッジデータを保存した領域を表すパスを、ロードモジュール情報保存部13において、カバレッジデータ42のパスとして登録する。
【0072】
このように、カバレッジ実行部17は、各ロードモジュールに対応するカバレッジデータを取得する。ここで、各ロードモジュールは、
図11~
図17を参照して説明した各グループに対して生成される。したがって、各グループについてのカバレッジデータが作成される。
【0073】
図19は、カバレッジデータ結合部18の処理の一例を示すフローチャートである。なお、このフローチャートの処理を実行する前に、カバレッジ実行部17により複数のカバレッジデータが作成されてカバレッジデータ保存部14に保存されているものとする。
【0074】
S71において、カバレッジデータ結合部18は、カバレッジデータ保存部14から複数のカバレッジデータを読み出す。そして、S72において、カバレッジデータ結合部18は、複数のカバレッジデータを結合することによりカバレッジ測定結果51を作成する。カバレッジ測定結果51の作成および出力は、gcovおよびgenhtml等の既存のコマンドにより実現可能である。
【0075】
図20は、カバレッジデータの結合の一例を示す。この実施例では、ソースコード21を構成するソースコードファイルSC1~SC9が3個のグループG1~G3に分配されている。また、各グループG1~G3に対してロードモジュールが作成され、それぞれカバレッジの測定が行われている。この結果、各グループに対応するカバレッジデータが作成される。そして、カバレッジデータ結合部18は、これらのカバレッジデータを結合することでカバレッジ測定結果51を作成する。
【0076】
このように、本発明の第1の実施形態によれば、メモリ容量が小さいコンピュータ(例えば、組込機器)で実行されるプログラムのソースコードであっても、ソースコード全体のカバレッジを測定できる。
【0077】
<第2の実施形態>
第1の実施形態では、ソースコードのステップ数およびソースコードを構成する複数のソースコードファイルの各ステップ数に基づいて、それら複数のソースコードファイルが複数のグループに分配される。続いて、グループ毎にカバレッジ測定用マーカーが埋め込まれたロードモジュールがビルドされ、グループ毎にカバレッジデータが作成される。そして、複数のカバレッジデータを結合することで、ソースコード全体のカバレッジが測定される。
【0078】
ただし、第1の実施形態では、ロードモジュールを生成して実行する回数が多くなることがある。例えば、
図12に示す手順で分割割合Pを決定する際には、S43~S47の処理が繰り返し実行される。
図13に示す例では、S43~S47の処理が8回実行される。そして、S43~S47の処理において、ロードモジュールを生成して実行する必要がある。ここで、ソースコードのサイズが大きい場合、ロードモジュールを生成して実行するために長い時間を要する。そこで、本発明の第2の実施形態においては、ロードモジュールを生成および実行する回数を削減する。
【0079】
カバレッジ測定装置10の構成は、第1の実施形態および第2の実施形態において実質的に同じであり、
図3に示す通りである。第1の実施形態と第2の実施形態との差異は、分配部16の処理である。
【0080】
図21は、カバレッジ測定の対象となるソースコードのステップ数とメモリ使用量との関係を示す。横軸は、カバレッジ測定の対象となるソースコードのステップ数を表す。このステップ数は、ソースコード21全体のステップ数で正規化されている。即ち、「0」は、いずれのソースコードファイルに対してもカバレッジ測定を行わないケースを表す。また、「1」は、すべてソースコードファイルに対してカバレッジ測定を行うケースを表す。縦軸は、ソースコード21に対応するロードモジュールによるメモリ32の使用量を表す。この使用量は、ソースコード21に対応するロードモジュールを実装するために割り当てられているメモリ領域のサイズで正規化されている。すなわち、「1」は、割り当てられているメモリ領域がすべて使用される状態を表す。また、メモリ使用量が「1」を超える状態は、ロードモジュールのサイズがメモリ容量を超えていることを表す。
【0081】
いずれのソースコードファイルに対してもカバレッジ測定を行わないケース(即ち、ステップ数=0)においては、ソースコード21に対応するロードモジュールはカバレッジ測定用マーカーを含まない。この場合、ロードモジュールのサイズは最も小さくなり、メモリ使用量(使用率)は約0.5である。一部のソースコードファイルに対してカバレッジ測定を行うケースにおいては、そのソースコードファイルに対応するカバレッジ測定用マーカーがロードモジュールに埋め込まれる。このため、ロードモジュールのサイズが大きくなり、メモリ使用量は高くなる。そして、すべてのソースコードファイルに対してカバレッジ測定を行うケース(即ち、ステップ数=1)においては、すべてのソースコードファイルに対応するカバレッジ測定用マーカーがロードモジュールに埋め込まれので、ロードモジュールのサイズが最も大きくなる。この実施例では、メモリ使用量は約1.4である。
【0082】
メモリ使用量が「1」を超えると、ロードモジュールを実行できない。したがって、カバレッジ測定装置10は、ロードモジュールのサイズがメモリ32の空き容量を超えないように、カバレッジ測定を行うソースコードファイルを選択する必要がある。
【0083】
ここで、
図21に示すように、メモリ使用量は、カバレッジ測定の対象となるソースコードのステップ数に対して概ね比例する。したがって、この比例関係を利用すれば、ロードモジュールのサイズがメモリ32の空き容量を超えない範囲で可能な限り大きくなるように、カバレッジ測定の対象となるソースコードのステップ数を決定することができる。
図21に示す例では、カバレッジ測定の対象となるソースコードのステップ数が約0.5であるときに、対応するロードモジュールによるメモリ使用量が「1」より僅かに小さくなる。すなわち、対応するロードモジュールのサイズがメモリ32の空き容量より僅かに小さくなる。そこで、第2の実施形態においては、
図21に示す比例関係を利用して上述した分割割合Pを決定する。この実施例では、分割割合Pは0.5である。
【0084】
図22は、第2の実施形態において分割割合Pを決定する方法の一例を示すフローチャートである。なお、このフローチャートの処理は、
図12に示す手順の代わりに実行される。
【0085】
S81において、分配部16は、ソースコード21を処理するために割り当てられているメモリ領域内の空き容量を取得する。この空き領域は、例えば、ロードモジュールを生成する際に作成されたメモリマップファイルの記述から計算可能である。
【0086】
S82において、分配部16は、いずれのソースコードファイルに対してもカバレッジ測定を行わないケースでロードモジュールを生成する。この場合、ビルドされるロードモジュールは、カバレッジ測定用マーカーを含まない。そして、分配部16は、ビルドしたロードモジュールのサイズを計測する。以下では、このサイズを「Y1」と呼ぶことがある。
【0087】
S83において、分配部16は、ソースコード21を構成する複数のソースコードファイルの中から選択される一部のソースコードファイルに対してカバレッジ測定を行うケースにおいて、ロードモジュールを生成する。この場合、ビルドされるロードモジュールは、選択されたソースコードファイルに対応するカバレッジ測定用マーカーを含む。そして、分配部16は、ビルドしたロードモジュールのサイズを計測する。以下では、このサイズを「Y2」と呼ぶことがある。なお、選択されるソースコードファイルのステップ数の合計が、ソースコード21全体のステップ数の2分の1程度であることが好ましい。
【0088】
S84において、分配部16は、すべてのソースコードファイルに対してカバレッジ測定を行うケースでロードモジュールを生成する。この場合、ビルドされるロードモジュールは、すべてのソースコードファイルに対応するカバレッジ測定用マーカーを含む。そして、分配部16は、ビルドしたロードモジュールのサイズを計測する。以下では、このサイズを「Y3」と呼ぶことがある。
【0089】
S85において、分配部16は、
図23に示すように、カバレッジ測定の対象となるソースコードのステップ数とメモリ使用量との関係を表すグラフ上に、S82~S84で計測したY1~Y3をプロットする。そして、分配部16は、最小二乗法等により、Y1~Y3に対する近似直線を求める。
【0090】
S86において、分配部16は、S85で求めた近似直線を利用して分割割合Pを決定する。このとき、分配部16は、グラフ上にプロットした点(Y1~Y3)および近似直線より、標準偏差σを計算する。続いて、分配部16は、S85で求めた近似直線にマージンを与えることで、マージンを考慮した関数Fを求める。マージンは、例えば、3σである。そして、この関数を利用して、メモリ使用量が「1」となるステップ数を求めることで、分割割合Pを得る。
【0091】
図23を参照して分割割合Pを決定する手順を説明する。なお、横軸がx軸であり、縦軸がy軸であるものとする。そして、Y1~Y3から得られる近似直線が下記の通りであるものとする。
y=0.6805x + 0.523
また、標準偏差σおよび3σが以下の通りであるものとする。
σ=0.0549
3σ=0.165
そうすると、マージンを考慮した関数Fは以下の通りである。
y=0.6805x + 0.694
ここで、「y=1」を与えると、「x=0.449」が算出される。そして、このxの値が分割割合Pとして使用される。
【0092】
このように、第2の実施形態においては、分割割合Pを決定するためにロードモジュールを生成する回数が少なくなる。例えば、
図12~
図13に示す方法では、ロードモジュールのビルドおよび実行が8回行われる。これに対して、第2の実施形態においては、3回のビルドにより分割割合Pを決定することができる。
【0093】
なお、
図21~
図22に示す実施例では、3回のビルドにより(すなわち、異なる3個のロードモジュールを利用して)分割割合Pを決定しているが、第2の実施形態はこの手順に限定されるものではない。すなわち、4回以上のビルドにより(すなわち、異なる4個以上のロードモジュールを利用して)分割割合Pを決定してもよい。ビルドの回数を増やせば、近似直線の精度が高くなる。また、
図23に示す実施例では、いずれのソースコードファイルに対してもカバレッジ測定を行わないケースでY1が計測されているが、1または複数のソースコードファイルに対してカバレッジ測定を行うケースでY1を計測してもよい。
【0094】
この後、カバレッジ測定装置10は、決定した分割割合Pに基づいてソースコードファイルをグループ化し、第1の実施形態と同様の手順で、グループ毎にロードモジュールを生成してカバレッジを測定する。そして、グループ毎に得られるカバレッジデータを結合することでカバレッジ測定結果が作成される。
【0095】
<第3の実施形態>
第1の実施形態および第2の実施形態においては、カバレッジ測定の対象となるソースコードファイルのステップ数に基づいてソースコードファイルのグループ化が行われる。ただし、ソースコードファイルのサイズが小さいにもかかわらず、多数のカバレッジ測定用マーカーが必要にあることがある。或いは、ソースコードファイルのサイズが大きいにもかかわらず、少数のマーカーでカバレッジを測定できることもある。そこで、第3の実施形態においては、ソースコードファイル毎に、カバレッジ測定において必要なマーカーを挿入すべき場所の数を推定する。そして、カバレッジ測定用マーカーを挿入すべき場所の数に応じてソースコードファイルのグループ化が行われる。
【0096】
カバレッジ測定装置10の構成は、第1の実施形態および第3の実施形態において実質的に同じであり、
図3に示す通りである。第1の実施形態と第3の実施形態との差異は、分配部16の処理である。
【0097】
図24は、カバレッジ測定のためのマーカーを挿入する場所を検出する方法の一例を示す。カバレッジ測定のためのマーカーは、例えば、ソースコード中の条件分岐に対して設定される。よって、ソースコードにおいてパターンマッチングにより特定の文字列(例えば、C言語であれば、while、for、if、else、case、default等)を検索することで、カバレッジ測定のためのマーカーを挿入する場所を検出できる。この場合、grepコマンドを使用してもよい。この実施例では、ソースコード21はソースコードファイルSC1~SC15を含み、各ソースコードファイルSC1~SC15について、カバレッジ測定のためのマーカーを挿入する場所の数が求められている。
【0098】
図25は、ロードモジュールのサイズの計算の一例を示す。この実施例では、ソースコード21のために割り当てられているメモリのサイズ(あるいは、空き容量Z1)が10Gbである。ソースコード21内のすべてのソースコードファイル(
図24においては、SC1~SC15)がカバレッジ測定の対象であるときは、生成されるロードモジュールのサイズ(Z2)は15Gbである。ソースコード21内のいずれのソースコードファイルに対してもカバレッジ測定を行わないときは、生成されるロードモジュールのサイズは8Gbである。すなわち、ソースコード21の実コード部分に対応するロードモジュールのサイズ(Z3)は8Gbである。
【0099】
この場合、メモリの空き容量(Z1)と実コード部分に対応するロードモジュールのサイズ(Z3)との差分を計算することで、増加可能サイズ(Z4)が得られる。増加可能サイズ(Z4)は、ロードモジュール内にどれだけカバレッジ測定用マーカーを埋め込むことができるかを表し、この実施例では2Gbである。また、すべてのソースコードファイルがカバレッジ測定の対象であるときのロードモジュールのサイズ(Z2)と、実コード部分に対応するロードモジュールのサイズ(Z3)との差分を計算することで、カバレッジ測定に際して増加するサイズ(Z5)として7Gbが得られる。
【0100】
ここで、ソースコード21を構成する各ソースコードファイルSC1~SC15において、マーカーを挿入すべき場所の数が
図24に示す通りであるものとする。すなわち、ソースコード21全体のカバレッジを測定する際には、200個のマーカーを挿入する必要がある。この場合、カバレッジ測定に際して増加するサイズ(Z5)を、挿入すべきマーカーの総数で除算することにより、1個のマーカーを挿入することで増加するロードモジュールのサイズが計算される。具体的には、7Gbを200で除算することにより、1個のマーカーを挿入することで増加するロードモジュールのサイズとして、0.035Gbが算出される。したがって、ある1つのソースコードファイルをカバレッジ測定の対象とすることで増加するロードモジュールのサイズは、そのソースコードファイルにマーカーを挿入すべき場所の数に、0.035Gbを積算することで計算される。
【0101】
図26は、各ソースコードファイルについて計算した、カバレッジ測定の対象とすることで増加するロードモジュールのサイズを示す。例えば、ソースコードファイルSC1がカバレッジ測定の対象となる場合、ロードモジュールのサイズが0.7Gb増加し、ソースコードファイルSC2がカバレッジ測定の対象となる場合、ロードモジュールのサイズが0.07Gb増加することが予測される。また、ソースコードファイルSC1およびSC2がカバレッジ測定の対象となる場合、ロードモジュールのサイズが0.77Gb増加することが予測される。
【0102】
カバレッジ測定装置10の分配部16は、予想されるロードモジュールのサイズの増加分の合計が、
図25に示す増加可能サイズ(Z4)の範囲内で可能な限り大きくなるように、1または複数のソースコードファイルを選択する。
図25に示す例では、増加可能サイズ(Z4)は2Gbである。よって、分配部16は、予想されるロードモジュールのサイズの増加分の合計が、2Gbを超えない範囲で可能な限り大きくなるように、1または複数のソースコードファイルを選択する。
【0103】
例えば、分配部16は、予想される増加分の合計が2Gbを超えないように、ファイル番号が小さい方から順番に1つずつソースコードファイルを選択することでグループを作成してもよい。
図27に示す実施例では、ソースコードファイルSC1~SC3を選択すると、予想される増加分の合計が1.12Gbとなるが、ソースコードファイルSC1~SC4を選択すると、予想される増加分の合計が2Gbを超えてしまう。よって、この場合、ソースコードファイルSC1~SC3が1つのグループを形成する。続いて、ソースコードファイルSC4~SC6を選択すると、予想される増加分の合計が1.82Gbとなるが、ソースコードファイルSC4~SC7を選択すると、予想される増加分の合計が2Gbを超えてしまう。よって、この場合、ソースコードファイルSC4~SC6が1つのグループを形成する。同様に、すべてのソースコードファイルがいずれかのグループに分配されるように、各ソースコードファイルが順番に選択されていずれかのグループに分配される。
【0104】
この結果、5個のグループG1~G5が作成される。ここで、メモリ32の空き容量は10Gbであり、ソースコード21の実コード部分に対応するロードモジュールのサイズは8Gbである。また、各グループは、予想される増加分の合計が2Gbを超えなうように作成されている。したがって、各グループに対してビルドされるロードモジュールのサイズは、メモリ32の空き容量より小さくなる。すなわち、各グループのロードモジュールはカバレッジ測定対象機器30において正しく実行され、対応するカバレッジデータが作成される。
【0105】
なお、
図27に示す手順では、各グループのロードモジュールのサイズが均等にならないことがある。このため、ビルドされるロードモジュールの数が多くなるおそれがある。但し、ソースコード21を構成するソースコードファイルの数が多いときには、
図27に示す手順でも、各グループのロードモジュールのサイズが概ね均等になると考えられる。
【0106】
あるいは、この問題は、
図28に示すように、ソースコードファイルを複数のグループに分配する際に、ソースコードファイルを適切な順番で選択することで緩和される。例えば、予想される増加分が大きい方から順番にソースコードファイルを選択してもよい。ただし、大規模なプログラムにおいては、多くのケースにおいて、ソースコード内でファイルが機能ごとに配置されている。そして、カバレッジの測定は、機能ごとに実行されることが好ましい。したがって、
図28に示す手順は、ビルドされるロードモジュールの数を削減できることがあるが、カバレッジ測定の精度または信頼性の観点で好ましくないこともある。
【0107】
図29は、第3の実施形態においてソースコードファイルを複数のグループに分配する方法の一例を示すフローチャートである。なお、このフローチャートの処理は、
図12に示す手順の代わりに実行される。
【0108】
S91において、分配部16は、全ソースコードファイルをカバレッジ測定対象としてロードモジュールを生成する。そして、分配部16は、このロードモジュールのサイズを計測する。このロードモジュールのサイズは、
図25では、Z2に相当する。
【0109】
S92において、分配部16は、S91で計算したサイズZ2とメモリ32の空き容量とを比較する。ここで、サイズZ2が空き容量より小さいときは、分配部16は、ソースコード21を分割することなくソースコード21全体のカバレッジを測定できると判定する。この場合、ソースコードファイルのグループ化に係わる処理は終了する。一方、サイズZ2が空き容量より大きいときは、分配部の処理はS93に進む。
【0110】
S93において、分配部16は、ソースコード21の実コード部分のロードモジュールを生成する。すなわち、カバレッジ測定用マーカーが埋め込まれていないロードモジュールが生成される。そして、分配部16は、このロードモジュールのサイズを計測する。このロードモジュールのサイズは、
図25では、Z3に相当する。
【0111】
S94において、分配部16は、全ソースコードファイルのカバレッジを測定する際に増加するロードモジュールのサイズを計算する。この増加分は、S91で計算したサイズZ2からS93で計算したサイズZ3を引算することで得られる。この計算結果は、
図25では、Z5に相当する。
【0112】
S95において、分配部16は、ソースコードファイル毎に、カバレッジ測定用マーカーを挿入すべき場所の数を求める。この手順は、
図24を参照して説明した通りである。S96において、分配部16は、カバレッジ測定用マーカーを挿入すべき場所1つ当たりのサイズの増加分を計算する。この増加分は、S94で計算されるサイズZ5を、カバレッジ測定用マーカーを挿入すべき場所の総数で除算することで得られる。S97において、分配部16は、ソースコードファイル毎に、カバレッジ測定用マーカーの挿入に起因するサイズの増加分を計算する。この増加分は、ソースコードファイル毎に、当該ソースコードファイ内に現れるカバレッジ測定用マーカーを挿入すべき場所の数に、S96で計算される増加分を乗算することで計算され、その計算結果は
図26に示す通りである。
【0113】
S98において、分配部16は、カバレッジ測定のために増加可能なロードモジュールのサイズを計算する。この増加可能サイズは、メモリ32の空き容量から、S93で計算されるサイズZ3を引算することで計算され、
図25のZ4に相当する。
【0114】
S99において、分配部16は、S97で計算される増加分の合計が、S98で計算される増加可能サイズZ4を超えない範囲で、可能な限り大きくなるように、1または複数のソースコードファイルを選択する。これにより、1つのグループが構成される。この手順は、
図27または
図28を参照して説明した通りである。
【0115】
S100において、分配部16は、ソースコード21を構成する複数のソースコードファイルのうちで、選択されてないソースコードファイルが残っているか否かを判定する。そして、選択されてないソースコードファイルが残っているときは、分配部16の処理はS99に戻る。すなわち、すべてのソースコードファイルが選択されるまで、S99~S100の処理が繰り返し実行される。これにより、ソースコード21を構成する複数のソースコードファイルがいずれかのグループに分配される。
図27に示す例では、ソースコードファイルSC1~SC15が5個のグループG1~G5に分配されている。
図28に示す例では、ソースコードファイルSC1~SC15が4個のグループG1~G4に分配されている。
【0116】
この後、カバレッジ測定装置10は、グループ毎にロードモジュールを生成し、カバレッジ測定を実行する。さらに、グループ毎に作成されるカバレッジデータを結合することでカバレッジ測定結果を得る。
【0117】
このように、第3の実施形態に係わるカバレッジ測定装置は、カバレッジ測定用マーカーを挿入すべき場所の数に基づいてソースコードファイルを複数のグループに分配し、グループ毎にロードモジュールを生成してカバレッジを測定する。よって、ステップ数に基づいてソースコードファイルをグループ化する方法と比べて、ビルドされるロードモジュールのサイズを均等にできることがある。ビルドされるロードモジュールのサイズが均等になると、カバレッジ測定において実行すべきロードモジュールの数が少なくなり、カバレッジ測定時間を短縮できる。
【0118】
<ハードウェア構成>
図30は、カバレッジ測定装置10のハードウェア構成の一例を示す。カバレッジ測定装置10は、プロセッサ101、メモリ102、記憶装置103、入出力デバイス104、記録媒体読取り装置105、および通信インタフェース106を備えるコンピュータ100により実現される。
【0119】
プロセッサ101は、記憶装置103に保存されているカバレッジ測定プログラムを実行することにより、カバレッジ測定装置10の動作を制御する。カバレッジ測定プログラムは、
図6、
図7、
図9、
図11、
図12、
図15、
図18、
図19、
図22、および
図29に示すフローチャートの手順を記述したプログラムコードを含む。よって、プロセッサ101がこのプログラムを実行することで、
図3に示すビルド用ソフトウェア11、メモリ空き容量検出部15、分配部16、カバレッジ実行部17、およびカバレッジデータ結合部18の機能が提供される。メモリ102は、プロセッサ101の作業領域として使用される。記憶装置103は、上述したカバレッジ測定プログラムおよび他のプログラムを保存する。
【0120】
入出力デバイス104は、キーボード、マウス、タッチパネル、マイクなどの入力デバイスを含む。また、入出力デバイス104は、表示装置、スピーカーなどの出力デバイスを含む。記録媒体読取り装置105は、記録媒体110に記録されているデータおよび情報を取得できる。記録媒体110は、コンピュータ100に着脱可能なリムーバブル記録媒体である。また、記録媒体110は、例えば、半導体メモリ、光学的作用で信号を記録する媒体、または磁気的作用で信号を記録する媒体により実現される。なお、カバレッジ測定プログラムは、記録媒体110からコンピュータ100に与えられてもよい。通信インタフェース106は、ネットワークに接続する機能を提供する。なお、カバレッジ測定プログラムがプログラムサーバ120に保存されているときは、コンピュータ100は、プログラムサーバ120からカバレッジ測定プログラムを取得してもよい。
【符号の説明】
【0121】
10 カバレッジ測定装置
11 ビルド用ソフトウェア
12 ロードモジュール格納部
13 ロードモジュール情報保存部
14 カバレッジデータ保存部
15 メモリ空き容量検出部
16 分配部
17 カバレッジ実行部
18 カバレッジデータ結合部
21 ソースコード
30 カバレッジ測定対象機器
31 CPU
32 メモリ
41 ロードモジュール
42 カバレッジデータ
51 カバレッジ測定結果
100 コンピュータ
101 プロセッサ