以下、本実施の形態について図面を参照して説明する。
[第1の実施の形態]
第1の実施の形態を説明する。
図1は、第1の実施の形態の情報処理装置の処理例を示す図である。
情報処理装置10は、テスト対象装置20により実行されるアプリケーションの動作テストの分析に用いられる。テスト対象装置20は、動作テスト対象のアプリケーションを実行する装置である。情報処理装置10、テスト対象装置20および端末装置31,32,33は、ネットワーク40に接続されている。アプリケーションの動作テストは、複数のテストケースを含む。
端末装置31,32,33は、複数のテストケースに対応する複数のアクセスを、テスト対象装置20に対して並列に発生させる。テスト対象装置20では、複数のアクセスに応じて、アプリケーションによる複数の処理が実行される。
情報処理装置10は、アプリケーションにより実行された複数の処理に対応する複数の実行箇所と、該当の実行箇所の実行原因となったアクセス元とを適切に対応付け可能にする機能を提供する。情報処理装置10は、記憶部11および処理部12を有する。
記憶部11は、RAM(Random Access Memory)などの揮発性記憶装置でもよいし、HDD(Hard Disk Drive)やフラッシュメモリなどの不揮発性記憶装置でもよい。処理部12は、CPU(Central Processing Unit)、DSP(Digital Signal Processor)、ASIC(Application Specific Integrated Circuit)、FPGA(Field Programmable Gate Array)などを含み得る。処理部12はプログラムを実行するプロセッサであってもよい。ここでいう「プロセッサ」には、複数のプロセッサの集合(マルチプロセッサ)も含まれ得る。
記憶部11は、処理部12による処理に用いられるデータを記憶する。記憶部11は、情報処理装置10の外部に設けられ、情報処理装置10に接続される記憶装置により実現されてもよい。
処理部12は、テスト対象装置20(第1の情報処理装置)で実行されるアプリケーションのプログラムP1(オリジナルのプログラム)を取得する。情報処理装置10は、プログラムP1を取得する取得部を有してもよい。
処理部12は、アプリケーションに端末装置31,32,33の何れかの端末装置(第2の情報処理装置)からのアクセスが発生したことに応じてアクセス元を判別するための判別情報A1を取得する命令文(コード)を、取得したプログラムP1に追加する。情報処理装置10は、当該命令文をプログラムP1に追加する追加部を有してもよい。命令文が追加されたプログラムを、書換後プログラムP2とする。例えば、プログラムP1の実行箇所は、プログラムP1に含まれる関数名やメソッド名などにより特定される。
判別情報A1としては、スレッドの識別情報であるスレッド識別情報(スレッドID(IDentifier)と言う)、および、ユーザエージェント(UA:User Agent)情報などの複数の情報の組が考えられる。
スレッドIDは、動作テスト対象のアプリケーションにより、当該アプリケーションにおけるスレッドの管理のために付与される。スレッドは、ある端末装置からのアクセスに対応するアプリケーションによる一連の処理に対してテスト対象装置20により割り当てられる。すなわち、同一のスレッドIDが付与された実行箇所のアクセス元は、同一の端末装置となる。UA情報は、端末装置からテスト対象装置20へのリクエスト(アクセスの要求)に付与されるテスタまたは端末装置の識別情報である。UA情報は、例えば、端末装置によりUA偽装技術を用いて当該リクエストに付与される。
ただし、スレッドIDはアプリケーション側での管理情報なので、複数の端末装置から並列にアクセスがある場合、スレッドIDのみでは、端末装置の特定を行うことは難しい。また、UA情報は、動作テスト対象のアプリケーションのモジュールによっては出力不能なことがある。
そこで、処理部12は、判別情報A1として、実行箇所の情報(関数名やメソッド名など)に加えて、スレッドID、または、スレッドIDとUA情報との組をログなどに出力する命令文を、プログラムP1に追加することが考えられる。
処理部12は、命令文が追加されたプログラム(書換後プログラムP2)に基づいて、アクセスに応じた処理をテスト対象装置20に実行させる。処理部12は、実行された処理の情報(処理情報A2)と、アクセスに応じて取得された判別情報A1とを対応付けて、記憶部11に記録する。処理情報A2は、書換後プログラムP2(あるいは、プログラムP1)における実行箇所の情報を含む。
例えば、テスト対象装置20は、書換後プログラムP2を実行し、端末装置31,32,33からの複数のアクセスに応じた、書換後プログラムP2による複数の処理を実行する。テスト対象装置20は、処理情報A2とともに、当該処理が実行されたときに取得された判別情報A1を、各処理に対して記録したログを出力する。処理部12は、当該ログに基づいて、処理情報A2と判別情報A1とを対応付けて、記憶部11に記録する。
これにより、処理情報A2で示される実行箇所に対して、判別情報A1で示されるアクセス元を適切に特定可能になる。
特に、判別情報A1として、前述のように複数の種類の情報(例えば、スレッドIDおよびUA情報など)の組を記録することで、1つの種類の情報だけではアクセス元の特定が困難になる場合でも、アクセス元を適切に特定可能になる。例えば、次の通りである。
図2は、アクセス元の特定例を示す図である。
テスタU1,U2,U3は、端末装置31,32,33を用いて、テスト対象装置20の動作テストを行うための操作入力を行うユーザである。テスタU1は、端末装置31を操作する。テスタU2は、端末装置32を操作する。テスタU3は、端末装置33を操作する。複数のテストケースは、テスタU1,U2,U3により分担される。
例えば、複数のテストケースは、テストケース1,2,3,4を含む。テスタU1は、テストケース1,2を担当する。テスタU2は、テストケース3を担当する。テスタU3は、テストケース4を担当する。
前述のように、処理部12は、オリジナルのプログラムP1に判別情報A1を出力させるための命令文を追加することで、書換後プログラムP2を生成する。ここで、命令文は、判別情報A1として、スレッドIDおよびUA情報を出力するためのコードであるとする。処理部12は、書換後プログラムP2に基づいて、端末装置31,32,33からのアクセスに応じた処理をテスト対象装置20に実行させる。
例えば、処理部12は、書換後プログラムP2をテスト対象装置20に配備する。そして、動作テスト対象のアプリケーションがテスト対象装置20で実行可能となる。
テスタU1,U2,U3は、それぞれ端末装置31,32,33を、同時並列的に操作して、自身が担当するテストケースに関する操作入力を行う。端末装置31,32,33は、操作入力の内容(リクエスト)をテスト対象装置20に送信する。
テスト対象装置20は、端末装置31,32,33からリクエストを受け付け、リクエストに応じた処理を実行し、当該処理に応じたログL1を出力する。ログL1には、処理部12により追加された命令文に応じて、実行箇所の情報とスレッドIDとUA情報とが記録される。ただし、UA情報を出力できないモジュールもあるため、当該モジュールについてはUA情報が記録されない。ログL1の1行に相当するレコードは、例えば、メソッド名、スレッドID、UA情報の組となる。ただし、UA情報が設定なし(ハイフン記号「-」で表す)のこともある。
ログL1では、上の行から下の行へ向かう方向が時系列の正方向(下の行ほど新しい時刻)である。ここで、テスタU1の名称を「テスタA」とし、端末装置31によりリクエストに付与されるUA情報を「Testrack/A」とする。また、テスタU2の名称を「テスタB」とし、端末装置32によりリクエストに付与されるUA情報を「Testrack/B」とする。更に、テスタU3の名称を「テスタC」とし、端末装置33によりリクエストに付与されるUA情報を「Testrack/C」とする。
例えば、ログL1の最上段の行には、「テスタAがテストケース1開始」の文字列が記録されている。この行は注釈行であり、例えば、テスト対象装置20がテストケース1の開始時に所定のメッセージを端末装置31から受信することで出力される。注釈行には、例えば、テスト対象装置20がテストケース1の終了時に所定のメッセージを端末装置31から受信することで出力される「テスタAがテストケース1終了」といった文字列を含むものもある。注釈行の出力時刻は、各モジュールの実際の実行時刻と必ずしも同期していない。このため、注釈行が記録されていたとしても、注釈行をアクセス元の判別に用いることができないことがある。また、当該注釈行はログL1に記録されないこともある。
例えば、ログL1は、「methodA,thread1,Testrack/A」というレコードを含む。このレコードは、メソッド名「methodA」のメソッドの実行に対して、スレッドID「thread1」のスレッド、および、UA情報「Testrack/A」が対応することを示す。
また、例えば、ログL1は、「methodB,thread1,-」というレコードを含む。このレコードは、メソッド名「methodB」のメソッドの実行に対して、スレッドID「thread1」のスレッドが対応すること、および、UA情報の記録がないことを示す。
ログL1には、他のテストケースに応じて実行された他のメソッドと、他のスレッドIDと、他のUA情報との対応関係を示すレコードも同様に記録される。
処理部12は、テスト対象装置20からログL1を取得することで、実行された処理の情報(処理情報A2)と、アクセスに応じて取得された判別情報A1とを対応付けて、記憶部11に記録する。
例えば、処理部12は、ログL1における「methodA,thread1,Testrack/A」のレコードから、メソッド名「methodA」と、スレッドID「thread1」と、UA情報「Testrack/A」との対応関係を得る。すると、処理部12は、ログL1の「methodB,thread1,-」のレコードに対して、UA情報「Testrack/A」を対応付けることができる。よって、処理部12は、実行箇所を示すメソッド名(処理情報A2の一例)「methodA」および「methodB」のそれぞれに対して、判別情報A1の一例である「thread1」および「Testrack/A」を対応付けて、記憶部11に記録し得る。この場合、(上記の注釈行が記録されていなくても)「methodA」および「methodB」の一連の処理の実行原因のアクセス元は、テスタU1または端末装置31であると判別される。
また、例えば、処理部12は、ログL1における「methodC,thread2,Testrack/A」のレコードから、メソッド名「methodC」と、スレッドID「thread2」と、UA情報「Testrack/A」との対応関係を得る。すると、処理部12は、ログL1の「methodB,thread2,-」のレコードに対して、UA情報「Testrack/A」を対応付けることができる。よって、処理部12は、実行箇所を示すメソッド名(処理情報A2の一例)「methodC」および「methodB」のそれぞれに対して、判別情報A1の一例である「thread2」および「Testrack/A」を対応付けて、記憶部11に記録し得る。この場合、「methodC」および「methodB」の一連の処理の実行原因のアクセス元は、テスタU1または端末装置31であると判別される。
また、例えば、処理部12は、ログL1における「methodB,thread4,Testrack/C」のレコードから、メソッド名「methodB」と、スレッドID「thread4」と、UA情報「Testrack/C」との対応関係を得る。すると、処理部12は、ログL1の「methodD,thread4,-」のレコードに対して、UA情報「Testrack/C」を対応付けることができる。よって、処理部12は、実行箇所を示すメソッド名(処理情報A2の一例)「methodB」および「methodD」のそれぞれに対して、判別情報A1の一例である「thread4」および「Testrack/C」を対応付けて、記憶部11に記録し得る。この場合、「methodB」および「methodD」の一連の処理の実行原因のアクセス元は、テスタU3または端末装置33であると判別される。
更に、例えば、処理部12は、ログL1における「methodC,thread3,Testrack/B」のレコードから、メソッド名「methodC」と、スレッドID「thread3」と、UA情報「Testrack/B」との対応関係を得る。すると、処理部12は、ログL1の「methodE,thread3,-」のレコードに対して、UA情報「Testrack/B」を対応付けることができる。よって、処理部12は、実行箇所を示すメソッド名(処理情報A2の一例)「methodC」および「methodE」のそれぞれに対して、判別情報A1の一例である「thread3」および「Testrack/B」を対応付けて、記憶部11に記録し得る。この場合、「methodC」および「methodE」の一連の処理の実行原因のアクセス元は、テスタU2または端末装置32であると判別される。
このように、情報処理装置10によれば、第1の情報処理装置(例えば、テスト対象装置20)で実行されるアプリケーションのプログラムP1が取得される。アプリケーションに第2の情報処理装置(例えば、端末装置31,32,33)からのアクセスが発生したことに応じてアクセス元を判別するための判別情報A1を取得する命令文が、取得したプログラムP1に追加される。命令文が追加された書換後プログラムP2に基づいて、アクセスに応じた処理が第1の情報処理装置により実行される。情報処理装置10により、実行された処理の情報(処理情報A2)と、アクセスに応じて取得された判別情報A1とが対応付けて記憶部11に記録される。
これにより、複数の端末装置から並列にアクセスがある場合でも、アプリケーションのアクセス元を適切に特定できる。前述のように、例えば、記憶部11に記録された情報に基づいて、「thread1」に対応する「methodA」、「methodB」の一連の実行箇所に対して、アクセス元として、テスタU1または端末装置31が適切に特定される。また、「thread2」に対応する「methodC」、「methodB」の一連の実行箇所に対して、アクセス元として、テスタU1または端末装置31が適切に特定される。何れの実行箇所が何れのテストケースに属するかは、例えば、端末装置31におけるテストケースの使用順序を基に特定される。
また、例えば、「thread4」に対応する「methodB」、「methodD」の一連の実行箇所に対して、アクセス元として、テスタU3または端末装置33が適切に特定される。更に、例えば、「thread3」に対応する「methodC」、「methodE」の一連の実行箇所に対して、アクセス元として、テスタU2または端末装置32が適切に特定される。
こうして、テスタU1,U2,U3により、端末装置31,32,33を用いて複数のテストケースに対する操作入力が同時並列的に行われる場合でも、アプリケーションの実行箇所に対して、当該実行箇所の実行原因となったアクセス元を適切に特定できる。その結果、当該実行箇所に対応するテストケースを適切に特定可能になる。このため、例えば、次回以降に行われる動作テストについて、実行箇所が重複するテストケースを集約したり、実行箇所に応じてテストケースを評価し、実行するテストケースを絞り込んだりして、動作テストの効率化を図れる。
更に、複数のテストケースに対する操作入力を並列に行えるようになることで、動作テストを速く完了させることができ、動作テストの所要時間を短縮できる利点もある。
[第2の実施の形態]
次に、第2の実施の形態を説明する。
図3は、第2の実施の形態の情報処理システムの例を示す図である。
第2の実施の形態の情報処理システムは、分析装置100、サーバ装置200およびクライアント装置300,400を含む。分析装置100、サーバ装置200およびクライアント装置300,400は、ネットワーク50に接続されている。ネットワーク50は、例えば、LAN(Local Area Network)である。ネットワーク50は、WAN(Wide Area Network)やインターネットなどでもよい。
テスタ61,62は、クライアント装置300,400を用いて、サーバ装置200の動作テストを行うための操作入力を行うユーザである。テスタ61は、クライアント装置300を操作する。テスタ62は、クライアント装置400を操作する。動作テストは、複数のテストケースを含む。複数のテストケースは、テスタ61,62により分担される。
分析装置100は、サーバ装置200で実行されるアプリケーションの動作テストにおいて、アプリケーションの実行箇所と、クライアント装置300,400またはテスタ61,62との対応関係を分析するサーバコンピュータである。分析装置100は、第1の実施の形態の情報処理装置10の一例である。
サーバ装置200は、動作テスト対象のアプリケーションを実行するサーバコンピュータである。動作テスト対象のアプリケーションは、例えば、Webアプリケーションでもよい。例えば、サーバ装置200は、Webサーバとして機能し、Webアプリケーションによるサービスをクライアント装置300,400に提供する。サーバ装置200は、第1の実施の形態のテスト対象装置20の一例である。
クライアント装置300,400は、それぞれテスタ61,62により操作され、テストケースに応じた操作入力の内容を、サーバ装置200に送信するクライアントコンピュータである。クライアント装置300,400は、例えば、Webブラウザとして機能し、サーバ装置200により提供されるWebアプリケーションのGUI(Graphical User Interface)を表示する。テスタ61,62は、当該GUIを操作して、サーバ装置200に対するテストケースに応じた操作入力を行える。クライアント装置300,400は、第1の実施の形態の端末装置31,32,33の一例である。なお、情報処理システムにおけるクライアント装置の数は3以上でもよい。
図4は、アプリケーション利用時の通信例を示す図である。
例えば、テスタ61は、クライアント装置300のブラウザにより表示されるGUIの画面301を操作して、サーバ装置200により実行される動作テスト対象のアプリケーション201に対するアクセスを行える。同様に、テスタ62は、クライアント装置400のブラウザにより表示されるGUIの画面401を操作して、サーバ装置200により実行される動作テスト対象のアプリケーション201に対するアクセスを行える。
クライアント装置300,400とサーバ装置200との間の通信には、例えば、HTTP(HyperText Transfer Protocol)が用いられる。アプリケーション201は、クライアント装置300,400から受け付けるHTTPリクエストを処理し、要求元のクライアント装置300,400に処理結果を応答する。アプリケーション201のプログラムは、例えば、Java(登録商標)などのプログラミング言語を用いて作成される。
図5は、分析装置のハードウェア例を示す図である。
分析装置100は、CPU101、RAM102、HDD103、画像信号処理部104、入力信号処理部105、媒体リーダ106およびNIC(Network Interface Card)107を有する。分析装置100のこれらのハードウェアは、分析装置100のバスに接続される。なお、CPU101は、第1の実施の形態の処理部12に対応する。RAM102またはHDD103は、第1の実施の形態の記憶部11に対応する。
CPU101は、プログラムの命令を実行するプロセッサである。CPU101は、HDD103に記憶されたプログラムやデータの少なくとも一部をRAM102にロードし、プログラムを実行する。なお、CPU101は複数のプロセッサコアを含んでもよい。また、分析装置100は複数のプロセッサを有してもよい。以下で説明する処理は複数のプロセッサまたはプロセッサコアを用いて並列に実行されてもよい。また、複数のプロセッサの集合を「マルチプロセッサ」または単に「プロセッサ」と言うことがある。
RAM102は、CPU101が実行するプログラムやCPU101が演算に用いるデータを一時的に記憶する揮発性の半導体メモリである。なお、分析装置100は、RAM以外の種類のメモリを備えてもよく、複数個のメモリを備えてもよい。
HDD103は、OS(Operating System)やミドルウェアやアプリケーションソフトウェアなどのソフトウェアのプログラム、および、データを記憶する不揮発性の記憶装置である。なお、分析装置100は、フラッシュメモリやSSD(Solid State Drive)などの他の種類の記憶装置を備えてもよく、複数の不揮発性の記憶装置を備えてもよい。
画像信号処理部104は、CPU101からの命令に従って、分析装置100に接続されたディスプレイ111に画像を出力する。ディスプレイ111としては、CRT(Cathode Ray Tube)ディスプレイ、液晶ディスプレイ(LCD:Liquid Crystal Display)、プラズマディスプレイ、有機EL(OEL:Organic Electro-Luminescence)ディスプレイなど、任意の種類のディスプレイを用いることができる。
入力信号処理部105は、分析装置100に接続された入力デバイス112から入力信号を取得し、CPU101に出力する。入力デバイス112としては、マウス・タッチパネル・タッチパッド・トラックボールなどのポインティングデバイス、キーボード、リモートコントローラ、ボタンスイッチなどを用いることができる。また、分析装置100に、複数の種類の入力デバイスが接続されていてもよい。
媒体リーダ106は、記録媒体113に記録されたプログラムやデータを読み取る読み取り装置である。記録媒体113として、例えば、磁気ディスク、光ディスク、光磁気ディスク(MO:Magneto-Optical disk)、半導体メモリなどを使用できる。磁気ディスクには、フレキシブルディスク(FD:Flexible Disk)やHDDが含まれる。光ディスクには、CD(Compact Disc)やDVD(Digital Versatile Disc)が含まれる。
媒体リーダ106は、例えば、記録媒体113から読み取ったプログラムやデータを、RAM102やHDD103などの他の記録媒体にコピーする。読み取られたプログラムは、例えば、CPU101によって実行される。なお、記録媒体113は可搬型記録媒体であってもよく、プログラムやデータの配布に用いられることがある。また、記録媒体113やHDD103を、コンピュータ読み取り可能な記録媒体と言うことがある。
NIC107は、ネットワーク50に接続され、ネットワーク50を介して他のコンピュータと通信を行うインタフェースである。NIC107は、例えば、ネットワーク50に属するスイッチやルータなどの通信装置とケーブルで接続される。
図6は、分析装置の機能例を示す図である。
分析装置100は、記憶部120、モジュール特定部130、記録コード追加部140、書換後プログラム配備部150、実行時ログ受信部160およびテスタ判別部170を有する。記憶部120は、RAM102やHDD103の記憶領域により実現される。モジュール特定部130、記録コード追加部140、書換後プログラム配備部150、実行時ログ受信部160およびテスタ判別部170は、RAM102に記憶された所定のプログラムをCPU101により実行することで実現される。
記憶部120は、プログラム121、モジュール一覧テーブル122、判別材料記録箇所リスト123、書換後プログラム124、実行時ログ125、テスタ-UA対応リスト126、引当テーブル127およびテスタ情報付ログ128を記憶する。
プログラム121は、動作テスト対象のアプリケーションのオリジナルのプログラムのファイルである。
モジュール一覧テーブル122は、プログラム121に含まれるモジュールの名称(モジュール名)の一覧である。モジュール名は、本例では、メソッドの名称(メソッド名)に相当する。モジュール一覧テーブル122には、モジュールが属する処理のカテゴリ(モジュールカテゴリと称する)とモジュール名(メソッド名)との対応関係も登録される。
判別材料記録箇所リスト123は、モジュールカテゴリに対して記録すべき判別材料の情報を保持する。判別材料としては、スレッドIDやUA情報などが用いられる。スレッドIDは、動作テスト対象のアプリケーションにより、当該アプリケーションの一連の処理に対して、アクセス元の単位に付与される。UA情報は、UA偽装技術を用いて、当該アプリケーションへアクセスするためのリクエストに対して、クライアント装置により付与される。
書換後プログラム124は、プログラム121に対して、判別材料のログ出力用の命令文が追加されたプログラムのファイルである。
実行時ログ125は、書換後プログラム124がサーバ装置200により実行されて、複数のテストケースの操作入力に対する処理が行われた際に、動作テスト対象のアプリケーションにより生成されたログのファイルである。
テスタ-UA対応リスト126は、テスタの識別情報とUA情報との対応関係を示すリストである。
引当テーブル127は、実行時ログ125に記録されたレコードに対して、テスタの識別情報の引当に用いられるテーブルである。
テスタ情報付ログ128は、実行時ログ125のレコードに含まれる実行箇所(メソッド名)に対して、テスタの識別情報が付与されたログのファイルである。
記憶部120に格納されるデータのうち、プログラム121、モジュール一覧テーブル122、判別材料記録箇所リスト123およびテスタ-UA対応リスト126は、動作テストの開始前に、記憶部120に予め格納される。
モジュール特定部130は、モジュール一覧テーブル122を参照して、プログラム121に含まれるメソッド名をモジュールカテゴリに分類する。モジュールカテゴリは、モジュール(メソッドや関数など)による処理内容に対する分類であり、本例では、要求(リクエスト)を受け付ける「要求受信部」および要求受信部以外である「要求受信部外」がある。モジュール特定部130は、プログラム121のメソッド名の位置、および、当該メソッドの属するモジュールカテゴリを、記録コード追加部140に提供する。
記録コード追加部140は、判別材料記録箇所リスト123に基づいて、モジュール特定部130から取得したメソッド名の位置に対応する、プログラム121の所定の位置に、当該メソッドの属するモジュールカテゴリに応じた判別材料記録コードを追加する。所定の位置とは、例えば、当該メソッドの処理内容の記述が開始される位置の直前の位置である。これにより、記録コード追加部140は、プログラム121から書換後プログラム124を生成し、記憶部120に格納する。
書換後プログラム配備部150は、記憶部120に記憶された書換後プログラム124をサーバ装置200に配備する。すなわち、書換後プログラム配備部150は、サーバ装置200に書換後プログラム124を送信し、サーバ装置200により書換後プログラム124を実行開始させる。
実行時ログ受信部160は、複数のテストケースに対して、サーバ装置200により生成された実行時ログを、サーバ装置200から受信し、記憶部120に格納する。
テスタ判別部170は、記憶部120に記憶された実行時ログ125に基づいて、引当テーブル127を生成し、記憶部120に格納する。テスタ判別部170は、テスタ-UA対応リスト126および引当テーブル127に基づいて、実行時ログ125に記録されたメソッド名に対してテスタの識別情報を付与したテスタ情報付ログ128を生成し、記憶部120に格納する。
図7は、記憶部に予め格納されるデータの例を示す図である。
図7(A)は、モジュール一覧テーブル122の例を示す。
モジュール一覧テーブル122は、モジュールカテゴリおよびモジュール名パターンの項目を含む。モジュールカテゴリの項目には、モジュールカテゴリの名称が登録される。モジュール名パターンの項目には、モジュール名パターンが登録される。モジュール名パターンでは、ワイルドカード(アスタリスク記号「*」)を用いて、モジュール名が所定のパターンによって示される。
例えば、モジュール一覧テーブル122には、モジュールカテゴリが「前段・要求受信部」、モジュール名パターンが「*.doGet(),*.doPost()」というレコードが登録されている。このレコードは、モジュール名パターン「*.doGet()」または「*.doPost()」に合致するモジュールは、モジュールカテゴリ「前段・要求受信部」に属することを示す。なお、モジュール名パターン「*.doGet()」および「*.doPost()」の何れにも合致しないモジュールは、モジュールカテゴリ「前段・要求受信部」には属さないことになる。
図7(B)は、判別材料記録箇所リスト123の例を示す。
判別材料記録箇所リスト123は、モジュールカテゴリおよび判別材料の項目を含む。モジュールカテゴリの項目には、モジュールカテゴリの名称が登録される。判別材料の項目には、テスタの判別材料となる情報の名称が登録される。
例えば、判別材料記録箇所リスト123には、モジュールカテゴリが「前段・要求受信部」、判別材料が「ctxThreadId,rq.getUserAgent()」というレコードが登録されている。このレコードは、モジュールカテゴリ「前段・要求受信部」に属するモジュールの処理内容の記述が開始される位置の直前の位置に、「ctxThreadId」および「rq.getUserAgent()」の判別材料記録コードを追加することを示す。ここで、「ctxThreadId」は、動作テスト対象のアプリケーションにより付与されたスレッドIDを示す。「rq.getUserAgent」は、アクセス元のクライアント装置により付与されたUA情報を示す。
また、判別材料記録箇所リスト123には、モジュールカテゴリが「前段・要求受信部外」、判別材料が「ctxThreadId」というレコードが登録されている。このレコードは、モジュールカテゴリが「前段・要求受信部外」である(「前段・要求受信部」に属さない)モジュールの処理内容の記述が開始される位置の直前の位置に、「ctxThreadId」の判別材料記録コードを追加することを示す。ここで、モジュールカテゴリが「前段・要求受信部外」であるモジュールは、UA情報を取得できず、UA情報をログに記録できない。このため、モジュールカテゴリが「前段・要求受信部外」であるモジュールによる出力対象の判別情報は、スレッドIDとなる。
図7(C)は、テスタ-UA対応リスト126の例を示す。
テスタ-UA対応リスト126は、テスタ名および判別材料の項目を含む。テスタ名の項目には、テスタの識別情報(テスタ名)が登録される。判別材料の項目には、テスタ名に対応する判別材料の情報が登録される。テスタ-UA対応リスト126では、判別材料としてUA情報が登録される。
例えば、テスタ-UA対応リスト126には、テスタ名が「テスタA」、判別材料が「Testrack/A」というレコードが登録されている。このレコードは、テスタ名「テスタA」に、判別材料におけるUA情報「Testrack/A」が対応付けられることを示す。ここで、「テスタA」は、テスタ61のテスタ名であるとする。また、「Testrack/A」は、クライアント装置300により付与されるUA情報であるとする。
また、テスタ-UA対応リスト126には、テスタ名が「テスタB」、判別材料が「Testrack/B」というレコードが登録されている。このレコードは、テスタ名「テスタB」に、判別材料におけるUA情報「Testrack/B」が対応付けられていることを示す。ここで、「テスタB」は、テスタ62のテスタ名であるとする。また、「Testrack/B」は、クライアント装置400により付与されるUA情報であるとする。
テスタ-UA対応リスト126には、他のテスタについても、同様に、テスタ名と判別材料とを対応付けるレコードが予め登録される。
図8は、書換後プログラムの例を示す図である。
書換後プログラム124a,124b,124cは、プログラム121に対する書換後プログラム124の一例である。記録コード追加部140は、モジュール一覧テーブル122および判別材料記録箇所リスト123に基づいて、プログラム121から書換後プログラム124a,124b,124cを生成し得る。
書換後プログラム124aの例では、モジュール「doGet(…)」の処理内容の記述の直前に、「log.record(this.name,ctxThreadId,rq.getUserAgent());」という判別材料記録コードが追加されている。「this.name」は、該当のモジュール名(メソッド名)である。当該記録コードにより、スレッドIDおよびUA情報とともに、該当のモジュール名も実行時ログに記録される。
書換後プログラム124bの例では、モジュール「doPost(…)」の処理内容の記述の直前に、「log.record(this.name,ctxThreadId,rq.getUserAgent());」という判別材料記録コードが追加されている。
書換後プログラム124cの例では、モジュール「methodA()」の処理内容の記述の直前に、「log.record(this.name,ctxThreadId)」という判別材料記録コードが追加されている。ここで、モジュール一覧テーブル122によれば、モジュール「methodA()」は、モジュールカテゴリ「前段・要求受信部外」に該当する。したがって、判別材料記録箇所リスト123に基づき、モジュール「methodA()」については、モジュール名と、スレッドIDとを記録し、UA情報を記録しない判別材料記録コードとなる。
図9は、ログの変換例を示す図である。
実行時ログ125では、上の行から下の行へ向かう方向が時系列の正方向(下の行ほど新しい時刻)である。
例えば、実行時ログ125には、「テスタAがテストケース1開始」や「テスタAがテストケース2終了」などのテスタの操作情報を示す注釈行が含まれる。これらの注釈行は、例えば、サーバ装置200がクライアント装置から所定のメッセージを受信することで実行時ログ125に記録される。ただし、注釈行の出力時刻は、各モジュールの実際の実行時刻と必ずしも同期していない。このため、注釈行が記録されていたとしても、注釈行をアクセス元の判別に用いることができないことがある。また、当該注釈行は実行時ログ125に記録されないこともある。
実行時ログ125におけるテストケースに対応するレコードは、メソッド名(モジュール名)、スレッドID、UA情報を含む。ただし、モジュールによっては、UA情報を含まないこともある(UA情報なしは、「-」により表される)。実行時ログ125のレコードは、記録された時刻(タイムスタンプ)を含んでもよい。
例えば、実行時ログ125は、「doGet,thread1,Testrack/A」というレコードを含む。このレコードは、メソッド名「doGet」のメソッドの実行に対して、スレッドID「thread1」のスレッド、および、UA情報「Testrack/A」が対応することを示す。
また、例えば、実行時ログ125は、「methodB,thread1,-」というレコードを含む。このレコードは、メソッド名「methodB」のメソッドの実行に対して、スレッドID「thread1」のスレッドが対応すること、および、UA情報の記録がないことを示す。
実行時ログ125には、他のテストケースに応じて実行された他のメソッドと、他のスレッドIDと、他のUA情報との対応関係を示すレコードも同様に記録される。
テスタ判別部170は、実行時ログ125に基づいて、引当テーブル127を生成する。引当テーブル127は、スレッドIDおよびUA情報の項目を含む。スレッドIDの項目には、スレッドIDが登録される。UA情報の項目には、UA情報が登録される。
例えば、引当テーブル127には、スレッドIDが「thread1」、UA情報が「Testrack/A」というレコードが登録されている。このレコードは、スレッドID「thread1」がUA情報「Testrack/A」に対応することを示す。
また、引当テーブル127には、スレッドIDが「thread2」、UA情報が「Testrack/B」というレコードが登録されている。このレコードは、スレッドID「thread2」がUA情報「Testrack/B」に対応することを示す。
また、引当テーブル127には、スレッドIDが「thread3」、UA情報が「Testrack/A」というレコードが登録されている。このレコードは、スレッドID「thread3」がUA情報「Testrack/A」に対応することを示す。
テスタ判別部170は、テスタ-UA対応リスト126および引当テーブル127に基づいて、実行時ログ125からテスタ情報付ログ128を生成する。例えば、テスタ判別部170は、テスタ-UA対応リスト126の判別情報と引当テーブル127のUA情報とをキーに、テスタ-UA対応リスト126と引当テーブル127とを結合することで、スレッドIDに対するテスタ名を取得する。
そして、テスタ判別部170は、実行時ログ125におけるスレッドIDおよびUA情報の記述を、取得したテスタ名に置換する。また、テスタ判別部170は、モジュール一覧テーブル122に基づいて、実行時ログ125のモジュール名の記述を、モジュールカテゴリ名(あるいは、モジュールカテゴリ名の一部)に置換する。これにより、実行時ログ125からテスタ情報付ログ128が生成される。
このように、テスタ判別部170は、スレッドIDやUA情報といった判別情報からテスタ-UA対応リスト126により特定される、クライアント装置を操作するテスタまたはクライアント装置を示すテスタ名(テスタ識別情報)を、メソッド名などの処理の情報と判別情報とに対応付けて記憶部120に記録することもできる。これにより、例えば、分析装置100は、テストケースの評価などを行う際に、当該記録の内容を参照することで、各処理の情報(メソッド名など)に対して、テスタ名を容易に特定可能になる。
次に、分析装置100による処理手順を説明する。
図10は、分析装置の処理例を示すフローチャートである。
(S1)モジュール特定部130は、モジュール一覧テーブル122を参照して、プログラム121におけるモジュール特定処理を実行する。モジュール特定処理の詳細は後述される。
(S2)記録コード追加部140は、モジュール特定処理の結果に基づいて、プログラム121に対するプログラム書換処理を実行し、書換後プログラム124を生成する。プログラム書換処理の詳細は後述される。
(S3)書換後プログラム配備部150は、書換後プログラム124をサーバ装置200に配備する。すなわち、書換後プログラム配備部150は、書換後プログラム124をサーバ装置200に送信し、サーバ装置200により書換後プログラム124を実行開始させる。そして、サーバ装置200に対して、各テストケースに応じた操作入力が並列に入力され、サーバ装置200により、実行時ログ125が生成される。
(S4)実行時ログ受信部160は、サーバ装置200から実行時ログ125を受信し、記憶部120に格納する。
(S5)テスタ判別部170は、実行時ログ125に基づいて、テスタ判別処理を実行する。テスタ判別処理の詳細は後述される。
(S6)テスタ判別部170は、テスタ判別処理の結果として生成されるテスタ情報付ログ128を出力する。例えば、テスタ判別部170は、テスタ情報付ログ128を記憶部120に格納する。また、テスタ判別部170は、ディスプレイ111により、テスタ情報付ログ128を表示してもよいし、クライアント装置300,400にテスタ情報付ログ128を送信してもよい。そして、分析装置100による処理が終了する。
図11は、モジュール特定処理の例を示すフローチャートである。
モジュール特定処理は、ステップS1に相当する。
(S10)モジュール特定部130は、モジュール一覧テーブル122とプログラム121とを取得する。
(S11)モジュール特定部130は、プログラム121の各行についてステップS12,S13を繰り返し実行する。なお、プログラム121が複数のファイルに分割されている場合、ファイル毎に、ステップS12,S13を繰り返し実行する。
(S12)モジュール特定部130は、該当の行から、メソッド名(モジュール名)を完全修飾名で抽出する。
(S13)モジュール特定部130は、モジュール一覧テーブル122を参照して、(1)(前段・)要求受信部、および、(2)(前段・)要求受信部外に、該当のメソッドを分類する。
(S14)モジュール特定部130は、プログラム121に含まれる全ての行を処理すると、繰り返しを終了し、ステップS15に進む。
(S15)モジュール特定部130は、抽出した各メソッドについて、ステップS16を繰り返し実行する。
(S16)モジュール特定部130は、判別材料記録箇所リスト123に基づき、メソッドの位置情報と判別材料記録箇所とを対応付けて記録する。すなわち、モジュール特定部130は、抽出したメソッドの、プログラム121における位置を示す情報に対して、判別材料記録箇所リスト123における該当のレコードを対応付けた対応表を生成する。
(S17)モジュール特定部130は、抽出された全てのメソッドを処理すると、繰り返しを終了し、ステップS18に進む。
(S18)モジュール特定部130は、ステップS16で生成したメソッドの位置情報と判別材料記録箇所との対応表を出力する(例えば、記憶部120に対応表を格納する)。そして、モジュール特定処理が終了する。
図12は、プログラム書換処理の例を示すフローチャートである。
プログラム書換処理は、ステップS2に相当する。
(S20)記録コード追加部140は、プログラム121と、前段処理(モジュール特定処理)で出力された対応表とを取得する。
(S21)記録コード追加部140は、プログラム121(あるいは対応表)の各メソッドについて、ステップS22を繰り返し実行する。
(S22)記録コード追加部140は、プログラム121において、ステップS20で取得した対応表に記録されたメソッドの位置に、対応する判別材料を出力する判別材料記録コードを追加する。判別材料として、対応表に記録されたメソッドのモジュールカテゴリに対して、判別材料記録箇所リスト123に登録された判別材料が用いられる。
(S23)記録コード追加部140は、全てのメソッドを処理すると、繰り返しを終了し、ステップS24に進む。
(S24)記録コード追加部140は、プログラム121に対して判別材料記録コードを追加した書換後プログラム124を出力する。そして、プログラム書換処理が終了する。
図13は、テスタ判別処理の例を示すフローチャートである。
テスタ判別処理は、ステップS5に相当する。
(S30)テスタ判別部170は、実行時ログ125およびテスタ-UA対応リスト126を取得する。
(S31)テスタ判別部170は、実行時ログ125の各行(各レコード)について、ステップS32~S34を繰り返し実行する(判定に応じて実行されないステップもある)。
(S32)テスタ判別部170は、該当の行がテスタの操作情報であるか否かを判定する。該当の行がテスタの操作情報である場合、ステップS31に処理が進む(次の行に移る)。該当の行がテスタの操作情報でない場合、ステップS33に処理が進む。前述のように、操作情報の行は、注釈行に相当する。
(S33)テスタ判別部170は、該当の行に含まれるメソッドのモジュールカテゴリが、(前段・)要求受信部であるか否かを判定する。モジュールカテゴリが、(前段・)要求受信部である場合、ステップS34に処理が進む。モジュールカテゴリが、(前段・)要求受信部でない場合、ステップS35に処理が進む。なお、該当の行に含まれるメソッドのモジュールカテゴリが、(前段・)要求受信部であるか否かは、例えば、当該メソッド名がモジュール一覧テーブルの前段・要求受信部のモジュール名パターンを満たすか否かによって判定される。
(S34)テスタ判別部170は、該当の行に含まれるUA情報とスレッドIDの対を、引当テーブル127に記録する。
(S35)テスタ判別部170は、実行時ログ125の全ての行を処理すると、繰り返しを終了し、ステップS36に進む。
(S36)テスタ判別部170は、引当テーブル127およびテスタ-UA対応リスト126を用いて、スレッドIDをテスタ名に変換する。そして、テスタ判別処理が終了する。
こうして、テスタ判別部170は、テスタ名の情報を含むテスタ情報付ログ128を出力する。
これにより、アプリケーションのアクセス元を適切に特定できる。例えば、図9のテスタ情報付ログ128の例でいえば、2,3,7,9,10行目の各実行箇所に対して、実行原因となったテスタ61(テスタ名「テスタA」)が適切に特定される。何れの実行箇所が何れのテストケースに属するかは、例えば、クライアント装置300におけるテストケースの使用順序を基に特定される。分析装置100が、何れの実行箇所が何れのテストケースに属するかの特定を行ってもよい。
また、例えば、テスタ情報付ログ128の5行目の実行箇所「doGet」に対して、実行原因となったテスタ62(テスタ名「テスタB」)が適切に特定される。
こうして、複数のテスタにより、複数のクライアント装置を用いて複数のテストケースに対する操作入力が同時並列的に行われる場合でも、アプリケーションの実行箇所に対して、当該実行箇所の実行原因となったアクセス元を適切に特定できる。その結果、当該実行箇所に対応するテストケースを適切に特定可能になる。このため、例えば、次回以降に行われる動作テストについて、実行箇所が重複するテストケースを集約したり、実行箇所に応じてテストケースを評価し、実行するテストケースを絞り込んだりして、動作テストの効率化を図れる。
更に、複数のテストケースに対する操作入力を並列に行えるようになることで、動作テストを速く完了させることができ、動作テストの所要時間を短縮できる利点もある。
[第3の実施の形態]
次に第3の実施の形態を説明する。前述の第2の実施の形態と相違する事項を主に説明し、共通する事項の説明を省略する。
サーバ装置200において、アプリケーションが多段に構成されることがある。アプリケーションが多段になっている場合、後段のアプリケーションからはUA情報も呼出元のスレッド情報も参照できない(前段と後段とで独立にスレッドIDが付与される)。このため、前段のアプリケーションの実行箇所に対する後段のアプリケーションの実行箇所を辿れず、一連の実行箇所の実行原因となったアクセス元を特定することが困難になる。
そこで、第3の実施の形態では、アプリケーションが多段に構成されている場合にも、アクセス元を適切に特定可能にする機能を提供する。
なお、第3の実施の形態の情報処理システムの構成および各装置のハードウェア例は、図3および図5で例示した第2の実施の形態の情報処理システムの構成およびハードウェア例と同様である。
図14は、第3の実施の形態のアプリケーション利用時の通信例を示す図である。
例えば、サーバ装置200は、画面IF(InterFace)処理アプリ202および業務処理アプリ203を有する。
画面IF処理アプリ202は、例えば、クライアント装置300の画面301における操作入力やクライアント装置400の画面401における操作入力に応じたリクエストを受け付ける前段アプリケーションである。画面IF処理アプリ202は、例えば、Java Servletにより実現される。画面IF処理アプリ202は、クライアント装置300,400からのリクエストに応じて業務処理アプリ203に業務処理のリクエストを発行する。画面IF処理アプリ202は、業務処理アプリ203による処理結果を受け付け、要求元のクライアント装置に、処理結果を応答する。
業務処理アプリ203は、クライアント装置300,400からの要求に対して、画面IF処理アプリ202で発行された要求を処理し、画面IF処理アプリ202に処理結果を応答する後段アプリケーションである。業務処理アプリ203は、例えば、Javaなどで記述されたプログラム(例えば、Java Servletなど)により実現される。前述のように、後段アプリケーションである業務処理アプリ203は、UA情報を取得できない。
画面IF処理アプリ202および業務処理アプリ203の間の通信には、例えば、CORBA(Common Object Request Broker Architecture)/IIOP(Internet Inter-ORB Protocol)などのプロトコルが用いられる。ただし、他の通信プロトコルが用いられてもよい。
第3の実施の形態では、分析装置100に代えて、分析装置500を有する。次に、分析装置500の機能例を説明する。
図15は、分析装置の機能例を示す図である。
分析装置500は、記憶部520、モジュール特定部530、記録コード追加部540および書換後プログラム配備部550を有する。記憶部520は、分析装置500が有するRAMやHDDなどの記憶領域により実現される。モジュール特定部530、記録コード追加部540および書換後プログラム配備部550は、分析装置500のRAMに記憶された所定のプログラムを分析装置500のCPUにより実行することで実現される。
記憶部520は、前段プログラム521a、後段プログラム521b、モジュール一覧テーブル522、連携ID記録箇所リスト523、判別材料記録箇所リスト524、書換後前段プログラム525aおよび書換後後段プログラム525bを記憶する。
前段プログラム521aは、動作テスト対象の前段アプリケーションのオリジナルのプログラムのファイルである。後段プログラム521bは、動作テスト対象の後段アプリケーションのオリジナルのプログラムのファイルである。
モジュール一覧テーブル522は、プログラム121に含まれるモジュールの名称(モジュール名)の一覧である。
連携ID記録箇所リスト523は、所定の連携識別情報(連携IDと言う)の記録を行う記録コードを追加すべき各プログラム中の位置を、前段アプリケーションおよび後段アプリケーション毎に示す。連携IDは、前段アプリケーションと後段アプリケーションとの間の連携を識別するための情報である。前段アプリケーションと後段アプリケーションとで連携IDに対応する変数名は異なる可能性があるが、該当の変数に対して、共通の値が設定される。連携IDは、クライアント装置から前段アプリケーションへの要求が発生したことに応じて前段アプリケーションにより当該要求に対して付与され、前段アプリケーションから連携先の後段アプリケーションに通知される。前段アプリケーションから後段アプリケーションへの要求とともに連携IDが後段アプリケーションに通知され得る。
例えば、連携IDとしては、前段アプリケーション(例えば、Webアプリケーション)がリクエスト元に対して付与するセッションIDを用いることができる。セッションIDは、前段アプリケーションから後段アプリケーションに対するリクエストを介して後段アプリケーションにも引き渡される。セッションIDは、例えば、障害追跡などのために用いられることがある。
ただし、セッションIDは、付与されないことがある。例えば、静的ページアクセスやログイン前のアクセスではセッションIDは付与されない。また、アプリケーションによって、セッション情報の付与方法が異なるため、セッションIDのみから、直接、テスタまたはクライアント装置を特定するのは難しいこともある。
判別材料記録箇所リスト524は、モジュールカテゴリに対して記録すべき判別材料の情報を保持する。判別材料としては、スレッドIDやUA情報などが用いられる。
書換後前段プログラム525aは、前段プログラム521aに対して、連携IDおよび判別材料のログ出力用の命令文が追加されたプログラムのファイルである。連携IDの出力用の命令文は、連携ID記録コードと呼ばれる。判別材料の出力用の命令文は、判別材料記録コードと呼ばれる。
書換後後段プログラム525bは、後段プログラム521bに対して、連携IDおよび判別材料のログ出力用の命令文が追加されたプログラムのファイルである。
前段プログラム521a、後段プログラム521b、モジュール一覧テーブル522、連携ID記録箇所リスト523、判別材料記録箇所リスト524は、動作テストの開始前に、記憶部520に予め格納される。
モジュール特定部530は、モジュール一覧テーブル522を参照して、前段プログラム521aおよび後段プログラム521bに含まれるメソッド名をモジュールカテゴリに分類する。また、モジュール特定部530は、連携ID記録箇所リスト523を参照して、連携IDを記録するための命令文を追加すべきメソッドを特定する。モジュール特定部530は、前段プログラム521aおよび後段プログラム521bのそれぞれに含まれるメソッド名の位置、および、当該メソッドの属するモジュールカテゴリを、記録コード追加部540に提供する。
記録コード追加部540は、連携ID記録箇所リスト523に基づき、モジュール特定部530から取得したメソッド名の位置に対応する、前段プログラム521aの所定の位置に、当該メソッドの属するモジュールカテゴリに応じた連携ID記録コードを追加する。所定の位置は、連携ID記録箇所リスト523により指定される。記録コード追加部540は、後段プログラム521bに対しても同様に、連携ID記録コードを追加する。
記録コード追加部540は、判別材料記録箇所リスト524に基づき、モジュール特定部530から取得したメソッド名の位置に対応する、前段プログラム521aの所定の位置に、当該メソッドの属するモジュールカテゴリに応じた判別材料記録コードを追加する。所定の位置とは、例えば、当該メソッドの処理内容の記述が開始される位置の直前の位置である。記録コード追加部540は、後段プログラム521bに対しても同様に、判別材料記録コードを追加する。
こうして、記録コード追加部540は、前段プログラム521aから書換後前段プログラム525aを生成し、記憶部520に格納する。また、記録コード追加部540は、後段プログラム521bから書換後後段プログラム525bを生成し、記憶部520に格納する。
書換後プログラム配備部550は、記憶部520に記憶された書換後前段プログラム525aおよび書換後後段プログラム525bをサーバ装置200に配備する。すなわち、書換後プログラム配備部550は、書換後前段プログラム525aおよび書換後後段プログラム525bをサーバ装置200に送信し、書換後前段プログラム525aおよび書換後後段プログラム525bをサーバ装置200により実行開始させる。
図16は、分析装置の機能例(続き)を示す図である。
分析装置500は、図15で例示した機能に加えて、実行時ログ受信部560およびテスタ判別部570を有する。実行時ログ受信部560およびテスタ判別部570は、分析装置500のRAMに記憶された所定のプログラムを分析装置500のCPUにより実行することで実現される。
記憶部520は、更に、前段実行時ログ526a、後段実行時ログ526b、テスタ-UA対応リスト527、引当テーブル528およびテスタ情報付ログ529を記憶する。
前段実行時ログ526aは、書換後前段プログラム525aがサーバ装置200により実行されて、複数のテストケースの操作入力に対応する処理が行われた際に、前段アプリケーションにより生成されたログのファイルである。
後段実行時ログ526bは、書換後後段プログラム525bがサーバ装置200により実行されて、複数のテストケースの操作入力に対応する処理が行われた際に、後段アプリケーションにより生成されたログのファイルである。
テスタ-UA対応リスト527は、テスタの識別情報とUA情報との対応関係を示すリストである。
引当テーブル528は、前段実行時ログ526aおよび後段実行時ログ526bに記録されたレコードに対して、テスタの識別情報の引当に用いられるテーブルである。
テスタ情報付ログ529は、前段実行時ログ526aおよび後段実行時ログ526bのレコードに含まれる実行箇所(メソッド名)に対して、テスタの識別情報が付与されたログのファイルである。
テスタ-UA対応リスト527は、動作テストの開始前に、記憶部120に予め格納される。
実行時ログ受信部560は、複数のテストケースに対して、サーバ装置200により生成された前段実行時ログ526aおよび後段実行時ログ526bを、サーバ装置200から受信し、記憶部520に格納する。
テスタ判別部570は、記憶部520に記憶された前段実行時ログ526aおよび後段実行時ログ526bに基づいて、引当テーブル528を生成し、記憶部520に格納する。テスタ判別部570は、テスタ-UA対応リスト527および引当テーブル528に基づいて、前段実行時ログ526aおよび後段実行時ログ526bに記録されたメソッド名に対してテスタの識別情報を付与したテスタ情報付ログ529を生成する。テスタ判別部570は、生成したテスタ情報付ログ529を記憶部520に格納する。
図17は、記憶部に予め格納されるデータの例を示す図である。
図17(A)は、モジュール一覧テーブル522の例を示す。
モジュール一覧テーブル522は、モジュール一覧テーブル122と同様のデータ構造を有する。モジュール一覧テーブル522は、前段プログラム521aおよび後段プログラム521bのそれぞれに含まれるモジュール名のパターンと、当該モジュール名のパターンが属するモジュールカテゴリとの対応関係を保持する。モジュールカテゴリは、前段プログラム521aおよび後段プログラム521bの区別を含む。
例えば、モジュール一覧テーブル522には、モジュールカテゴリが「前段・要求受信部」、モジュール名パターンが「*.doGet(),*.doPost()」というレコードが登録されている。このレコードは、モジュール名パターン「*.doGet()」または「*.doPost()」に合致するモジュールは、モジュールカテゴリ「前段・要求受信部」に属することを示す。なお、モジュール名パターン「*.doGet()」および「*.doPost()」の何れにも合致しない前段プログラム521aのモジュールは、前段プログラム521aには属するが、モジュールカテゴリ「前段・要求受信部」には属さないことになる。
また、モジュール一覧テーブル522には、モジュールカテゴリが「後段・要求受信部」、モジュール名パターンが「com.fj.Receiver.receive()」というレコードが登録されている。このレコードは、モジュール名パターン「com.fj.Receiver.receive()」に合致するモジュールは、モジュールカテゴリ「後段・要求受信部」に属することを示す。なお、モジュール名パターン「com.fj.Receiver.receive()」に合致しない後段プログラム521bのモジュールは、後段プログラム521bには属するが、モジュールカテゴリ「後段・要求受信部」には属さないことになる。
図17(B)は、連携ID記録箇所リスト523の例を示す。
連携ID記録箇所リスト523は、段、記録箇所および記録名の項目を含む。段の項目には、前段(前段プログラム521a)または後段(後段プログラム521b)の区分が登録される。記録箇所の項目には、連携IDを記録する連携ID記録コードを追加する位置を示す情報が登録される。記録名の項目には、連携IDが代入される変数名が登録される。
例えば、連携ID記録箇所リスト523には、段が「前段」、記録箇所が「com.fj.FjSession.assign()の直後」、記録名が「sessionId」というレコードが登録されている。このレコードは、前段プログラム521aにおけるモジュール「com.fj.FjSession.assign()」の処理内容の記述の直後の位置に、変数名「sessionId」の値を記録対象に指定した連携ID記録コードを追加することを示す。
また、連携ID記録箇所リスト523には、段が「後段」、記録箇所が「com.fj.Receiver.receive()の直前」、記録名が「requestId」というレコードが登録されている。このレコードは、後段プログラム521bにおけるモジュール「com.fj.Receiver.receive()」の処理内容の記述の直前の位置に、変数名「requestId」の値を記録対象に指定した連携ID記録コードを追加することを示す。
図17(C)は、判別材料記録箇所リスト524の例を示す。
判別材料記録箇所リスト524は、判別材料記録箇所リスト123と同様のデータ構造を有する。例えば、判別材料記録箇所リスト524には、モジュールカテゴリが「前段・要求受信部」、判別材料が「ctxThreadId,rq.getUserAgent()」というレコードが登録されている。このレコードは、モジュールカテゴリ「前段・要求受信部」に属するモジュールの処理内容の記述開始位置の直前の位置に、「ctxThreadId」および「rq.getUserAgent()」の判別材料記録コードを追加することを示す。ここで、「ctxThreadId」は、前段アプリケーションにより付与されたスレッドIDを示す。後段アプリケーションでも、スレッドIDは「ctxThreadId」により示される。「rq.getUserAgent」は、アクセス元のクライアント装置により付与されたUA情報を示す。
また、判別材料記録箇所リスト524には、モジュールカテゴリが、「前段・要求受信部外」、判別材料が「ctxThreadId」というレコードが登録されている。このレコードは、前段プログラム521aのうち、モジュールカテゴリが「前段・要求受信部外」である(「前段・要求受信部」に属さない)モジュールの処理内容の記述開始位置の直前に「ctxThreadId」の判別材料記録コードを追加することを示す。ここで、前段プログラム521aのうち、モジュールカテゴリが「前段・要求受信部外」であるモジュールは、UA情報を取得できず、UA情報をログに記録できない。このため、モジュールカテゴリが「前段・要求受信部外」であるモジュールによる出力対象の判別情報は、スレッドIDとなる。
また、判別材料記録箇所リスト524には、モジュールカテゴリが「後段・要求受信部」、判別材料が「ctxThreadId」というレコードが登録されている。このレコードは、後段プログラム521bのうち、モジュールカテゴリ「後段・要求受信部」に属するモジュールの処理内容の記述開始位置の直前に、「ctxThreadId」の判別材料記録コードを追加することを示す。
また、判別材料記録箇所リスト524には、モジュールカテゴリが「後段・要求受信部外」、判別材料が「ctxThreadId」というレコードが登録されている。このレコードは、後段プログラム521bのうち、モジュールカテゴリが「後段・要求受信部外」である(「後段・要求受信部」に属さない)モジュールの処理内容の記述開始位置の直前に「ctxThreadId」の判別材料記録コードを追加することを示す。
図17(D)は、テスタ-UA対応リスト527の例を示す。
テスタ-UA対応リスト527は、テスタ-UA対応リスト126と同様のデータ構造を有する。テスタ-UA対応リスト527が保持する情報は、テスタ-UA対応リスト126と同様であるため、説明を省略する。
図18は、書換後前段プログラムの例を示す図である。
書換後前段プログラム525a1,525a2,525a3は、書換後前段プログラム525aの一例である。記録コード追加部540は、モジュール一覧テーブル522、連携ID記録箇所リスト523および判別材料記録箇所リスト524に基づいて、前段プログラム521aから書換後前段プログラム525a1,525a2,525a3を生成し得る。
書換後前段プログラム525a1の例では、モジュール「doGet(…)」の処理内容の記述の直前に、「log.record(this.name,ctxThreadId,rq.getUserAgent());」という判別材料記録コードが追加されている。
書換後前段プログラム525a2の例では、モジュール「com.fj.FjSession.assign()」の処理内容の記述の直前に、「log.record(this.name,ctxThreadId);」という判別材料記録コードが追加されている。
また、書換後前段プログラム525a2の例では、モジュール「com.fj.FjSession.assign()」の処理内容の記述の直後に、「log.relate(ctxThreadId,sessionId);」という連携ID記録コードが追加されている。ここで、コマンド「log.relate(ctxThreadId,sessionId)」は、直前のコマンド「log.record()」で記録されたスレッドID(「ctxThreadId」)に関連付けて、連携ID(「sessionId」)を記録するコマンドである。
書換後前段プログラム525a3の例では、モジュール「methodA()」の処理内容の記述の直前に、「log.record(this.name,ctxThreadId)」という判別材料記録コードが追加されている。
図19は、書換後後段プログラムの例を示す図である。
書換後後段プログラム525b1,525b2は、書換後後段プログラム525bの一例である。記録コード追加部540は、モジュール一覧テーブル522、連携ID記録箇所リスト523および判別材料記録箇所リスト524に基づいて、後段プログラム521bから書換後後段プログラム525b1,525b2を生成し得る。
書換後後段プログラム525b1の例では、モジュール「com.fj.Receiver.receive(…)」の処理内容の記述の直前に、「log.record(this.name,ctxThreadId);」という判別材料記録コードが追加されている。
また、書換後後段プログラム525b1の例では、モジュール「com.fj.Receiver.receive(…)」の処理内容の記述の直前に、「log.relate(ctxThreadId,requestId)」という連携ID記録コードが追加されている。
書換後後段プログラム525b2の例では、モジュール「methodA()」の処理内容の記述の直前に、「log.record(this.name,ctxThreadId)」という判別材料記録コードが追加されている。
図20は、実行時ログの例を示す図である。
図20(A)は、前段実行時ログ526aの例を示す。図20(B)は、後段実行時ログ526bの例を示す。前段実行時ログ526aおよび後段実行時ログ526bでは、連携ID記録コードに基づいて連携IDが記録される点が、前述の実行時ログ125と異なる。前段実行時ログ526aおよび後段実行時ログ526bでは、上の行から下の行へ向かう方向が時系列の正方向(下の行ほど新しい時刻)である。前段実行時ログ526aおよび後段実行時ログ526bの各レコードは、記録された時刻(タイムスタンプ)を含むが、図示を省略している。
例えば、前段実行時ログ526aの3行目には、書換後前段プログラム525a2に追加された連携ID記録コードに基づいて、メソッド名「assign」、スレッドID「thread1」に対し、連携ID「sessionAAAAAA」が記録されている。
また、前段実行時ログ526aの7行目には、書換後前段プログラム525a2に追加された連携ID記録コードに基づいて、メソッド名「assign」、スレッドID「thread2」に対し、連携ID「sessionBBBBBB」が記録されている。
更に、前段実行時ログ526aの10行目には、書換後前段プログラム525a2に追加された連携ID記録コードに基づいて、メソッド名「assign」、スレッドID「thread3」に対し、連携ID「sessionAAAAAA」が記録されている。
例えば、後段実行時ログ526bの3行目には、書換後後段プログラム525b1に追加された連携ID記録コードに基づいて、メソッド名「receive」、スレッドID「thread3」に対し、連携ID「sessionAAAAAA」が記録されている。
また、後段実行時ログ526bの5行目には、書換後後段プログラム525b1に追加された連携ID記録コードに基づいて、メソッド名「receive」、スレッドID「thread4」に対し、連携ID「sessionBBBBBB」が記録されている。
更に、後段実行時ログ526bの9行目には、書換後後段プログラム525b1に追加された連携ID記録コードに基づいて、メソッド名「receive」、スレッドID「thread5」に対し、連携ID「sessionAAAAAA」が記録されている。
図21は、引当テーブルの例を示す図である。
引当テーブル528は、前段実行時ログ526aおよび後段実行時ログ526bに基づいて、テスタ判別部570により生成され、記憶部520に格納される。引当テーブル528は、連携ID、前段スレッドID、後段スレッドIDおよびUA情報の項目を含む。
連携IDの項目には、連携IDが登録される。前段スレッドIDの項目には、前段アプリケーションにより記録されたスレッドID(前段スレッドIDと言う)が登録される。後段スレッドIDの項目には、後段アプリケーションにより記録されたスレッドID(後段スレッドIDと言う)が登録される。UA情報の項目には、UA情報が登録される。
例えば、引当テーブル528には、連携IDが「sessionAAAAAA」、前段スレッドIDが「thread1」、後段スレッドIDが設定なし「-」、UA情報が「Testrack/A」というレコードが登録されている。このレコードは、連携ID「sessionAAAAAA」、スレッドID「thread1」が、UA情報「Testrack/A」に対応することを示す。
また、引当テーブル528には、連携IDが「sessionAAAAAA」、前段スレッドIDが設定なし「-」、後段スレッドIDが「thread3」、UA情報が「Testrack/A」というレコードが登録されている。このレコードは、連携ID「sessionAAAAAA」、スレッドID「thread1」が、UA情報「Testrack/A」に対応することを示す。
引当テーブル528には、連携IDと前段スレッドIDとの他の組合せ、および、連携IDと後段スレッドIDとの他の組合せに対しても、それぞれUA情報が対応付けられる。
分析装置500によるアクセス元の特定方法をまとめると次のようになる。すなわち、分析装置500は、障害追跡などのためプログラム間で連携される情報(連携ID)を利用し、前段と後段のスレッドIDを紐付ける。分析装置500は、後段側のインタフェースの連携記録位置情報を記録する。連携ID、スレッドIDおよびUA情報はそれぞれ異なるモジュールで参照されるため、モジュール毎に判別材料を代え、前述の引当テーブル528を用いて操作を行ったテスタを特定する。
(1)前段・要求受信部(IF(InterFace))では、引当テーブル528の参照順序は、UA情報、テスタ情報(テスタ名)の順となる。テスタ名は、テスタ-UA対応リスト527より特定される。
(2)前段・要求受信部以外では、引当テーブル528の参照順序は、前段スレッドID、UA情報、テスタ情報の順となる。
(3)後段・要求受信部(IF)では、引当テーブル528の参照順序は、連携ID、前段スレッドID、UA情報、テスタ情報の順となる。
(4)後段・要求受信部以外では、引当テーブル528の参照順序は、後段スレッドID、連携ID、前段スレッドID、UA情報、テスタ情報の順となる。
図22は、テスタ情報付ログの例を示す図である。
テスタ判別部570は、テスタ-UA対応リスト527および引当テーブル528に基づいて、前段実行時ログ526aおよび後段実行時ログ526bからテスタ情報付ログ529を生成し、記憶部520に格納する。
例えば、テスタ判別部570は、テスタ-UA対応リスト527の判別情報と引当テーブル528のUA情報とをキーに、テスタ-UA対応リスト527と引当テーブル528とを結合する。テスタ判別部570は、当該結合により、前段スレッドIDおよび後段スレッドIDのそれぞれに対するテスタ名を取得する。
そして、テスタ判別部570は、前段実行時ログ526aおよび後段実行時ログ526bにおけるスレッドIDおよびUA情報の記述やスレッドIDおよび連携IDの記述を、取得したテスタ名に置換する。また、テスタ判別部570は、モジュール一覧テーブル522に基づいて、前段実行時ログ526aおよび後段実行時ログ526bのモジュール名の記述を、モジュールカテゴリ名(あるいは、モジュールカテゴリ名の一部)に置換する。そして、テスタ判別部570は、前段実行時ログ526aおよび後段実行時ログ526bの各レコードをタイムスタンプによる時系列の順にマージ(統合)する。
これにより、前段実行時ログ526aおよび後段実行時ログ526bからテスタ情報付ログ529が生成される。
このように、テスタ判別部570は、前段アプリケーションにおけるスレッドIDやUA情報である第1の判別情報から特定される、クライアント装置を操作するテスタまたはクライアント装置を示すテスタ名(テスタ識別情報)を、前段アプリケーションにおけるメソッド名などの処理の情報、第1の判別情報および連携IDに対応付けて記憶部520に記録する。更に、テスタ判別部570は、当該連携IDに対応するテスタ名を、後段アプリケーションのメソッド名などの他の処理の情報および後段アプリケーションにおけるスレッドIDである第2の判別情報に対応付けて記憶部520に記録する。こうして、後段側でUA情報を取得できなくても、連携IDおよびスレッドIDにより、他の処理の情報に対してアクセス元を示すテスタ名を適切に紐付けることができる。
次に、分析装置500による処理手順を説明する。
ここで、分析装置500は、図10で例示した分析装置100と同様の手順を実行する。そこで、図10の各ステップと処理内容の異なるステップに着目して説明し、処理内容の共通するステップの説明を省略する。まず、図10におけるステップS1のモジュール特定処理に相当する手順を説明する。
図23は、モジュール特定処理の例を示すフローチャートである。
下記のステップS13aは、図11のステップS13に代えて実行される。ステップS16a,16bは、ステップS16とステップS17との間に実行される。ステップS18aは、図11のステップS18に代えて実行される。
(S13a)モジュール特定部530は、モジュール一覧テーブル522を参照して、(1)前段・要求受信部、(2)前段・要求受信部外、(3)後段・要求受信部、および、(4)後段・要求受信部外に、ステップS12で抽出したメソッドを分類する。そして、ステップS14に処理が進む。
(S16a)モジュール特定部530は、処理対象のメソッドについて、連携ID記録箇所リスト523の段および記録箇所を参照して、連携ID記録箇所リスト523に該当のメソッドがあるか否かを判定する。連携ID記録箇所リスト523に該当のメソッドがある場合、ステップS16bに処理が進む。連携ID記録箇所リスト523に該当のメソッドがない場合、ステップS17に処理が進む。
(S16b)モジュール特定部530は、メソッドの位置情報と連携ID記録箇所とを対応付けて記録する。すなわち、モジュール特定部530は、抽出したメソッドの、前段プログラム521aまたは後段プログラム521bにおける位置を示す情報に対して、連携ID記録箇所リスト523における該当のレコードを対応付けた対応表を生成する。そして、ステップS17に処理が進む。
(S18a)モジュール特定部530は、ステップS16a~S16bで生成したメソッドの位置情報と判別材料記録箇所との対応表およびメソッドの位置情報と連携ID記録箇所との対応表を出力する(例えば、記憶部520に対応表を格納する)。そして、モジュール特定処理が終了する。
次に、図10におけるステップS2のプログラム書換処理に相当する手順を説明する。
図24は、プログラム書換処理の例を示すフローチャートである。
下記のステップS22aは、図12のステップS22とステップS23との間に実行される。
(S22a)記録コード追加部540は、前段プログラム521aまたは後段プログラム521bにおいて、ステップS20で取得した対応表に記録されたメソッドに対応する位置に、連携IDを出力する連携ID記録コードを追加する。出力対象の連携IDとして、対応表に記録されたメソッド名(モジュール名)に対して、連携ID記録箇所リスト523に登録された連携IDの記録名が用いられる。また、連携ID記録コードの追加位置は、連携ID記録箇所リスト523における記録箇所で指定された位置となる。そして、ステップS23に処理が進む。
次に、図10におけるステップS5のテスタ判別処理に相当する手順を説明する。
図25は、テスタ判別処理の例を示すフローチャートである。
(S40)テスタ判別部570は、前段実行時ログ526a、後段実行時ログ526bおよびテスタ-UA対応リスト527を取得する。
(S41)テスタ判別部570は、前段実行時ログ526aおよび後段実行時ログ526bの各行(各レコード)について、ステップS42~S51を繰り返し実行する(判定に応じて実行されないステップもある)。
(S42)テスタ判別部570は、該当の行がテスタの操作情報であるか否かを判定する。該当の行がテスタの操作情報である場合、ステップS41に処理が進む(次の行に移る)。該当の行がテスタの操作情報でない場合、ステップS43に処理が進む。
(S43)テスタ判別部570は、該当の行が前段実行時ログ526aに含まれるか否かを判定する。該当の行が前段実行時ログ526aに含まれる場合、ステップS44に処理が進む。該当の行が前段実行時ログ526aに含まれない(すなわち、後段実行時ログ526bに含まれる)場合、ステップS48に処理が進む。
(S44)テスタ判別部570は、該当の行に含まれるメソッドのモジュールカテゴリが、(前段・)要求受信部であるか否かを判定する。モジュールカテゴリが(前段・)要求受信部である場合、ステップS45に処理が進む。モジュールカテゴリが(前段・)要求受信部でない場合、ステップS46に処理が進む。
(S45)テスタ判別部570は、該当の行に含まれるUA情報と前段スレッドIDの対を、引当テーブル528に記録する。
(S46)テスタ判別部570は、該当の行が連携IDを記録した行(連携ID記録ログ行)であるか否かを判定する。該当の行が連携IDを記録した行である場合、ステップS47に処理が進む。該当の行が連携IDを記録した行でない場合、ステップS52に処理が進む。なお、該当の行が連携IDを記録した行であるか否かは、例えば、該当の行に含まれるメソッド名が連携ID記録箇所リスト523における記録箇所に登録されたメソッド名に合致するか否かにより判定される(合致する場合、連携IDを記録した行である)。
(S47)テスタ判別部570は、該当の行に含まれる前段スレッドIDと連携IDの対を、引当テーブル528に記録する。そして、ステップS52に処理が進む。
(S48)テスタ判別部570は、該当の行に含まれるメソッドのモジュールカテゴリが、(後段・)要求受信部であるか否かを判定する。モジュールカテゴリが(後段・)要求受信部である場合、ステップS49に処理が進む。モジュールカテゴリが(後段・)要求受信部でない場合、ステップS50に処理が進む。
(S49)テスタ判別部570は、後段スレッドIDを、引当テーブル528に記録する。
(S50)テスタ判別部570は、該当の行が連携IDを記録した行(連携ID記録ログ行)であるか否かを判定する。該当の行が連携IDを記録した行である場合、ステップS51に処理が進む。該当の行が連携IDを記録した行でない場合、ステップS52に処理が進む。
(S51)テスタ判別部570は、該当の行に含まれる後段スレッドID(ステップS49で記録された後段スレッドID)に対する連携IDを特定する。テスタ判別部570は、特定した連携IDに対応するUA情報を引当テーブル528から検索する。テスタ判別部570は、当該後段スレッドIDと連携IDと検索したUA情報とを対応付けて、引当テーブル528に記録する。そして、ステップS52に処理が進む。
(S52)テスタ判別部570は、前段実行時ログ526aおよび後段実行時ログ526bの全ての行を処理すると、繰り返しを終了し、ステップS53に進む。
(S53)テスタ判別部570は、引当テーブル528およびテスタ-UA対応リスト527を用いて、前段実行時ログ526aおよび後段実行時ログ526bにおけるスレッドIDをテスタ名に変換する。テスタ判別部570は、変換後の前段実行時ログ526aおよび後段実行時ログ526bをマージすることで、テスタ情報付ログ529を生成し、出力する。例えば、テスタ判別部570は、テスタ情報付ログ529を記憶部520に格納する。また、テスタ判別部570は、ディスプレイ111により、テスタ情報付ログ529を表示してもよいし、クライアント装置300,400にテスタ情報付ログ529を送信してもよい。そして、テスタ判別処理が終了する。
こうして、テスタ判別部570は、テスタ名の情報を含むテスタ情報付ログ529を出力する。
これにより、サーバ装置200におけるアプリケーションが多段に構成されていても、前段のアプリケーションの処理、および、後段のアプリケーションの処理に対するアクセス元を適切に特定できる。例えば、図22のテスタ情報付ログ529の例でいえば、前段アプリケーション、および、後段アプリケーションの各実行箇所について、実行原因となったテスタのテスタ名が適切に記載されている。
こうして、複数のテスタにより、複数のクライアント装置を用いて複数のテストケースに対する操作入力が同時並列的に行われる場合でも、前段/後段の各アプリケーションの実行箇所に対して、当該実行箇所の実行原因となったアクセス元を適切に特定できる。その結果、当該実行箇所に対応するテストケースを適切に特定可能になる。このため、例えば、次回以降に行われる動作テストについて、実行箇所が重複するテストケースを集約したり、実行箇所に応じてテストケースを評価し、実行するテストケースを絞り込んだりして、動作テストの効率化を図れる。
図26は、アプリケーション利用時の他の通信例を示す図である。
第3の実施の形態では、サーバ装置200において、アプリケーションが2段に構成される例を示したが、アプリケーションが3段以上に構成されてもよい。その場合にも連携ID記録コードをアプリケーションの各プログラムに挿入することで、各アプリケーションの実行時ログから連携IDを辿り、実行箇所に対するアクセス元を適切に特定することができる。
例えば、多段に構成された各アプリケーションは、異なるサーバにより実行されてもよい。図26では、3段に構成されたアプリケーションのうち、2つのアプリケーションがサーバ装置200により実行され、1つのアプリケーションがサーバ装置200aにより実行される例を示している。例えば、サーバ装置200は、画面IF処理アプリ202および業務処理アプリ203を実行する。また、サーバ装置200aは業務処理アプリ201aを実行する。この場合に、業務処理アプリ203は、更に、業務処理アプリ201aと連携し得る。業務処理アプリ203,201aの間の通信には、例えば、CORBA/IIOPなどのプロトコルが用いられる。
分析装置500は、サーバ装置200,200aのそれぞれで実行されるアプリケーションのプログラムに連携ID記録コードを追加し、各サーバ装置から実行時ログを収集する。なお、この場合、分析装置500は、画面IF処理アプリ202のプログラムについて、判別材料記録コードを追加する。分析装置500は、各実行時ログに記録された判別材料および連携IDを基に、各アプリケーションの実行箇所に対するアクセス元を辿ることができる。
また、第2,第3の実施の形態では、分析装置100,500によりプログラム書換を行う例(静的変換の例)を示したが、アプリケーションを実行するサーバ装置により、プログラム書換を動的に行う(動的変換を行う)こともできる。例えば、サーバ装置は、バイトコードに対する書換を行うことで、動的変換を行う。バイトコードとは、プログラム実行時にメモリ空間上に配置されたプログラムコードの中間表現である。
図27は、動的書換を行う場合のサーバ装置の機能例を示す図である。
サーバ装置600は、分析装置100と同様のハードウェアで実現される。サーバ装置600は、記憶部620、モジュール特定部630、記録コード追加部640および実行部650を有する。記憶部620は、サーバ装置600のRAMやHDDなどの記憶領域により実現される。モジュール特定部630、記録コード追加部640および実行部650は、サーバ装置600のRAMに記憶された所定のプログラムをサーバ装置600のCPUにより実行することで実現される。
記憶部620は、前段バイトコード621a、後段バイトコード621b、モジュール一覧テーブル622、連携ID記録箇所リスト623、判別材料記録箇所リスト624、書換後前段バイトコード625aおよび書換後後段バイトコード625bを記憶する。
前段バイトコード621aは、前段プログラムに対するバイトコードである。後段バイトコード621bは、後段プログラムに対するバイトコードである。
モジュール一覧テーブル622は、前述のモジュール一覧テーブル522に相当する。連携ID記録箇所リスト623は、前述の連携ID記録箇所リスト523に相当する。判別材料記録箇所リスト624は、前述の判別材料記録箇所リスト524に相当する。
書換後前段バイトコード625aは、前段バイトコード621aに対して、連携ID記録コードおよび判別材料記録コードが追加されたものである。書換後後段バイトコード625bは、後段バイトコード621bに対して、連携ID記録コードおよび判別材料記録コードが追加されたものである。
モジュール特定部630は、モジュール一覧テーブル622に基づいて、前段バイトコード621aおよび後段バイトコード621bに含まれるメソッドをモジュールカテゴリに分類する。モジュール特定部630は、連携ID記録箇所リスト623に基づいて、前段バイトコード621aおよび後段バイトコード621bに含まれるメソッドのうち、連携IDを記録するための命令文を追加すべきメソッドを特定する。モジュール特定部630は、前段バイトコード621aおよび後段バイトコード621bのそれぞれに含まれるメソッド名の位置、および、当該メソッドの属するモジュールカテゴリを、記録コード追加部640に提供する。
記録コード追加部640は、連携ID記録箇所リスト623に基づき、モジュール特定部630から取得したメソッド名の位置に対応する、前段バイトコード621aの所定の位置に、当該メソッドの属するモジュールカテゴリに応じた連携ID記録コードを追加する。記録コード追加部640は、後段バイトコード621bに対しても同様に、連携ID記録コードを追加する。
記録コード追加部640は、判別材料記録箇所リスト624に基づき、モジュール特定部630から取得したメソッド名の位置に対応する、前段バイトコード621aの所定の位置に、当該メソッドの属するモジュールカテゴリに応じた判別材料記録コードを追加する。記録コード追加部640は、後段バイトコード621bに対しても同様に、判別材料記録コードを追加する。
こうして、記録コード追加部640は、前段バイトコード621aから書換後前段バイトコード625aを生成し、記憶部620に格納する。また、記録コード追加部640は、後段バイトコード621bから書換後後段バイトコード625bを生成し、記憶部620に格納する。
実行部650は、記憶部620に記憶された書換後前段バイトコード625aおよび書換後後段バイトコード625bを実行する。実行部650は、書換後前段バイトコード625aの実行に応じて、前段実行時ログ626aを出力する。実行部650は、書換後後段バイトコード625bの実行に応じて後段実行時ログ626bを出力する。
例えば、前段実行時ログ626aおよび後段実行時ログ626bは、分析装置500に送信されて、分析装置500のテスタ判別部570によりテスタ情報付ログ529が生成されてもよい。あるいは、サーバ装置600は、テスタ-UA対応リスト527に相当する情報を保持し、また、テスタ判別部570の機能を有してもよい。この場合、サーバ装置600により、前段実行時ログ626aおよび後段実行時ログ626bから引当テーブル528に相当する情報を生成できる。また、サーバ装置600により、テスタ-UA対応リスト527に相当する情報、および、引当テーブル528に相当する情報に基づき、前段実行時ログ626aおよび後段実行時ログ626bから、テスタ情報付ログを生成できる。
サーバ装置600は、第1の実施の形態の情報処理装置10の一例であると考えることができる。すなわち、第1の実施の形態の情報処理装置10の機能(コンピュータによる機能)は、テスト対象装置20(第1の情報処理装置)に組み込まれてもよい。
第2の実施の形態では、スレッドIDおよびUA情報を用いて、プログラムの実行箇所に対するアクセス元を特定する例を示した。また、第3の実施の形態では、スレッドID、UA情報および連携IDを用いて、プログラムの実行箇所に対するアクセス元を特定する例を示した。以下では、第2の実施の形態および第3の実施の形態のそれぞれに対する比較例を説明する。
まず、第2の実施の形態に対する比較例(第1の比較例)を説明する。第1の比較例は、UA情報を実行時ログに記録しない例である。
図28は、ログ生成の第1の比較例を示す図である。
第1の比較例では、判別材料記録箇所リスト123に代えて、判別材料記録箇所リストD11を用いる点が第2の実施の形態と異なる。判別材料記録箇所リストD11では、モジュールカテゴリ「前段・要求受信部」に対して、判別材料「ctxThreadId」のみが登録されており、UA情報の登録がない。
書換後プログラムP11,P12,P13は、モジュール一覧テーブル122および判別材料記録箇所リストD11を用いた場合の、プログラム121に対する書換後のプログラムである。例えば、書換後プログラムP11,P12と、前述の書換後プログラム124a,124bとを比較すると、書換後プログラムP11,P12では、判別材料記録コードにUA情報に対応する変数名が含まれていない。
図29は、ログ生成の第1の比較例(続き)を示す図である。
実行時ログL11は、書換後プログラムP11,P12,P13がサーバ装置200により実行された際に生成されたログの例である。実行時ログL11の各レコードは、UA情報を含んでいない。この場合、スレッドID「thread2」に対応する各メソッドの実行やスレッドID「thread3」に対応する各メソッドの実行が、何れのテスタによる操作入力を原因とするものかを判別することができない。このため、実行時ログL11をテスタ情報付ログに変換することはできない。変換後ログL12は、実行時ログL11の各レコードに対して、該当のメソッドが属するモジュールカテゴリの一部(具体的には、「前段」)の情報を付与し、スレッドIDを除去する変換を行った後のログである。しかし、変換後ログL12には、テスタ名が記載されていない。このため、変換後ログL12から各メソッドのアクセス元を特定することはできない。
そこで、第2の実施の形態の分析装置100は、スレッドIDに加えて、UA偽装技術によるUA情報を用いることで、複数のテストケースが並列に行われても、プログラムの実行箇所の実行原因となったアクセス元を適切に特定することができる。
次に、第3の実施の形態に対する比較例(第2の比較例)を説明する。第2の比較例は、判別材料において、UA情報の代わりに、連携ID(具体的には、セッションID)を用いる例である。
図30は、ログ生成の第2の比較例を示す図である。
第2の比較例では、判別材料記録箇所リスト524に代えて、判別材料記録箇所リストD21を用いる点が第3の実施の形態と異なる。判別材料記録箇所リストD21では、モジュールカテゴリ「前段・要求受信部」に対して、判別材料「ctxThreadId,sessionID」が登録されており、UA情報の登録がない。ここで、「sessionID」は、前段プログラム521aにおける連携ID(セッションID)を示す。
書換後前段プログラムP21,P22は、モジュール一覧テーブル522、連携ID記録箇所リスト523および判別材料記録箇所リストD21を用いた場合の、前段プログラム521aに対する書換後のプログラムである。
書換後前段プログラムP21は、メソッド「doGet」の引数に「sessionID」が含まれないパターン(パターン1)を示す。この場合、例えば、判別材料記録コードが書換後前段プログラムP21の3行目の位置に追加される。しかし、この位置では、セッションIDが取得不能なため、ビルドエラーとなり、実行不能となってしまう。
また、書換後前段プログラムP22は、メソッド「doGet」の引数に「sessionID」が含まれるパターン(パターン2)を示す。この場合、例えば、判別材料記録コードが書換後前段プログラムP22の3行目の位置に追加される。しかし、この位置では、実行時に「sessionID」が無効値(割付前)となり、実行時エラーとなる。すなわち、前段実行時ログに連携ID(セッションID)が記録されず、アクセス元への紐付けが不能となる。
図31は、ログ生成の第2の比較例(続き)を示す図である。
前段実行時ログL21は、書換後前段プログラムP22がサーバ装置200により実行された際に生成されたログの例である。後段実行時ログL22は、比較例の書換後後段プログラムがサーバ装置200により実行された際に生成されたログの例である。ここでは、一例として、テスタ名に対するセッションIDが判明している場合を考える。テスタ-セッション対応リストP31は、テスタ名に対してセッションIDを対応付けた情報である。
前段実行時ログL21では、図30で例示した書換後前段プログラムP22に追加された判別材料記録コードに基づき、実行されたメソッド名に対して、スレッドIDおよびセッションIDが記録される。後段実行時ログL22についても同様である。
ただし、前段実行時ログL21では、その3行目で示されるように、セッションIDが記録されない(該当のモジュールに対して「null」である)こともある。例えば、前述のように、静的アクセスやログイン前のアクセスである場合である。
変換後ログL23は、前段実行時ログL21および後段実行時ログL22のセッションIDおよびスレッドIDを、テスタ-セッション対応リストP31に基づいて、テスタ名に変換し、両ログをマージしたものである。変換後ログL23では、3行目や4行目で示されるように、前段の「doGet」や「methodB」に対して、テスタ名を特定できていない。
このように、UA情報の代わりにセッションIDを用いると、テスタ-セッション対応リストP31が得られていたとしても、実行箇所に対するアクセス元を特定できないことがある。
そこで、第3の実施の形態の分析装置500は、スレッドID、連携ID(セッションID)に加え、UA偽装技術によるUA情報を用いることで、複数のテストケースが並列に行われても、プログラムの実行箇所の実行原因となったアクセス元を適切に特定できる。
なお、第1の実施の形態の情報処理は、処理部12にプログラムを実行させることで実現できる。また、第2,第3の実施の形態の情報処理は、CPU101にプログラムを実行させることで実現できる。プログラムは、コンピュータ読み取り可能な記録媒体113に記録できる。
例えば、プログラムを記録した記録媒体113を配布することで、プログラムを流通させることができる。また、プログラムを他のコンピュータに格納しておき、ネットワーク経由でプログラムを配布してもよい。コンピュータは、例えば、記録媒体113に記録されたプログラムまたは他のコンピュータから受信したプログラムを、RAM102やHDD103などの記憶装置に格納し(インストールし)、当該記憶装置からプログラムを読み込んで実行してもよい。