(57)【特許請求の範囲】
【請求項１】
アプリケーションプログラムに含まれる複数の処理単位の各々をノードに対応させ、前記アプリケーションプログラムに対するテストケースの実行トレース情報に含まれる複数のイベントに基づいて、最上位ノードを出発点としてノードを追跡しながら、前記複数の処理単位の各々の呼出構造を、前記ノード間を結ぶツリー構造として記憶部に記憶するプログラムであって、
前記実行トレース情報から、Ｎ番目のイベントを読み込み、
前記Ｎ番目のイベントが処理単位の呼出開始イベントの場合には、現在追跡しているノードから、前記呼出開始イベントが示す処理単位に対応する子ノードに移動すべきことを決定し、前記Ｎ番目のイベントが処理単位の呼出終了イベントの場合には、現在追跡しているノードよりも最上位ノード側の親ノードに移動すべきことを決定することによって、ノードを追跡し、
前記決定において前記子ノードに移動すべきことが決定された場合に、前記現在追跡しているノードの子ノードに前記呼出開始イベントが示す処理単位に対応するノードが既に存在するか否かを判定し、
前記判定において存在しないと判定された場合には、移動すべき前記子ノードを前記記憶部に記憶された前記ツリー構造に追加記憶し、
前記Ｎ番目のイベントの属性であるテストケース識別情報を前記Ｎ番目のイベントに関連するノードに対応づけて前記記憶部に記憶する、
処理をコンピュータに実行させるプログラム。
【請求項２】
前記イベントには前記テストケース識別情報以外の属性が含まれ、前記Ｎ番目のイベントに含まれる属性を抽出し、前記テストケース識別情報以外の該抽出した属性を前記Ｎ番目のイベントに関連するノードに対応づけて前記記憶部に記憶する、
処理を更にコンピュータに実行させる請求項１記載のプログラム。
【請求項３】
前記テストケース識別情報以外の属性は、前記処理単位の引数、前記処理単位の戻り値、及び前記処理単位の実行回数、のうち、いずれか１つを含む、
請求項２記載のプログラム。
【請求項４】
指定された属性に基づいて、ツリー構造に関連する情報を加工して出力する、
処理を更にコンピュータに実行させる請求項１乃至３のうちいずれか１項記載のプログラム。
【請求項５】
前記加工して出力する処理は、第１のテストケースによって出力されたツリー構造と、第２のテストケースによって出力されたツリー構造との相違点を出力する、
処理を更にコンピュータに実行させる請求項４記載のプログラム。
【請求項６】
前記加工して出力する処理は、第１のテストケースによって出力されたツリー構造と、第２のテストケースによって出力されたツリー構造とが一致するか否かを判断した結果を出力する、
処理を更にコンピュータに実行させる請求項４又は５記載のプログラム。
【請求項７】
アプリケーションプログラムに含まれる複数の処理単位の各々をノードに対応させ、前記アプリケーションプログラムに対するテストケースの実行トレース情報に含まれる複数のイベントに基づいて、最上位ノードを出発点としてノードを追跡しながら、前記複数の処理単位の各々の呼出構造を、前記ノード間を結ぶツリー構造として記憶部に記憶する方法であって、
前記実行トレース情報から、Ｎ番目のイベントを読み込み、
前記Ｎ番目のイベントが処理単位の呼出開始イベントの場合には、現在追跡しているノードから、前記呼出開始イベントが示す処理単位に対応する子ノードに移動すべきことを決定し、前記Ｎ番目のイベントが処理単位の呼出終了イベントの場合には、現在追跡しているノードよりも最上位ノード側の親ノードに移動すべきことを決定することによって、ノードを追跡し、
前記決定において前記子ノードに移動すべきことが決定された場合に、前記現在追跡しているノードの子ノードに前記呼出開始イベントが示す処理単位に対応するノードが既に存在するか否かを判定し、
前記判定において存在しないと判定された場合には、移動すべき前記子ノードを前記記憶部に記憶された前記ツリー構造に追加記憶し、
前記Ｎ番目のイベントの属性であるテストケース識別情報を前記Ｎ番目のイベントに関連するノードに対応づけて前記記憶部に記憶する、
ことを特徴とする方法。
【請求項８】
アプリケーションプログラムに含まれる複数の処理単位の各々をノードに対応させ、前記アプリケーションプログラムに対するテストケースの実行トレース情報に含まれる複数のイベントに基づいて、最上位ノードを出発点としてノードを追跡しながら、前記複数の処理単位の各々の呼出構造を、前記ノード間を結ぶツリー構造として記憶部に記憶する装置であって、
前記実行トレース情報から、Ｎ番目のイベントを読み込む、イベント読込部と、
前記Ｎ番目のイベントが処理単位の呼出開始イベントの場合には、現在追跡しているノードから、前記呼出開始イベントが示す処理単位に対応する子ノードに移動すべきことを決定し、前記Ｎ番目のイベントが処理単位の呼出終了イベントの場合には、現在追跡しているノードよりも最上位ノード側の親ノードに移動すべきことを決定することによって、ノードを追跡する、ノード追跡部と、
前記決定において前記子ノードに移動すべきことが決定された場合に、前記現在追跡しているノードの子ノードに前記呼出開始イベントが示す処理単位に対応するノードが既に存在するか否かを判定する、同一呼出構造存在判定部と、
前記判定において存在しないと判定された場合には、移動すべき前記子ノードを前記記憶部に記憶された前記ツリー構造に追加記憶する、呼出構造ノード追加部と、
前記Ｎ番目のイベントの属性であるテストケース識別情報を前記Ｎ番目のイベントに関連するノードに対応づけて前記記憶部に記憶する、呼出構造属性追加部と、
を有することを特徴とする装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明はアプリケーションプログラムのトレース情報技術に関する。
【背景技術】
【０００２】
近年、コンピュータシステムの発達により、世の中の様々な場面でコンピュータシステムが活用されるようになってきている。一度構築したコンピュータシステムでも歳月を経ることで、改良を行う必要が生じる。あるいはシステム全体を見直す必要が生じることがある。既に作成したプログラムの一部に修正を行う場合には、まず既存のプログラムの機能や、複数の処理単位の呼出構造を把握する必要がある。
【０００３】
通常、プログラムには、その設計仕様書が存在するが、プログラムが設計仕様書を完全に満足していない場合も存在する。また、仕様変更を繰り返すうちに、設計仕様書自体が整理された形で保存されていない場合も多い。したがって、プログラムを実際に動作させて、そのプログラムの挙動を解析することが必要とされる。
【０００４】
プログラムは、複数の処理単位を含んでいるため、その処理単位の各々を実現するプログラムの要素の集合体として、全体のプログラムが構成されている場合がほとんどである。したがって、個々の処理単位に分けてプログラムを開発し、また改良を加える場合が多い。このプログラムにおける処理単位は、一般にメソッド、関数、ルーチンなどと呼ばれる。本明細書では、この一定の機能を実現するプログラムの処理単位を代表する語として「メソッド」の語を用いて説明する場合がある。したがって、以下の記載において、「メソッド」と明記されていても、この語は関数、ルーチンなど、一定の機能を実現するプログラムの「処理単位」を意味するものとして、理解すべきである点に留意する必要がある。
【０００５】
プログラムのソースを分析して、個々のメソッドの呼出構造を取得する方法がある。しかしながら、実行時に決定する呼出構造などがあるため、正確な呼出構造を把握するためには、実際にプログラムを実行したことで得られる実行履歴を取得する必要がある。
【０００６】
このために、プログラムを実行し、プログラムの実行履歴であるトレース情報を取得して、詳細な動作を取得することが出来る。しかしながら、多くの場合、メソッド数の組み合わせや呼出数は膨大であるため、トレース情報は膨大になる。特に、繰り返し処理などがある場合には、同じメソッドに対する呼出が複数回行われることがあり、そのことがトレース情報のデータ量を増やしている。この膨大な情報をそのまま扱うことは難しい。  
また、プログラムの実行結果を解析する手法として、カバレッジテストが知られている。カバレッジテストとは、プログラムを実行した際に、ソースコードのどの部分が実際に実行されたか、その実行回数などを調べることをいう。しかしながら、ソースコードのカバレッジ情報では、テストケースが実行する行番号情報は取得するが、条件文、繰り返し文での動作や呼び出し構造のパターンを抽出することができない。このため、構造情報を取得することが出来ない。従って、メソッド間の呼出関係などの情報を取得することは出来ない。
【０００７】
カバレッジ情報の代わりに、プログラム情報を変数と関数の「要素リスト」の形式で持ち、「要素リスト」を依存グラフとして持つ技術が知られている（特許文献１）。しかしながら、この技術では、呼出構造を把握していないため、同じ要素が繰り返し出現する場合や、異なる組み合わせで出現する構造を区別できない。
【０００８】
また、モデルとテスト、テストとトレース情報、トレース情報とソース、を保持することで、作業を効率化する技術が知られている（特許文献２）。これは、プログラムの管理方法に関するものであるため、ソース内の呼出構造を把握できない。
【０００９】
また、事象グループを定義し、トレース情報内の事象グループを識別することで、パターンを取得し、トレース情報を集約する技術が知られている（特許文献３）。この方法は、解析者がそのグループの識別方法を与える必要があり、その定義情報に基づいてトレース情報・ログ情報を集約する。従って、事象グループとして定義していないものは、トレース情報から識別ができないため、集約ができない。定義していない箇所の情報を取得するには、例えば全ダンプ情報を取得している。
【００１０】
また、ユーザの操作履歴情報として、画面内で設定した項目の状態を、画面をオブジェクト、各項目をオブジェクト内情報として、包含関係の情報を、ツリー構造を含む情報として保持する技術が知られている（特許文献４）。この技術は、項目情報として、表示情報（表示／非表示）、矩形の位置、矩形の選択状況などを保持する。時系列の情報は各オブジェクト情報の前後関係を把握するために保持しているが、ユーザ端末の操作を他の端末で再現する技術を開示するに止まるものである。
【００１１】
上記に示したとおり、いずれもメソッド間の呼出関係を保持しながら、予め定義したパターン以外のデータを含んだトレース情報を集約することができないため、効率的な分析を行うことが出来ない。
【先行技術文献】
【特許文献】
【００１２】
【特許文献１】特開平０８−４４５９０号公報
【特許文献２】特開２００７−１３３８００号公報
【特許文献３】特開平１０−３３３９４３号公報
【特許文献４】特開２０１０−１６０５３８号公報
【発明の概要】
【発明が解決しようとする課題】
【００１３】
本プログラム、装置及び方法は、上記実情に鑑みなされたもので、大容量のトレース情報に対して、呼出構造を保持しながら、トレース情報を集約することを目的の一つとしている。
【課題を解決するための手段】
【００１４】
本プログラムの一観点によれば、アプリケーションプログラムに含まれる複数の処理単位の各々をノードに対応させ、前記アプリケーションプログラムに対するテストケースの実行トレース情報に含まれる複数のイベントに基づいて、最上位ノードを出発点としてノードを追跡しながら、前記複数の処理単位の各々の呼出構造を、前記ノード間を結ぶツリー構造として記憶部に記憶するプログラムであって、前記実行トレース情報から、Ｎ番目のイベントを読み込み、前記Ｎ番目のイベントが処理単位の呼出開始イベントの場合には、現在追跡しているノードから、前記呼出開始イベントが示す処理単位に対応する子ノードに移動すべきことを決定し、前記Ｎ番目のイベントが処理単位の呼出終了イベントの場合には、現在追跡しているノードよりも最上位ノード側の親ノードに移動すべきことを決定することによって、ノードを追跡し、前記決定において前記子ノードに移動すべきことが決定された場合に、前記現在追跡しているノードの子ノードに前記呼出開始イベントが示す処理単位に対応するノードが既に存在するか否かを判定し、前記判定において存在しないと判定された場合には、移動すべき前記子ノードを前記記憶部に記憶された前記ツリー構造に追加記憶する、処理をコンピュータに実行させるプログラムが提供される。
【発明の効果】
【００１５】
本プログラムでは、アプリケーションプログラムが同一処理を複数回実行する場合に、呼び出し構造を保持しながら、その実行トレース情報を集約できるので、特に繰り返し処理が多い場合、少ない情報量で実行トレース情報を保持することが出来る。
【図面の簡単な説明】
【００１６】
【図１】プログラム実行トレース情報の例を示す図である。
【図２Ａ】本発明の一実施形態の機能構成を示す図である。
【図２Ｂ】本発明の一実施形態におけるツリー構造を示す図である。
【図３】一実施形態の全体処理フローを示す図である。
【図４】最上位ノード取得部の処理フローを示す図である。
【図５】同一呼出構造存在判定部の処理フローを示す図である。
【図６】呼出構造データのツリー表示の例を示す図である。
【図７】呼出構造データの例を示す図である。
【図８】呼出構造データの一つのノードのデータ構造の例を示す図である。
【図９】呼出構造データのツリー表示の例を示す図である。
【図１０】呼出構造データの例を示す図である。
【図１１】呼出構造データの一つのノードのデータ構造の例を示す図である。
【図１２】呼出構造データを集約したツリー表示の例を示す図である。
【図１３】特定のテストケースの呼出構造データを抽出してツリー表示する例を示す図である。
【図１４】複数のテストケースの呼出構造の差分を抽出して強調表示する例を示す図である。
【図１５】一実施形態のハードウエア構成を示す図である。
【発明を実施するための形態】
【００１７】
図１（ａ）及び（ｂ）は、アプリケーションプログラムの実行トレース情報の例を示している。トレース情報には、説明の便宜上、行番号を付してある。各行番号に対応する１つのトレースデータは、１つのイベントを意味している。図１（ａ）は、テストケース名として、Ｔｅｓｔ１が与えられた、トレース情報を示している。図１（ｂ）は、同一のアプリケーションプログラムの実行トレース情報であるが、図１（ａ）のトレース情報とは別個に取得されたトレース情報であり、テストケース名としてＴｅｓｔ２が与えられている。通常、アプリケーションプログラムの実行トレースデータは、アプリケーションプログラムの特定の機能に着目して、取得される。したがって、個々のトレース情報の名前として付与されたテストケース名は、特定の機能単位情報としての意味を持つ場合がある。なお、本発明はこの点に限定されるものではない。
【００１８】
図１（ｃ）は、トレース情報の記述形式を説明するための図である。「＞Ａ」は、メソッドＡの呼出開始を意味する。「＜Ａ」は、メソッドＡの呼出終了を意味する。また、（ａｒｇ１，ａｒｇ２）（ｖ１，ｖ２）において、ａｒｇ１，ａｒｇ２、は引数の型を示し、ｖ１，ｖ２は、それぞれ、引数の値を示す。また、ｒｅｔｕｒｎ（ａ３），（ｖ３）において、ａ３は戻り値の型を示し、ｖ３は戻り値を示す。
【００１９】
図１（ａ）の例えば行番号１の＞Ａは、Ａという名前のメソッドの呼出が開始されたことを意味する。例えば、メソッドＡの例として、画面上のボタンを押すと特定の写真を画面に表示するメソッドを例に説明する。この場合には、＞Ａは、ボタンがマウスによりクリックされ、メソッドＡが呼び出されたイベントを意味する。図１（ａ）の行番号２の＞Ｂは、メソッドＢが呼出開始されたことを意味する。そして、行番号１１の＞Ａは、メソッドＡの呼出が終了したイベントを示している。これは、例えばメソッドＡにより、写真の表示が終了したイベントを意味する。
【００２０】
また、図１（ｂ）の行番号７は、＞Ｄ  （ａｒｇ１，ａｒｇ２），（ｖ１，ｖ２）となっている。これは、メソッドＤが呼出開始されたことを意味し、引数の型がそれぞれａｒｇ１，ａｒｇ２である引数の値ｖ１，ｖ２が、その時に与えられたイベントを意味する。行番号８は、＜Ｄ  ｒｅｔｕｒｎ  （ａ３），（ｖ３）となっており、メソッドＤの呼出終了を意味し、メソッドＤの戻り値として、型ａ３の戻り値ｖ３が返されたことを意味する。
【００２１】
図１に示すように、本発明の一実施形態では、あるアプリケーションプログラムに対して、必要な入力データを用意し、そのアプリケーションプログラムを実行して得られる実行履歴であるトレース情報を取得する。ただし、図１に示されたトレース情報は、複雑であり、実際のトレース情報は膨大なものとなる。このため、一実施形態では、そのトレース情報に対して、呼出構造を作成する。この呼出構造を基に、ツリー構造を作成する。ツリー構造の例は、図２Ｂを用いて後述する。
【００２２】
一実施形態におけるトレース情報は、１つの処理単位に対して、１つのイベント情報を取得できる形で記録されているものとする。例えば、１つのメソッド呼び出し、メソッド終了をそれぞれテキスト形式で、１行で記述されていて、トレース情報読込み時には、行単位でその情報を読み込む。このことで、一回の読込みで、対応する一つの処理単位の情報を取得する。なお、本発明は、上述の記載に限定されるものではなく、トレース情報の形式は、１つのイベントを順番に取得できるようなデータ形式であれば、どのようなものであってもよいことは言うまでもない。
【００２３】
メソッドの呼出構造とは、メソッドの呼出開始後、そのメソッドが別のメソッドを呼び出した場合に、その呼び出し先のメソッドを子ノード、現在追跡中のノードに相当する呼出元のメソッドを親ノードとして構築することで作成する。呼び出し先の情報を読み込むとき、現在追跡中のノードを子ノードに移動する。呼び出しが終了したとき、再度呼び出し元メソッドのノードへ移動する。呼出構造の最上位のノードは、トレース情報の開始地点を示すものであり、最上位ノードと呼ぶ。また、現在追跡中のノードとは、ツリー構造上において、本実施形態が注目しているノードを意味する。この現在追跡中のノードは、トレース情報のイベントを一つ読み込む毎に、ツリー構造に沿って、最上位ノード側の親ノード、又は、最上位ノードと反対方向に位置する子ノードに、必要に応じて移動して行く。この移動の詳細は、以下の説明に示されている。
【００２４】
呼出構造は、トレース情報の実行順にそのまま構造を作成するのではなく、同一構造である箇所については集約して作成する。呼出構造を集約して保持することで、メソッド間の関係を保ちながら、かつ、大容量のトレース情報を集約して保存することを実現している。
【００２５】
呼出構造を集約するときに、処理単位の情報も合わせて取得する。これは、実行するアプリケーションプログラムのテストケースのトレース情報の処理単位の属性を構造上に記憶させておく。このことにより、属性の種類および値で検索を行うことを実現できる。例えば、処理単位に対して、実行回数を記録することで、繰り返し構造を集約した情報を記憶することを実現する。また、メソッドの引数値および戻り値を取得できる場合は、引数値、戻り値の情報を属性値として記録してもよい。
【００２６】
呼出構造の作成は、予め取得したトレース情報に対して作成することも可能であるが、アプリケーションプログラムの実行時に同時に作成してもよい。従って、実行中に情報を集約しながら記録することができるので、ログ情報を集約して保存する方法としても利用できる。
【００２７】
次に、本発明の一実施形態の各構成について記述する。
【００２８】
図２Ａは、本発明の一実施形態の機能構成を示す図である。
【００２９】
最上位ノード取得部２０２では、過去にアプリケーションの呼出構造データがあった場合は、その情報を入力として、呼出構造作成時の最上位ノード２０４を取得して出力する。トレース情報の最初の入力であった場合、最上位ノード２０４を定義する。他のトレース情報に基づき、既に作成したアプリケーションの呼出構造データ２２４内に最上位ノードが存在したときには、そのノードを取得する。
【００３０】
イベント読込部２０８では、リアルタイムに取得されるか、あるいはメモリに蓄積されたアプリケーションプログラムのトレース情報２０６から、１つのイベントを読み込む。
【００３１】
ノード追跡部２１０は、トレース情報から読み込まれた１つのイベントのデータであるメソッドの呼出開始、又はメソッドの呼出終了を含む情報と、最上位ノードを入力とする。初期段階では、現在追跡中のノードを最上位ノードに設定する。
【００３２】
読み込まれたイベントがメソッドの呼出開始イベントの場合には、現在追跡中のノードから、前記呼出開始イベントが示す処理単位に対応する子ノードに、現在追跡中のノードを移動すべきことを決定し、読み込まれたイベントがメソッドの呼出終了イベントの場合には、現在追跡中のノードよりも最上位ノード側の親ノードに、現在追跡中のノードを移動すべきことを決定する。
【００３３】
メソッド呼出開始後、別のメソッドを呼び出した場合に呼び出し先メソッドである子ノードへ、現在追跡中のノードを移動し、そのノードを基点に次のトレース情報を読み込む。メソッドの呼出が終了したときは、呼出元ノードである親ノードへ、現在追跡中のノードを移動させる。
【００３４】
同一呼出構造存在判定部２１４で、現時点までに作成した呼出構造と、現在追跡中のノード、および、トレース情報を取得し、現在追跡中のノードの子ノードに、トレース情報から取得したメソッドの呼出開始に対応するノードと同一のノードが存在するかどうかを判断し、その判断結果を出力する。  
呼出構造ノード追加部２１８では、現在追跡中のノード２１２と同一構造判定結果２１６を入力として、ノードの追加を行い、ノードを追加した呼出構造データを生成する。子ノードの追加は、親ノードの識別情報を基に子ノードの識別情報を追加する。例えば、各ノードにＩＤを付与し、子ノードに、固有のＩＤを設定する。このＩＤは、ノードのデータ構造へのポインタ情報として利用してもよい。この処理によって子ノードが追加される。
【００３５】
呼出構造属性追加部２２２で、読み込まれたイベントに関連する処理単位に関係する情報であるテストケース名などの情報、呼び出された回数を、引数、戻り値などの情報を該当ノードの属性として追加して記憶する。複数の種類の属性があった場合には、その属性情報をそれぞれ追加する。
【００３６】
これらの情報は、アプリケーションの呼出構造データ２２４として、記憶装置に記憶される。これは、データ加工部２２８によって、必要に応じて加工され、表示・ユーザーインターフェース部２２６で、ツリー構造や、リスト構造として表示される。また、表示・ユーザーインターフェース部２２６は、ユーザからの検索指示や、属性の特定などの入力を受け付け、データ加工部２２８に、適切なデータ加工を指示する。加工されたデータは表示・ユーザーインターフェース部２２６に戻され、ユーザに表示してもよい。
【００３７】
図２Ｂは、本発明の一実施形態におけるツリー構造を示す図である。図２Ｂ（ａ）は、アプリケーションプログラムの実行トレースデータをツリー表示した例をしめしている。ツリー構造は、ノードＴｏｐ２５０、ノードＡ２６０、及びノードＢ２７０で構成されており、矢印で接続されている。ノードＴｏｐ２５０は、ツリー構造の最上位ノードを示しており、ツリーの始まりを示すものである。ノードＡ２６０は、メソッドＡが実行されたことを意味する。これは、ノードＴｏｐ２５０直下に接続されているため、アプリケーションプログラムの実行トレースデータにおいて、メソッドＡが最初に実行されたことが分かる。その下に続くノードＢ２７０は、メソッドＢが実行されたことを意味する。したがって、このリスト構造の場合には、少なくともメソッドＡの実行の次にメソッドＢが実行されたことが視覚的に理解できる。
【００３８】
図２Ｂ（ｂ）は、図２Ｂ（ａ）の各ノードの呼出構造データの内容を示したものである。呼出構造データ２５１は、ノードＴｏｐ２５０に対応している。呼出構造データ２６１は、ノードＢ２６０に対応している。呼出構造データ２７１は、ノードＣ２７０に対応している。呼出構造データ２５１には、呼出構造データをユニークに特定するためのＩＤ２５１が付与されている。このＩＤは、ノードを特定するためのポインタ情報として利用してもよい。Ｎａｍｅ２５４は、ノード名であり、メソッド名と同じ名前を用いても良い。Ｃｈｉｌｄ２５６は、存在する子ノードのＩＤが記述される。この場合、ノードＴｏｐ２５０の子ノードは、ノードＡ２６０であるため、ノードＡ２６０のＩＤの値“１”が記述されている。子ノードが複数あれば、複数のエントリーが記述される。Ｔｅｓｔ２５８は、属性値の例であり、用いられたトレース情報のトレース情報名が記述される、Ｃｏｕｎｔの項目は、ノードに対応するメソッドの実行回数を意味する。ノードＴｏｐ２５０は、実際のメソッドには対応しないが、便宜上Ｃｏｕｎｔの値として“１”が記述されている。呼出構造データ２６１、及び呼出構造データ２６１についても、同様のデータ構造を有していることが分かる。
【００３９】
図３に、一実施形態の全体処理フローを示す。
【００４０】
まず、ステップ３０２で、過去に作成された最上位ノードがあれば、これを最上位ノードとして取得する。最上位ノードが存在しない場合には、上述のように最上位ノードが生成されるので、その最上位ノードを取得する。
【００４１】
次に、ステップ３０４において、トレース情報から、１つのイベントを読み出す。読み出されたイベントは、ステップ３０６において、メソッドの呼出開始であるかがチェックされる。この結果がＮＯであれば、ステップ３０８において、イベントがメソッドの呼出終了かがチェックされる。この結果がＮＯであれば、ステップ３０４に戻る。
【００４２】
次に、ステップ３０６の判断結果がＹＥＳ（メソッドの呼出開始である）場合について説明する。
【００４３】
メソッドの呼出開始であった場合、同一呼出構造存在判定部２１４で、現時点までに作成した呼出構造を取得し、現在追跡中のノードの子ノードの中に、メソッドに対応するノードと同一のノードが存在するかを判断する（ステップ３１２）。子ノードに同一のものが存在した場合、同一と判断したノードを特定する。そして、ステップ１１８に進む。
【００４４】
また、ステップ３１２において、同一の子ノードが存在しないと判断された場合には、ステップ３１４に移行する。ここでは、呼出構造のツリー構造に子ノードを追加する。そして、この追加された子ノードを現在追跡中のノードとする。
【００４５】
ここで、ステップ３１６の処理を説明する。ステップ３０８において、メソッドが呼出終了である場合に、ステップ３１６が実行される。ここでは、メソッドの呼出終了であることを、記憶しておく。現在追跡中のノードの移動は行われない。この記憶した情報は、ステップ３３１において用いられる。この場合には、属性情報を記憶する一連の処理が終了した後に、ステップ３３２において、現在追跡中のノードを一つ上の階層に移す処理が行われる点に留意すべきである。
【００４６】
ここで、ステップ１１８以下の処理について説明する。ステップ１１８において、イベントが示す属性値を取得する。属性値としては、たとえば、メソッドの引数、メソッドの戻り値、テストケース名、メソッドの実行回数、同じ引数が用いられた回数、同じ戻り値が戻された回数、引数や戻り値の型などが挙げられる。なお、属性値は、上述の例に限定されるものではない。
【００４７】
たとえば、該当のノードに同一のテストケース名が既に属性として記録されている場合は、その情報を取得し、実行回数を１つ加算する。もし、該当のノードにテストケース名がなかった場合は、新たに属性情報として、テストケース名を追加し、実行回数を１回として設定する。
【００４８】
なお、ステップ３２０乃至３２４は、引数を属性値として蓄積する場合の取り扱い手法の例を示している。
【００４９】
また、ステップ３２０乃至３３０は、テストケースを属性値として蓄積する場合の取り扱い手法を示している。
【００５０】
ステップ３３１及びステップ３３２については、既に説明したとおりステップ３０８において取得し、ステップ１０６で蓄積した情報に基づいて、現在追跡中のノードを一つ上の階層に移す取り扱い手法の例を示している。
【００５１】
ステップ３３４において、全てのトレース情報のイベントを読み込んで処理したかがチェックされる。
【００５２】
トレース情報の１つのイベント（データ単位の情報）を取得した後、次のイベントを読み込む。
【００５３】
次に、同一のアプリケーションプログラムの実行に係る別のテストケースに対するトレース情報を読み込んだときには、そのテストケース名を機能情報として保持しながら、既に作成された呼出構造データに追加する形でトレース情報の呼出構造を作成し、そのテストケース名を属性として保存する。このことで、異なるテストケースに対する情報を同じ呼出構造上に構築する。なお、必要に応じて、呼出構造データをテストケース名で検索することにより、特定のテストケースの呼出構造データに基づくツリー構造を抽出してもよい。また、例えば２つのテストケースを与えて、その呼出構造データの差分をツリー構造上にハイライト表示させてもよい。また、その他の属性データを検索キーとして使用し、呼出構造を抽出し、ツリー表示させても良い。また、表示は、ツリー構造の表示以外に、リスト形式の表示や、グラフ形式の表示など、用途に応じて、表示形式を変更しても良い。
【００５４】
図４は、最上位ノード取得部の処理を示している。ステップ４０２において、現在保持している呼出構造を取得する。ステップ４０４で、呼出構造が存在するか否かがチェックされる。過去において、本実施形態を実行し、呼出構造データが存在する場合には、呼出構造を取得し、その中から最上位ノードを取得する。ステップ４０４において、過去に保持した呼出構造が存在しない場合には、最上位ノードを定義する（ステップ４０８）。この最上位ノードを出発点として、ツリー構造の呼出構造が構築されることになる。
【００５５】
図５は、同一呼出構造存在判定部の処理フローを示す。このフローは、図３におけるステップ３１０に対応する。まず、現在追跡中のノードを取得する（ステップ５０２）。そして、現在追跡中のノードの子ノードを取得する（ステップ５０４）。ステップ５０６において、調査する子ノードが存在しないかを判定する。存在しない場合には、ステップ５１２に進んで、呼出開始されたメソッドに対応するノードと同一のノードが子ノードに存在しないことを出力する。ステップ５０６で、調査する子ノードが存在する場合には、子ノードの１つに注目して、ステップ５０８に進む。ここで、呼出開始されたメソッドに対応するノードと同一のノードが子ノードに存在するかが、チェックされる。注目している子ノードが同一の子ノードであると特定し、これを出力する。ステップ５０８で、同一の子ノードが見つからない場合には、次の子ノードをチェックするためにステップ５０４に戻り、同様のチェックを繰り返す。ステップ５０６において、調査する全ての子ノードをチェックし終えた場合には、ステップ５１２に進んで、呼出開始されたメソッドに対応するノードと同一のノードが子ノードに存在しないことを出力する。
【実施例】
【００５６】
プログラムを実行して得られたトレース情報から実際に呼出構造データを作成する一実施形態を説明する。
【００５７】
トレース情報の例は、既に図１を用いて説明した。トレース情報には、メソッドの呼出開始、メソッドの呼出終了、および対応するメソッド名を含む情報が記述されている。一つのメソッド呼び出し、メソッド終了をそれぞれ、テキスト形式で、一行で記述し、トレース情報読込み時には、行単位でその情報を読み込む。このことで、一回の読込みで、対応する処理単位の一つのイベントの情報を取得する。図１に示した例では、二つのファイルがあり、それぞれ、Ｔｅｓｔ１とＴｅｓｔ２という名称のトレース情報が保存されている。トレース情報は、テストケース名が付与されている。Ｔｅｓｔ１とＴｅｓｔ２は、テストケース名の例である。各テストケースでは、Ａ、Ｂ、Ｃ、Ｄというメソッド名が記述されている。
【００５８】
確認したい機能をテストケースに対応付けて利用してもよい。また、アプリケーションプログラムが運用中の場合は、利用者の操作単位でトレース情報を取得して、そのトレース情報を利用してもよい。トレース情報の構成要素をイベントと呼ぶ。本実施形態では、１行のデータが１つのイベントに対応する。なお、本発明は、この実施形態に限定されない。
【００５９】
図１（ａ）と図６とを参照する。トレース情報を一行ずつ読み込み、呼出構造を作成する。初めて読み込む情報であるため、最上位ノードとして、ノードＴｏｐを新たに定義し、現在追跡中のノードとしてノードＴｏｐを設定する。最上位ノード取得部２０２の出力結果として、図６に示すようにノードＴｏｐ６０２を出力する。
【００６０】
次に、図１に示したＴｅｓｔ１のデータを読み込むと、行番号１は、Ａというメソッド名の呼出開始であることが記述されている。同一呼出構造存在判定部２１４では、入力として受け取ったメソッドＡに対して、現在追跡中のノードの子ノードとしてメソッドＡに対応するものが存在するか否かを判断する。ここでは、ノードＴｏｐ６０２しか存在しないため、同一呼出構造存在判定部２１４の出力として、ノードＡと同一の子ノードは存在しないという判断結果を出力する。
【００６１】
次に、Ｔｏｐの子ノードとしてノードＡ６０４を追加し、現在追跡中のノードをノードＡ６０４へ移動する。また、現在、ノードＡ６０４に対して、属性として、テストケース名、Ｔｅｓｔ１を属性に定義し、初めての実行であるため、実行回数を１回と設定する。メソッドＡでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。ここで、トレース情報から読み込んだ１行に対する処理を終了し、トレース情報に次の行が存在する場合、次の行を読み込む。
【００６２】
トレース情報Ｔｅｓｔ１の次の行番号２を読み込むと、メソッドＢの呼出開始であることが記述されている。現在追跡中のノードは、現在、ノードＡ６０４であり、ノードＡ６０４の子ノードとして、ノードＢが存在するかどうかを同一呼出構造存在判定部２１４で判断し、その結果を取得する。ノードＡ６０４は一つも子ノードを持たないため、同一のノードは存在しないという結果が得られる。従って、ノードＢ６０６をノードＡ６０４の子ノードとして追加する。追加後、現在の追跡ノードをノードＢ６０６に設定する。ノードＢ６０６に対して、属性として、テストケース名、Ｔｅｓｔ１を属性に定義し、初めての実行であるため、実行回数を１回と設定する。メソッドＢでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。以上でこの行に対する処理を終了し、次の行を読み込む。
【００６３】
トレース情報Ｔｅｓｔ１の次の行番号３を読み込むと、メソッドＣの呼出開始であることが記述されている。現在追跡中のノードは、現在、ノードＢ６０６であり、ノードＢ６０６の子ノードとして、ノードＣが存在するかどうかを同一呼出構造存在判定部２１４で判断し、その結果を取得する。ノードＢ６０６は一つも子ノードを持たないため、同一のノードは存在しないという結果が得られる。従って、ノードＣ６０８をノードＢ６０６の子ノードとして追加する。追加後、現在の追跡ノードをノードＣ６０８に設定する。ノードＣ６０８に対して、属性として、テストケース名、Ｔｅｓｔ１を属性に定義し、初めての実行であるため、実行回数を１回と設定する。メソッドＣでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。以上でこの行に対する処理を終了し、次の行を読み込む。
【００６４】
トレース情報Ｔｅｓｔ１の次の行番号４を読み込むと、メソッドＣの呼出終了であることが記述されている。現在追跡中のノードであるノードＣ６０８の親ノードであるＢを現在追跡中のノードに変更する。
【００６５】
トレース情報Ｔｅｓｔ１の次の行番号５を読み込むと、Ｂの呼出終了であることが記述されている。現在追跡中のノードであるノードＢ６０６の親ノードであるノードＡ６０４を現在追跡中のノードに変更する。
【００６６】
トレース情報Ｔｅｓｔ１の次の行番号６を読み込むと、メソッドＢの呼出開始であることが記述されている。現在追跡中のノードは、現在、ノードＡ６０６であり、ノードＡ６０６の子ノードとして、ノードＢが存在するかどうかを同一呼出構造存在判定部２１４で判断し、その結果を取得する。ノードＡ６０４は一つの子ノードを持ち、かつそのノードは、ノードＢ６０６であるため、ここでは、同一呼出構造が存在すると判断し、その結果を出力する。従って、ノードＡ６０４の子ノードとして、新たなノードＢを追加せず、同一と判断したノードＢ６０６を現在追跡中のノードとして設定する。Ｂに対して、属性として、テストケース名、Ｔｅｓｔ１を設定するが、対象のノードＢ６０６には、Ｔｅｓｔ１の属性が既に定義されている。今回は２回目の実行であるため、実行回数を１回から２回へと１を加算して設定する。メソッドＢでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。以上でこの行に対する処理を終了し、次の行を読み込む。
【００６７】
トレース情報Ｔｅｓｔ１の次の行番号７を読み込むと、メソッドＣの呼出開始であることが記述されている。現在追跡中のノードは、現在、ノードＢ６０６であり、ノードＢ６０６の子ノードとして、ノードＣが存在するかどうかを同一呼出構造存在判定部２１４で判断し、その結果を取得する。ノードＢ６０６は一つの子ノードを持ち、かつそのノードは、ノードＣ６０８であるため、ここでは、同一呼出構造が存在すると判断し、その結果を出力する。従って、ノードＢ６０６の子ノードとして、新たなノードＣを追加せず、同一と判断したノードＣ６０８を現在追跡中のノードとして設定する。ノードＣ６０８に対して、属性として、テストケース名、Ｔｅｓｔ１を設定するが、対象のＣには、Ｔｅｓｔ１の属性が既に定義されている。今回は２回目の実行であるため、実行回数を１回から２回へと１を加算して設定する。メソッドＣでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。以上でこの行に対する処理を終了し、次の行を読み込む。
【００６８】
トレース情報Ｔｅｓｔ１の次の行番号８を読み込むと、メソッドＣの呼出終了であることが記述されている。現在追跡中のノードであるノードＣ６０８の親ノードであるノードＢ６０６を現在追跡中のノードに変更する。
【００６９】
トレース情報Ｔｅｓｔ１の次の行番号９を読み込むと、メソッドＢの呼出終了であることが記述されている。現在追跡中のノードであるノードＢ６０６の親ノードであるノードＡ６０４を現在追跡中のノードに変更する。
【００７０】
トレース情報Ｔｅｓｔ１の次の行番号１０を読み込むと、メソッドＢの呼出開始であることが記述されている。現在追跡中のノードは、現在、ノードＡ６０４であり、ノードＡ６０４の子ノードとして、ノードＢが存在するかどうかを同一呼出構造存在判定部２１４で判断し、その結果を取得する。ノードＡ６０４は一つの子ノードを持ち、かつそのノードは、ノードＢ６０６であるため、ここでは、同一呼出構造が存在すると判断し、その結果を出力する。従って、ノードＡ６０４の子ノードとして、新たなノードＢを追加せず、同一と判断したノードＢ６０６を現在追跡中のノードとして設定する。ノードＢ６０６に対して、属性として、テストケース名、Ｔｅｓｔ１を設定するが、対象のノードＢ６０６には、Ｔｅｓｔ１の属性が既に定義されている。今回は３回目の実行であるため、実行回数を２回から３回へと１を加算して設定する。メソッドＢでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。以上でこの行に対する処理を終了し、次の行を読み込む。
【００７１】
トレース情報Ｔｅｓｔ１の次の行番号１１を読み込むと、メソッドＡの呼出開始であることが記述されている。現在追跡中のノードは、現在、ノードＢ６０６であり、ノードＢ６０６の子ノードとして、ノードＡが存在するかどうかを同一呼出構造存在判定部２１４で判断し、その結果を取得する。ノードＢ６０６は一つの子ノードを持つが、その子ノードは、ノードＣ６０８であるため、ノードＡを子ノードには持たない。従って、ノードＡをノードＢ６０６の子ノードとして定義し、現在追跡中のノードをノードＢ６０６から新たに追加した子ノードであるノードＡ６１０に設定する。属性として、テストケース名、Ｔｅｓｔ１を属性に定義し、初めてのノードの追加であるため、実行回数を１回と設定する。メソッドＡでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。ここで、トレース情報から読み込んだ一行に対する処理を終了し、トレース情報に次の行が存在する場合、次の行を読み込む。
【００７２】
トレース情報Ｔｅｓｔ１の次の行番号１２を読み込むと、メソッドＢの呼出開始であることが記述されている。現在追跡中のノードは、現在、ノードＡ６１０であり、ノードＡ６１０の子ノードとして、ノードＢが存在するかどうかを同一呼出構造存在判定部２１４で判断し、その結果を取得する。ノードＡ６１０は一つも子ノードを持たないため、同一のノードは存在しないと言う結果が得られる。従って、ノードＢをノードＡ６１０の子ノードとして追加する。追加後、現在の追跡ノードをノードＢ６１２に設定する。メソッドＢに対して、属性として、テストケース名、Ｔｅｓｔ１を属性に定義し、初めての実行であるため、実行回数を１回と設定する。メソッドＢでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。以上でこの行に対する処理を終了し、次の行を読み込む。
【００７３】
トレース情報Ｔｅｓｔ１の次の行番号１３を読み込むと、メソッドＢの呼出終了であることが記述されている。現在追跡中のノードであるノードＢ６１２の親ノードであるノードＡ６１０を現在追跡中のノードに変更する。
【００７４】
トレース情報Ｔｅｓｔ１の次の行番号１４を読み込むと、ノードＡの呼出終了であることが記述されている。現在追跡中のノードであるノードＡ６１０の親ノードであるノードＢ６０６を現在追跡中のノードに変更する。
【００７５】
トレース情報Ｔｅｓｔ１の次の行番号１５を読み込むと、メソッドＢの呼出終了であることが記述されている。現在追跡中のノードであるノードＢ６０６の親ノードであるノードＡ６０４を現在追跡中のノードに変更する。
【００７６】
トレース情報Ｔｅｓｔ１の次の行番号１６を読み込むと、メソッドＡの呼出終了であることが記述されている。現在追跡中のノードであるノードＡ６０４の親ノードであるノードＴｏｐ６０２を現在追跡中のノードに変更する。
【００７７】
トレース情報Ｔｅｓｔ１に対するデータは全て読み込み、次のデータがないため、Ｔｅｓｔ１の呼出構造を作成した。現時点までに作成した呼出構造のツリー構造イメージ図を図６に示す。また、このイメージ図に相当する実際のデータ例を図７に示す。図７で示すデータ形式では、項目としてノードのＩＤ、ノード名（メソッド名）、子ノード情報と、機能単位情報（テストケース情報）の４種類を持ってもよい。図７における呼出構造データ７０２、７０４、７０６、７０８、７１０、７１２は、それぞれ、図６のツリー構造におけるノード６０２、６０４、６０６、６０８、６１０、６１２のデータの内容を示している。
【００７８】
図７に示したそれぞれの呼出構造のノードのデータ構造の例を図８（ｂ）に示す。各ノードは、メソッドに対して作成するため、そのノードの識別子としてのＩＤ、ノード名、子ノード情報の配列、機能単位情報であるテストケースの配列を持つ。子ノードへのアクセスは、ＩＤを通じてアクセスするため、その情報の一覧をＣｈｉｌｄ配列で保持する。テストケース情報については、テストケース名とそのテストケースに対応する実行回数を組み合わせて保持してもよい。このことで、テストケースに対する実行回数を保持する。図７には例として配列として記述したが、リスト構造として、動的に数を増やすことが出来る形にしてもよい。図８（ｂ）における、データ項目８０２乃至８０８については、図２Ｂで説明した。これに加えて、Ａｒｇｓ（ｔｙｐｅ，ｖａｌｕｅ）８１０は、引数を属性として記憶する領域を示す。引数の型ｔｙｐｅと、値ｖａｌｕｅを対にして記憶しておく。また、Ｒｅｔｕｒｎ（ｔｙｐｅ，ｖａｌｕｅ）は、戻り値を属性として記憶しておく領域を示す。戻り値の型ｔｙｐｅと、値ｖａｌｕｅを対にして記憶しておく。
【００７９】
次に、図１で示したトレース情報Ｔｅｓｔ２に対しても、同様に呼出構造を作成する。ここで、Ｔｅｓｔ１に対して作成している呼出構造の上に、Ｔｅｓｔ２の構造を作成する。
【００８０】
Ｔｅｓｔ２のトレース情報のイベントを一行ずつ読み込み、呼出構造を作成する。この場合、呼出構造は既にＴｅｓｔ１に対して作成しているため、最上位ノードとして、Ｔｅｓｔ１で作成したノードＴｏｐ６０２を取得して、現在追跡中のノードとしてノードＴｏｐ６０２を設定する。最上位ノード取得部の出力結果として、ノードＴｏｐ６０２が出力される。
【００８１】
図９と図１（ｂ）を参照する。Ｔｅｓｔ２のデータを読み込む処理について説明する。図１（ｂ）の行番号１は、Ａというメソッド名の呼出開始であることが記述されている。同一呼出構造存在判定部２１４では、入力として受け取ったメソッドＡに対応するノードＡが、現在追跡中のノードＴｏｐ６０２の子ノードとして存在するか否かを判断する。既に、ノードＴｏｐ６０２は一つの子ノードを持ち、かつそのノードは、ノードＡ６０４であるため、ここでは、同一呼出構造が存在すると判断し、その結果を出力する。従って、ノードＴｏｐ６０２の子ノードとして、新たなノードＡを追加せず、同一と判断したノードＡ６０４を現在追跡中のノードとして設定する。現在追跡中のノードをノードＡ６０４へ移動する。また、現在、ノードＡ６０４に対して、属性として、テストケース名Ｔｅｓｔ２を属性として追加し、Ｔｅｓｔ２としては、初めての実行であるため、Ｔｅｓｔ２に対する実行回数を１回と設定する。メソッドＡでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。ここで、トレース情報から読み込んだ行番号１に対する処理を終了し、トレース情報に次の行が存在する場合、次の行を読み込む。
【００８２】
トレース情報Ｔｅｓｔ２の行番号２を読み込むと、メソッドＢの呼出開始であることが記述されている。現在追跡中のノードは、ノードＡ６０４であり、ノードＡ６０２の子ノードとして、ノードＢが存在するかどうかを同一呼出構造存在判定部２１４で判断し、その結果を取得する。ノードＡ６０４は一つの子ノードを持ち、かつそのノードは、ノードＢ６０６であるため、ここでは、同一呼出構造が存在すると判断し、その結果を出力する。従って、ノードＡ６０４の子ノードとして、新たなノードＢを追加せず、同一と判断したノードＢ６０６を現在追跡中のノードとして設定する。ノードＢ６０６に対して、属性として、テストケース名Ｔｅｓｔ２としては、初めての実行であるため、Ｔｅｓｔ２に対する実行回数を１回と設定する。メソッドＢでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。ここで、トレース情報から読み込んだ一行に対する処理を終了し、トレース情報に次の行が存在する場合、次の行を読み込む。
【００８３】
トレース情報Ｔｅｓｔ２の次の行番号３を読み込むと、メソッドＣの呼出開始であることが記述されている。現在追跡中のノードは、現在、ノードＢ６０６であり、ノードＢ６０６の子ノードとして、ノードＣが存在するかどうかを同一呼出構造存在判定部２１４で判断し、その結果を取得する。ノードＢ６０６は一つの子ノードを持ち、かつそのノードは、ノードＣ６０８であるため、ここでは、同一呼出構造が存在すると判断し、その結果を出力する。従って、ノードＢ６０６の子ノードとして、新たなノードＣを追加せず、同一と判断したノードＣ６０８を現在追跡中のノードとして設定する。ノードＣ６０８に対して、属性として、テストケース名、Ｔｅｓｔ２を設定するが、対象のノードＣ６０８には、Ｔｅｓｔ２としては、初めての実行であるため、Ｔｅｓｔ２に対する実行回数を１回と設定する。メソッドＣでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。ここで、トレース情報から読み込んだ一行に対する処理を終了し、トレース情報に次の行が存在する場合、次の行を読み込む。
【００８４】
トレース情報Ｔｅｓｔ２の次の行番号４を読み込むと、メソッドＣの呼出終了であることが記述されている。現在追跡中のノードであるノードＣ６０８の親ノードであるノードＢ６０６を現在追跡中のノードに変更する。
【００８５】
トレース情報Ｔｅｓｔ２の次の行番号５を読み込むと、メソッドＢの呼出終了であることが記述されている。現在追跡中のノードであるノードＢ６０６の親ノードであるノードＡ６０４を現在追跡中のノードに変更する。
【００８６】
トレース情報Ｔｅｓｔ２の次の行番号６を読み込むと、メソッドＢの呼出開始であることが記述されている。現在追跡中のノードは、ノードＡ６０４であり、ノードＡ６０４の子ノードとして、ノードＢが存在するかどうかを同一呼出構造存在判定部で判断し、その結果を取得する。ノードＡ６０４は一つの子ノードを持ち、かつそのノードは、ノードＢ６０６であるため、ここでは、同一呼出構造が存在すると判断し、その結果を出力する。従って、ノードＡ６０４の子ノードとして、新たなノードＢを追加せず、同一と判断したノードＢ６０６を現在追跡中のノードとして設定する。ノードＢ６０６に対して、属性として、テストケース名、Ｔｅｓｔ２を設定するが、対象のノードＢ６０６には、Ｔｅｓｔ２の属性が既に定義されている。今回は２回目の実行であるため、実行回数を１回から２回へと１を加算して設定する。メソッドＢでは、特に引数値、戻り値などの情報は保持していないため、その他の属性値は追加しない。以上でこの行に対する処理を終了し、次の行を読み込む。
【００８７】
トレース情報Ｔｅｓｔ２の次の行番号７を読み込むと、メソッドＤの呼出開始であることが記述されている。現在追跡中のノードは、現在、ノードＢ６０６であり、ノードＢ６０６の子ノードとして、ノードＤが存在するかどうかを同一呼出構造存在判定部２１４で判断し、その結果を取得する。ノードＢ６０６は二つの子ノードを持つが、いずれもノードＤではないため、ここでは、同一呼出構造が存在しないと判断し、その結果を出力する。従って、ノードＢ６０６の子ノードとして、新たなノードＤを追加し、ノードＤ９０２を現在追跡中のノードとして設定する。ノードＤ９０２に対して、属性として、テストケース名、Ｔｅｓｔ２を設定するが、初めての実行であるため、Ｔｅｓｔ２に対する実行回数を１回と設定する。メソッドＤでは、引数値として、ａｒｇ１、ａｒｇ２の２つの型情報、値としてそれぞれ、ｖ１、ｖ２を属性として取得し、保存する。
【００８８】
トレース情報Ｔｅｓｔ２の次の行番号８を読み込むと、メソッドＤの呼出終了であることが記述されている。そして、戻り値の型情報として、ａ３、戻り値として、ｖ３が記述されている。このように、メソッドの呼出終了のイベントに、何らかの記録すべき属性が存在する場合には、現在追跡中のノードを親ノードに変更する前に、これらの属性を保存する。属性の保存が完了した後に、現在追跡中のノードであるノードＤ９０２の親ノードであるノードＢ６０６を現在追跡中のノードに変更する。したがって、メソッド呼出終了の場合には、メソッド呼出開始の場合と比較して、次のノード（親ノード）に移行するタイミングが異なる点に留意する必要がある。この点は、図３のステップ３１６、３３１及び３３２に関連して、既に説明した。ここで、トレース情報から読み込んだ一行に対する処理を終了し、トレース情報に次の行が存在する場合、次の行を読み込む。
【００８９】
トレース情報Ｔｅｓｔ２の次の行番号９を読み込むと、メソッドＢの呼出終了であることが記述されている。現在追跡中のノードであるノードＢ６０６の親ノードであるノードＡ６０４を現在追跡中のノードに変更する。
【００９０】
トレース情報Ｔｅｓｔ２の次の行番号１０を読み込むと、メソッドＡの呼出終了であることが記述されている。現在追跡中のノードであるノードＡ６０４の親ノードであるノードＴｏｐ６０２を現在追跡中のノードに変更する。
【００９１】
以上により、Ｔｅｓｔ１とＴｅｓｔ２の二つのテストケースに対する呼出構造が作成された。作成された呼出構造のツリー構造イメージを図９に示す。また、作成された呼出構造データの例を図１０に示す。図１０において、例えば、呼出構造１０２０は、図９におけるノードＤ９０２のデータの内容を示している。ここでは、引数及び戻り値が、それぞれＡｒｇｓ１０２２、Ｒｅｔｕｒｎ１０２４として、属性として記憶されていることが分かる。その他の項目については、他の図で既に説明しているので、説明は省略する。
【００９２】
図１１（ｂ）に、呼出構造データのデータ構造の例を示す。図８（ｂ）に示した場合に加えて、引数値、戻り値がある。属性情報を記録する場合、引数の値に応じて、一組として管理する数が変わるので、可変長のデータ構造として管理してもよい。個々の引数に関しては、引数の型情報と値を一組として保持してもよい。戻り値も、型情報と値を組み合わせとして保持してもよい。
【００９３】
単純にトレース情報を記録する場合には、同じ処理を複数回動作させると、その実行した回数分だけ、トレース情報量が比例して増加することとなる。これに対して、実施形態で示した構成では、同一呼び出しに対して重複を避けたツリー構造を作成し、各ノード上の属性値を更新すればよいため、少ない情報量で、トレース情報を記録することができる。
【００９４】
従って、特に繰り返し処理が多い場合、大量のトレースを行っても、少ない情報量で記録することが出来る。図１２に、比較の一例を示す。図１２（ａ）は、ノードの集約を行わない場合のツリー構造を示している。図１２（ｂ）は、上述の一実施形態によってノードの集約を行った場合のツリー構造を示す。この比較でノード数は、８個から６個に減っているが、個々のノード間の関係や情報量は、同じである。現実のトレース情報においては、トレース情報量が膨大になるため、本実施形態の情報集約の効果は非常に大きくなる。
【００９５】
例えば、プログラムの変更時などで、広い範囲のトレース情報を比較しなければならないときに、プログラムの変更前後のトレース情報の比較を容易に行うことができる。
【００９６】
また、従来の実行履歴情報として利用するカバレッジ情報と違い、呼出構造を保持することで、あるメソッドを呼出している呼び出し元や、そのメソッドが呼ぶ、呼び出し先の情報を追跡することが可能であるため、メソッド間の関係を容易に把握することが出来る。
【００９７】
さらに属性値に、実行回数を保持することで、呼出構造の中で頻繁に実行される箇所と、そうでない箇所が容易に特定出来る。
【００９８】
また、データの値に依存して、繰り返し処理やジャンプ先が動的に変更されるようなプログラムに対しても、その動作の挙動を的確に把握することができる。このような動的な変更を行うプログラムは、ソースの記述から、その挙動を把握することは非常に困難である。
【００９９】
テストケース名を保持していることで、テストケース別にその呼出関係の調査を行うことにも利用できる。また、その他の属性で呼出構造を検索することで、その属性の観点から、呼出関係を把握することも容易に行える。
【０１００】
また、一実施形態では、イベントを読み込む毎に、メソッドの呼出構造の情報を作成しているため、予め呼出構造のパターンを定義しておく必要がない。したがって、種々のプログラムに対して、柔軟に対応することができる。
【０１０１】
図１３は、複数のテストケースによって作成された呼出構造から、特定のテストケースの呼出構造を抽出してツリー構造として表示する例を示している。図１３（ａ）は、Ｔｅｓｔ１及びＴｅｓｔ２の両者を用いて集約されたツリー構造である。図１３（ｂ）は、この呼出構造のデータに対し、Ｔｅｓｔ１を検索キーとして検索し、ツリー構造を構築した例を示している。この実施形態により、特定のテストケースの観点から、アプリケーションプログラムの呼出構造を容易に把握できる。
【０１０２】
図１４は、複数のテストケースの呼出構造の差分を抽出して強調表示する例を示している。図１４（ａ）は、Ｔｅｓｔ１及びＴｅｓｔ２の両者を用いて集約されたツリー構造である。図１４（ｂ）は、Ｔｅｓｔ１及びＴｅｓｔ２の両者の呼出構造の差分がハイライト表示されることを示している。すなわち、ノードＡ１４０２及びノードＢ１４０６は、Ｔｅｓｔ１のみに存在するノードを示している。そして、ノードＤ１４０６は、Ｔｅｓｔ２にのみに存在するノードを示している。その他の、ハイライト表示されていないノードは、Ｔｅｓｔ１及びＴｅｓｔ２の両者に共通するノードを示している。このような差分を表示する実施形態により、たとえばアプリケーションプログラムの変更前（Ｔｅｓｔ１）と変更後（Ｔｅｓｔ２）のプログラム実行動作の相違点を視覚的に容易に把握することができる。また、各ノードの呼出構造のリスト表示（不図示）を参照すれば、その相違の詳細を把握することもできる。
【０１０３】
図１５は、一実施形態のハードウエア構成を示している。ハードウエアには、ＣＰＵ１５０２、メモリ１５０４、動的メモリ１５０６、媒体を読み書きするドライブ１５０８、通信インターフェース１５１０、表示装置１５１３等に画像信号を送るビデオインターフェース１５１２、Ｉ／Ｏインターフェース１５１４、Ｉ／Ｏとしてのキーボード１５１６、マウス１５１８、プリンタ１５２０が含まれる。
【０１０４】
また、プログラムに係る本発明は、機械読み取り可能な記録媒体に格納されてもよい。機械読み取り可能な記録媒体には、磁気記録媒体、光ディスク、光磁気記録媒体、半導体メモリなどがある。磁気記録媒体には、ＨＤＤ、フレキシブルディスク（ＦＤ）、磁気テープ（ＭＴ）などがある。光ディスクには、ＤＶＤ（Ｄｉｇｉｔａｌ  Ｖｅｒｓａｔｉｌｅ  Ｄｉｓｃ）、ＤＶＤ−ＲＡＭ、ＣＤ−ＲＯＭ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ−Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）、ＣＤ−Ｒ（Ｒｅｃｏｒｄａｂｌｅ）／ＲＷ（ＲｅＷｒｉｔａｂｌｅ）などがある。また、光磁気記録媒体には、ＭＯ（Ｍａｇｎｅｔｏ−Ｏｐｔｉｃａｌ  ｄｉｓｋ）などがある。
【０１０５】
なお、上述の実施形態では、実行トレース情報において、メソッドの実行順序は、ツリー構造をたどることを前提としている。したがって、例えば、複数のスレッドが同時に動作するプログラムのトレースを対象とする場合には、特定のスレッドＩＤに注目して、実行トレースを取ればよい。あるいは、実行トレース情報から特定のスレッドＩＤを抽出して、上述の実施形態を実施すればよい。
【０１０６】
なお、プログラム及び方法の発明の各ステップは、矛盾のないかぎり、順番を入れ替えて実施しても良い。そして、請求項に係る発明において、このように順番を入れ替えた発明も、当然にその請求項に係る発明の技術的範囲に属することは言うまでもない。
【０１０７】
以上の複数の実施形態に関し、更に以下の付記を開示する。
（付記１）
アプリケーションプログラムに含まれる複数の処理単位の各々をノードに対応させ、前記アプリケーションプログラムに対するテストケースの実行トレース情報に含まれる複数のイベントに基づいて、最上位ノードを出発点としてノードを追跡しながら、前記複数の処理単位の各々の呼出構造を、前記ノード間を結ぶツリー構造として記憶部に記憶するプログラムであって、
前記実行トレース情報から、Ｎ番目のイベントを読み込み、
前記Ｎ番目のイベントが処理単位の呼出開始イベントの場合には、現在追跡しているノードから、前記呼出開始イベントが示す処理単位に対応する子ノードに移動すべきことを決定し、前記Ｎ番目のイベントが処理単位の呼出終了イベントの場合には、現在追跡しているノードよりも最上位ノード側の親ノードに移動すべきことを決定することによって、ノードを追跡し、
前記決定において前記子ノードに移動すべきことが決定された場合に、前記現在追跡しているノードの子ノードに前記呼出開始イベントが示す処理単位に対応するノードが既に存在するか否かを判定し、
前記判定において存在しないと判定された場合には、移動すべき前記子ノードを前記記憶部に記憶された前記ツリー構造に追加記憶する、
処理をコンピュータに実行させるプログラム。
（付記２）
前記イベントには属性が含まれ、前記Ｎ番目のイベントに含まれる属性を抽出し、該抽出した属性を前記Ｎ番目のイベントに関連するノードに対応づけて前記記憶部に記憶する、
処理を更にコンピュータに実行させる付記１記載のプログラム。
（付記３）
前記属性は、前記処理単位の引数、前記処理単位の戻り値、前記処理単位の実行回数、及び前記テストケースの識別情報のうち、いずれか１つを含む、
付記１又は２記載のプログラム。
（付記４）
指定された属性に基づいて、ツリー構造に関連する情報を加工して出力する、
処理を更にコンピュータに実行させる付記１乃至３のうちいずれか１項記載のプログラム。
（付記５）
前記加工して出力する処理は、第１のテストケースによって出力されたツリー構造と、第２のテストケースによって出力されたツリー構造との相違点を出力する、
処理を更にコンピュータに実行させる付記４記載のプログラム。
（付記６）
前記加工して出力する処理は、第１のテストケースによって出力されたツリー構造と、第２のテストケースによって出力されたツリー構造とが一致するか否かを判断した結果を出力する、
処理を更にコンピュータに実行させる付記４又は５記載のプログラム。
（付記７）
アプリケーションプログラムに含まれる複数の処理単位の各々をノードに対応させ、前記アプリケーションプログラムに対するテストケースの実行トレース情報に含まれる複数のイベントに基づいて、最上位ノードを出発点としてノードを追跡しながら、前記複数の処理単位の各々の呼出構造を、前記ノード間を結ぶツリー構造として記憶部に記憶する方法であって、
前記実行トレース情報から、Ｎ番目のイベントを読み込み、
前記Ｎ番目のイベントが処理単位の呼出開始イベントの場合には、現在追跡しているノードから、前記呼出開始イベントが示す処理単位に対応する子ノードに移動すべきことを決定し、前記Ｎ番目のイベントが処理単位の呼出終了イベントの場合には、現在追跡しているノードよりも最上位ノード側の親ノードに移動すべきことを決定することによって、ノードを追跡し、
前記決定において前記子ノードに移動すべきことが決定された場合に、前記現在追跡しているノードの子ノードに前記呼出開始イベントが示す処理単位に対応するノードが既に存在するか否かを判定し、
前記判定において存在しないと判定された場合には、移動すべき前記子ノードを前記記憶部に記憶された前記ツリー構造に追加記憶する、
ことを特徴とする方法。
（付記８）
前記イベントには属性が含まれ、前記Ｎ番目のイベントに含まれる属性を抽出し、該抽出した属性を前記Ｎ番目のイベントに関連するノードに対応づけて前記記憶部に記憶する、
ことを特徴とする付記７記載の方法。
（付記９）
前記属性は、前記処理単位の引数、前記処理単位の戻り値、前記処理単位の実行回数、及び前記テストケースの識別情報のうち、いずれか１つを含む、
ことを特徴とする付記7又は８記載の方法。
（付記１０）
指定された属性に基づいて、ツリー構造に関連する情報を加工して出力する、
ことを特徴とする付記７乃至９のうちいずれか１項記載の方法。
（付記１１）
前記加工して出力する処理は、第１のテストケースによって出力されたツリー構造と、第２のテストケースによって出力されたツリー構造との相違点を出力する、
ことを特徴とする付記１０記載の方法。
（付記１２）
前記加工して出力する処理は、第１のテストケースによって出力されたツリー構造と、第２のテストケースによって出力されたツリー構造とが一致するか否かを判断した結果を出力する、
ことを特徴とする付記１０又は１１記載の方法。
（付記１３）
アプリケーションプログラムに含まれる複数の処理単位の各々をノードに対応させ、前記アプリケーションプログラムに対するテストケースの実行トレース情報に含まれる複数のイベントに基づいて、最上位ノードを出発点としてノードを追跡しながら、前記複数の処理単位の各々の呼出構造を、前記ノード間を結ぶツリー構造として記憶部に記憶する装置であって、
前記実行トレース情報から、Ｎ番目のイベントを読み込む、イベント読込部と、
前記Ｎ番目のイベントが処理単位の呼出開始イベントの場合には、現在追跡しているノードから、前記呼出開始イベントが示す処理単位に対応する子ノードに移動すべきことを決定し、前記Ｎ番目のイベントが処理単位の呼出終了イベントの場合には、現在追跡しているノードよりも最上位ノード側の親ノードに移動すべきことを決定することによって、ノードを追跡する、ノード追跡部と、
前記決定において前記子ノードに移動すべきことが決定された場合に、前記現在追跡しているノードの子ノードに前記呼出開始イベントが示す処理単位に対応するノードが既に存在するか否かを判定する、同一呼出構造存在判定部と、
前記判定において存在しないと判定された場合には、移動すべき前記子ノードを前記記憶部に記憶された前記ツリー構造に追加記憶する、呼出構造ノード追加部と、
を有することを特徴とする装置。
（付記１４）
前記イベントには属性が含まれ、前記Ｎ番目のイベントに含まれる属性を抽出し、該抽出した属性を前記Ｎ番目のイベントに関連するノードに対応づけて前記記憶部に記憶する、呼出構造属性追加部、
を更に有することを特徴とする付記１３記載の装置。
（付記１５）
前記属性は、前記処理単位の引数、前記処理単位の戻り値、前記処理単位の実行回数、及び前記テストケースの識別情報のうち、いずれか１つを含む、
付記１３又は１４記載の装置。
（付記１６）
指定された属性に基づいて、ツリー構造に関連する情報を加工して出力する、データ加工部、
を更に有する付記１３乃至１５のうちいずれか１項記載の装置。
（付記１７）
前記データ加工部は、第１のテストケースによって出力されたツリー構造と、第２のテストケースによって出力されたツリー構造との相違点を出力する、
付記１６記載の装置。
（付記１８）
前記データ加工部は、第１のテストケースによって出力されたツリー構造と、第２のテストケースによって出力されたツリー構造とが一致するか否かを判断した結果を出力する、
付記１６又は１７記載の装置。
【符号の説明】
【０１０８】
２０２  最上位ノード取得部
２０８  イベント読込部
２１０  ノード追跡部
２１４  同一呼出構造存在判定部
２１８  呼出構造ノード追加部
２２２  呼出構造属性追加部
２２６  表示・ユーザーインターフェース部
２２８  データ加工部
【図１】
0005772233.tif 000002
【図２Ａ】
0005772233.tif 000003
【図２Ｂ】
0005772233.tif 000004
【図３】
0005772233.tif 000005
【図４】
0005772233.tif 000006
【図５】
0005772233.tif 000007
【図６】
0005772233.tif 000008
【図７】
0005772233.tif 000009
【図８】
0005772233.tif 000010
【図９】
0005772233.tif 000011
【図１０】
0005772233.tif 000012
【図１１】
0005772233.tif 000013
【図１２】
0005772233.tif 000014
【図１３】
0005772233.tif 000015
【図１４】
0005772233.tif 000016
【図１５】
0005772233.tif 000017