図1は、本実施の形態におけるプログラムの動作テストを実行するエラー再現装置の構成を示す図である。図1のエラー再現装置は、情報処理装置(またはコンピュータ)である。エラー再現装置は、CPU(Central Processing Unit)10と、高速のメインメモリ12と、ネットワークインターフェース(またはNIC:Network Interface Card)14と、大容量で不揮発性の補助メモリ20〜28を有する。ネットワークインターフェース14には、ネットワークNWが接続される。また、ネットワークインターフェース14は、外部のストレージとのインターフェースであるIOドライバ回路を含み、IOドライバ回路は、ネットワークNWの先に接続されているストレージ装置へのIOアクセスを実行する。このIOアクセスも、ネットワークNWを介するアクセスであるので、本実施の形態のネットワークアクセスに含まれる。
補助メモリ20〜28内には、テスト対象プログラムであるテスト対象プロセスPUTと、テスト対象プロセスPUTの動作テストを制御するテストプログラムTPと、テスト対象プロセスPUTを実行したときのログを格納するログファイル25を生成するロギングプログラムLPと、プログラムである複数のプロセスやテーブルやライブラリ等26と、オペレーティングシステム(OS:Operating System)22などが格納される。OSには、ネットワークインターフェース14をドライブするドライバ(またはドライバプログラム)DRVが含まれる。CPU10は、上記のプログラム、OS、プロセスをメインメモリ12内に展開し、実行する。
図2は、テスト対象プログラム(またはテスト対象プロセス)とネットワークインターフェースのドライバの一例を示す図である。テスト対象プロセスPUTは、行番号01〜14のメインルーチン31と、メインルーチン31で呼び出されるエラールーチン32とを有する。また、図2には、メインルーチン31がネットワークアクセスを実行するときに呼び出すネットワークインターフェース14のドライバDRVも示される。
この例のテスト対象プログラムPUTは、メインルーチン31が、処理Xを実行し(行番号01)、ネットワークアクセスのためにセッション確立を実行し(行番号03)、確立したセッション内で、電文A,B,C等を送信し(行番号07)、最後にセッション解放を実行する(行番号11)。セッション確立とセッション解放は、ネットワークアクセス先のノードとネゴシエーションなどを行うので一種のネットワークアクセスである。また、図2の例ではデータの送信しか実行していないが、データの受信が含まれても良く、データの送信と受信はネットワークアクセスの一つである。
また、この例のテスト対象プログラムPUTは、ネットワークアクセスであるセッション確立と、データ送信と、セッション解放の前後で、ネットワークアクセスに必要なメモリ領域を獲得するメモリ獲得(行番号02,06,10)と、獲得したメモリを解放するメモリ解放(行番号05,09,13)を有する。さらに、各ネットワークアクセス(行番号03,07,11)の直後に、ドライバが戻り値(または復帰値)「エラー応答」でリターンした場合にエラールーチンを呼び出す命令(行番号04,08,12)を有する。
そして、この例のテスト対象プログラムPUTでは、行番号06−09をM回繰り返すが、M回の繰り返しを示すコードは省略されている。
一方、メインルーチン31から呼び出されるエラールーチン32は、ネットワークアクセスでエラーが発生している間且つエラー回数がNに達するまで、ロギングルーチンの呼び出し(行番号21)、メモリ解放(行番号23)、メモリ獲得(行番号24)、ネットワークアクセスのリトライ(行番号25)を繰り返す。
そして、ネットワークインターフェースドライバDRVは、呼び出されたネットワークアクセス(セッション確立、セッション解放、送信、受信など)を実行し(行番号31)、ネットワークアクセスが正常に終了した場合に戻り値を「正常」にし(行番号32)、ネットワークアクセスに異常が発生した場合に戻り値を「エラー応答」にして(行番号33)、呼び出し元のプロセスにリターンする。
ロギングプログラムLPは、図示しないが、テスト対象プログラムPUTのエラールーチン32でロギングルーチンを呼び出されると、呼び出し元のテスト対象プログラムから引き渡される引数に含まれるプロセスID、ログコード、エラー詳細情報などをログファイル25に格納する。プロセスIDは、テスト対象プログラム(テスト対象プロセス)の識別情報であり、ログコードは、発生した現象の識別コードである。また、エラー詳細情報は、例えば、エラーを発生させたネットワークアクセスの種類(セッション確立、セッション解放、送信、受信)、送信または受信の電文などが含まれる。
図3は、テスト対象プログラム(以下テスト対象プロセスと称する。)PUTの動作テストの第1の例を示すシーケンス図である。テストプログラムTPがテスト開始をテスト対象プロセスPUTに指示すると(S1)、CPUがテスト対象プロセスの実行を開始する。
図3の例では、テスト対象プロセスPUTは、図2で示したとおり、処理Xを実行した後、セッション確立を実行する(S2)。このセッション確立の実行は、OSのドライバDRVをコールすることで行われ、コールされたドライバDRVは、ネットワークインターフェースを介してネットワークNWにアクセスしセッションを確立する。この例では、セッション確立が正常に終了し、ドライバDRVは呼び出し元のテスト対象プロセスに戻り値「正常」で応答する。そして、テスト対象プロセスは、セッション確立S2の前でメモリ獲得を実行し、セッション確立が正常に終了したため、セッション確立の後でメモリ解放を実施する。
同様に、テスト対象プロセスPUTは、電文Aの送信S3と、電文Bの送信S4と、電文Cの送信S5を実行し、最後にセッション解放S6を実行する。送信S3,S4,S5とセッション解放S6は、それぞれドライバDRVをコールしてそれぞれのネットワークアクセスを実行させる。また、それぞれのネットワークアクセスの前でメモリ獲得を実行し、それぞれのネットワークアクセスが正常に終了したため、その後でメモリ解放を実行している。
最後に、テストプログラムTPは、テスト終了をテスト対象プロセスに指示すると(S7)、テスト対象プロセスPUTの実行が終了する。
図3の動作例では、ネットワークアクセスが全て正常に終了したため、エラーが発生せず、エラールーチンが呼び出されることがなく、ネットワークアクセスのリトライも発生していない。そして、各ネットワークアクセスの前後でメモリ獲得とメモリ解放が実行されたため、テスト対象プロセスの動作テストが終了した時点で、メインメモリ12の空きメモリ領域が不足する状況には至っていないことが検出される(S8)。
図4は、テスト対象プログラム(以下テスト対象プロセス)の動作テストの第1の例を示すシーケンス図である。図4において、テストプログラムTPによるテスト開始の指示S1と、テスト対象プロセスPUTのセッション確立S2、電文Aの送信S3、電文Bの送信S4、及びテストプログラムのテスト終了指示S7は、図3と同じである。
しかし、図4では、テスト対象プロセスの電文Cの送信S5でコールされたドライバDRVによる電文Cの送信は、ネットワークNW等の何らかの事情で異常が発生し、ドライバDRVは戻り値「エラー応答」で呼び出し元のテスト対象プロセスPUTにリターンしている。その結果、テスト対象プロセスは、エラールーチン(図2の32)を実行し、ロギングルーチンをコールしてロギングプログラムLGにエラー応答が発生した時の、プロセスID、ログコード、エラー詳細情報をログファイル25に記憶させ、さらにリトライを実行している(S5_1)。そして、エラールーチンは、このリトライで、ドライバDRVを呼び出し電文Cの送信を再度実行するが、再度異常が発生し、ドライバDRVは戻り値「エラー応答」でエラールーチンにリターンしている。その結果、エラールーチンが繰り返し実行され、ロギングプログラムLGにエラー応答が発生した時の前述の情報をログファイル25に記憶させている。
図4では、その後のテスト終了までの処理については、省略している。そして、図4のテスト終了後に、メインメモリの空きメモリ領域が不足する状況になっていることが検出される(S9)。
ここで、図4で動作テスト終了時に空きメモリ領域が不足する状況になった原因は、(1)ネットワークアクセスの異常によるエラー応答で動作したエラールーチン32に、メモリ解放の命令コードが記述されてないバグがあったためエラー応答のたびに獲得済みのメモリ領域が解放されないままになった、(2)偶然にエラー応答のときに他のプロセスによるある命令実行でメモリ解放が実行されなかった、などが予測されるものと仮定する。
上記の場合、原因(1)の空きメモリ領域不足の原因がエラールーチンのバグによる可能性が高いことを検証するためには、図4の動作と同じネットワークアクセスでのエラー応答を再現し、エラールーチンを実行させる動作テストを繰り返し行い、原因(2)の偶然に発生した現象が発生しない場合に空きメモリ領域不足が発生するか否かをチェックすることが一つの方法である。
しかしながら、動作テストを実行するコンピュータシステムのネットワークNWの状態は、刻一刻変化するので、必ずしも図4の動作と同じように同じネットワークアクセスでエラー応答を再現できるとは限らない。
そこで、本実施の形態では、ネットワークインターフェースドライバDRVとロギングプログラムLGに改良を加えて、上記のエラー応答を毎回再現できるようにする。
図5は、本実施の形態における第1の動作テストの概略を示すフローチャート図である。動作テストは、初回テストS10-S13と、2回目以降の再現テストS14-S17と、再現テストを繰り返した後の検証工程S18と、デバッグ工程S19などを有する。
まず、初回テストでテスト対象プロセスを実行開始し(S10)、テスト対象プロセスの実行中に累積アクセス数をカウンタで計測し、ドライバDRVからのエラー応答が発生したときに、ロギングルーチンがテスト対象プロセスの累積アクセス数を計測するカウント値をログに記憶する(S11)。テスト対象プロセスが実行中、エラー発生時の累積アクセス数のカウント値を記憶するロギング処理S11を繰り返す。そして、テスト対象プロセスの実行終了後に所定の不具合(例えばメインメモリの空きメモリ領域不足)が発生していないかを調べる。所定の不具合が発生していることを検出すると(S12のYES)、テストプログラムTPは、ロギングルーチンに、注目するエラー発生時のカウント値でエラーが再現されるようにドライバDRVに設定させる(S13)。一例として、注目するエラー発生時のカウント値をログファイルから抽出し、ドライバDRVに通知させる。この処理S13は、テストプログラムTPが実行してもよい。
図6は、テスト対象プロセスPUTの動作テストの初回テストの一例を示すシーケンス図である。図6の初回テストでのテスト対象プロセスPUTの動作は、図4の例と同様に、テスト開始して(S1)、テスト対象プロセスPUTが、セッション確立S2、送信(電文A)S3、送信(電文B)S4のネットワークアクセスの実行時にドライバDRVをそれぞれコールしてそれらのアクセスを実行させ、すべて正常に終了し、但し、送信(電文C)S5でネットワークアクセスは異常終了してドライバDRVがエラー応答し、その後のリトライS5_1でもドライバがエラー応答している。
動作テスト開始前に、ドライバDRVにテスト対象プロセスのネットワークアクセスに対応するカウンタが設定され、ドライバDRVはテスト対象プロセスの実行開始からそのプロセスでのネットワークアクセスの実行回数をカウントする。全てのネットワークアクセスを単一のカウンタでカウントしても良いが、望ましくは、ネットワークアクセスの種類(セッション確立、データ送信、データ受信、セッション解放)別にカウンタを設定しそれぞれの回数をカウントする。図6中、セッション確立のカウント値CNT_1は1回、送信のカウント値CNT_2は3回カウントされ、受信のカウント値とセッション解放のカウント値は示されていない。
ネットワークアクセスのリトライの回数はカウントしないのが望ましい。前述のとおり、テスト対象プロセスでは、ネットワークアクセスで異常が発生してエラー応答が発生すると、リトライが行われる。しかし、ネットワークアクセスの異常は、ネットワーク自体の異常以外に様々な要因で発生する。したがって、初回テストでのリトライ発生と、2回目以降の再現テストでのリトライ発生とは必ずしも一致しない。したがって、リトライの回数はカウントせずに、テスト対象プロセスで記述されているネットワークアクセスの実行回数だけをカウントする。それにより、初回テストでのカウント値と再現テストでのカウント値が同じネットワークアクセスで一致する可能性が向上する。
また、動作テストでは、エラー応答が発生すると、テスト対象プロセスPUTのエラールーチンの実行により、ロギングプログラムLPをコールしてロギング依頼する(S11)。そして、動作テストでは、ロギングプログラムは、前述のプロセスID、ログコード(処理内容、エラー種類などのコード)、エラー詳細情報(アクセスの種類、電文)に加えて、カウント値もログファイルに記憶する(S11)。図6の例では、電文Cの送信S5とそのリトライS5_1に対するエラー応答の発生時に、ロギングプログラムが、プロセスID(図示せず)と、エラー応答のエラーコードと、アクセス種類と電文C(図示せず)と、送信のカウント値CNT_2=3とをログファイルに記憶する。
図5に戻り、初回テストの実行後に、処理の不具合が発生していないかチェックする。このチェックはテストプログラムによって行われる。または、通常のOS機能で状態をチェックしてもよい。たとえば、メインメモリの空きメモリ領域が不足している不具合がチェックされる。テスト対象プロセスの実行中のエラールーチンでメモリ領域の解放命令(図2のエラールーチン内の行番号23)のバグ(解放命令なし)がある場合、メモリ領域の解放が行われず空きメモリ領域が不足する不具合が発生する。
そこで、上記の不具合が検出されると(S12)、ロギングプログラムが蓄積したログファイルからネットワークアクセスでのエラー応答時のカウント値を抽出し、そのカウント値(送信のカウント値CNT_2=3)をドライバDRVに通知して設定する(S13)。
次に、2回目以降の再現テストが実行開始されると(S14)、テスト対象プロセスPUTが実行され、初回テストと同様に、ドライバDRVがネットワークアクセスの実行回数をカウントし、各カウント値が初回テスト後に設定したカウント値と一致すると、ドライバはネットワークアクセスの実行を行うことなく、強制的にエラー応答でリターンする(S15)。つまり、初回テスト時と同じネットワークアクセスでエラー応答を再現する。そして、再現テストが終了した後、テストプログラムTPは、前述の所定の不具合(空きメモリ領域不足)が発生したか否かを確認する(S16)。このような再現テストが複数回(K回)繰り返されて(S17)、再現テストが終了する。
図7は、2回目以降の再現テストの一例を示すシーケンス図である。図7の再現テストでは、図6の初回テストと同様に、テスト対象プロセスPUTが、セッション確立S2、送信(電文A)S3、送信(電文B)S4のネットワークアクセスの実行時にドライバDRVをコールしてそれらのアクセスを実行させ、正常に終了している。その間、ドライバはそれぞれのアクセス種類別に回数をカウントする。
そして、送信(電文C)S5で呼び出された時、ドライバDRVは送信用のカウンタをカウントアップしてCNT_2=3となり、再現テスト前に設定したカウント値CNT_2=3と一致する。そこで、ドライバはネットワークアクセスを実行せずに、強制的にダミーのエラー応答の戻り値でテスト対象プロセスPUTにリターンする(S15)。この疑似エラー応答S15に応答して、テスト対象プロセスPUTのエラールーチンが実行される。さらに、リトライS5_1で呼び出されたときも、ドライバは同様にカウント値の一致により(CNT_2=3)、ネットワークアクセスせずに疑似エラー応答でリターンする(S15_1)。これに応答してエラールーチンが実行される。つまり、2回の疑似エラー応答を再現することで、初回テストと同様にエラー応答に対応するエラールーチンの実行が再現される。
そして、テストプログラムは、空きメモリ領域不足が発生しているか否かをチェックする(S16)。複数回(K回)再現テストを繰り返して、毎回空きメモリ領域不足が検出されると、ネットワークアクセスに対するエラー応答をトリガにして実行されるエラールーチンに何らかのバグが有る可能性が高いことが検証される。
すなわち、空きメモリ領域不足は、ネットワークアクセスのエラー応答以外の原因で偶発的に発生する場合もある。そのような偶発的に発生する空きメモリ領域不足を起こす現象は、例えば、ある時刻になると実行されるプロセスなどが考えられる。ただし、偶発的に発生する現象は、複数回の再現テストでも毎回偶然発生することはない。そこで、本実施の形態では、再現テストで注目しているネットワークアクセスのエラー応答を確実に再現し、偶発的に発生する現象に起因して空きメモリ領域不足が発生した可能性を排除できるか否か検証することを行う。複数回の再現テストで注目しているネットワークアクセスのエラー応答が毎回発生し、そのほとんどの再現テスト後に空きメモリ領域不足が発生すれば、ネットワークアクセスのエラー応答がその原因である可能性が高いと検証できる。
したがって、再現テストでは、再現するエラーまたは処理や現象を選択または絞りながら、それらが原因か否かを検証することが好ましい。
図5に示すとおり、所定の不具合(空きメモリ領域不足)の原因が注目しているネットワークアクセスのエラー応答であると検証できると(S18のYES)、その注目のエラー応答で実行される命令コードをデバッグする(S19)。この作業は、テストプログラムによるデバッグルーチンや人為的な作業により行われてよい。図2の場合は、エラー応答で実行されるエラールーチンがデバッグ対象になる。
このように、本実施の形態によれば、動作テストで注目している(または疑っている)現象を再現することができるので、デバッグ対象を絞り込むことができる。
[第2の動作テスト]
図8は、本実施の形態における第2の動作テストの概略を示すフローチャート図である。第2の動作テストも、図5の第1の動作テストと同様に、初回テストS10-S13と、2回目以降の再現テストS14-S17と、再現テストを繰り返した後の検証工程S18と、デバッグ工程S19などを有する。
図8の第2の動作テストで図5の第1の動作テストと異なる処理は、以下のとおり工程S11_A, S13_A, S15_Aである。それ以外の処理は図5と同じである。第2の動作テストでは、初回テスト実行時に、ロギングプログラムがエラー応答時のエラー詳細情報としてログコードとカウント値と処理内容(アクセス種類と電文)とをログファイルに記憶する(S11_A)。そして、初回テストが終了後、再現テストの準備処理S13_Aで、ロギングプログラム(またはテストプログラム)が、ログファイル内の注目するエラー応答時のカウント値と処理内容(アクセス種類と電文)をドライバDRVに通知し、そのアクセス種類に対応するカウント値と電文が一致すればエラー応答を発生するよう設定する(S13_A)。これにより、2回目以降の再現テストでは、実行中のプロセスでのネットワークアクセスのアクセス種類に対応するカウント値と処理内容(電文)とが、設定した同じアクセス種類に対応するカウント値と処理内容(電文)と一致すると、ドライバDRVがネットワークアクセスを実行することなく強制的にダミーのエラー応答を発生する(S15_A)。
初回テストと再現テストとでハードウエア資源状態(例えばメモリ容量、ネットワークの状態)に依存して、偶然にテスト対象プロセスとは無関係のプログラムが動作することもあり、初回テストと再現テストでの注目プロセスによるネットワークシーケンスが同じにならない場合がある。そこで、第2の動作テストによれば、初回テストでのエラー応答と再現テストでのエラー応答の原因をできるだけ同じにするために、再現テストでは、ネットワークアクセスのカウント値に加えて処理内容(電文)が一致するときに、ドライバがエラー応答を発生するようにする。
再現テストでカウント値は一致するが電文は一致しない場合、電文が一致してもカウント値は一致しないことが想定される。このような再現テストでは、初回テストと同じエラー応答を再現することはできない。しかし、複数回の再現テストを行うことで一定の割合で再現テストで初回テストと同じエラー応答を再現することができる。また、初回テストと異なるエラー応答の再現を抑制することができる。
なお、ネットワークアクセスが送信の場合はその送信電文、受信の場合は直前の受信電文などが、エラー応答を再現するか否かのチェック用電文として利用される。
[本実施の形態の詳細]
次に、本実施の形態の詳細に説明する。以下の詳細例では上記の第2の動作テストの例である。
[初回テスト]
図9は、初回テストのための準備処理と初回テストの処理シーケンスを示す図である。準備処理として、テストプログラムTPは、プロセス名に対応するプロセスIDをOSから取得しプロセステーブルに格納し(S31)、プロセステーブルをドライバDRVに通知する(S32)。テストプログラムTPやテスト対象プロセスPUTを実行する情報処理装置(図1参照)は、電源起動時にOSが電源起動動作に含まれる複数のプロセスの起動処理を完了済みである。したがって、テスト開始前に、OSは起動処理した複数のプロセスのプロセスIDを管理している。そこで、本実施の形態では、プロセスの動作テストを制御するテストプログラムTPは、OSから起動済みのプロセスのうち、テスト対象プロセスのプロセスIDを取得し、プロセステーブルに格納し、ドライバに通知する。ここで、プロセスとは例えばワードプロセッサや表計算プログラムなどである。
図10は、プロセステーブルと各プロセスに対応して作成されるカウンタとを示す図である。プロセス名定義テーブル41にプロセス名「mwproc」「Fileprv」が登録されている。それに対応して、プロセステーブル42にそれらのプロセス名毎のプロセスID「101」「113」が登録されている。上記の工程S31では、テストプログラムTPが、プロセステーブル42を生成し、ドライバDRVに通知する(S32)。これにより、テストプログラムTPは、テスト対象プロセスのプロセスIDをドライバDRVに通知する。
図9に戻り、次に、ドライバDRVは、プロセステーブル42に基づいて、各プロセス毎に、ネットワークアクセスの種類別にカウンタを作成する(S33)。すなわち、図10に示されるとおり、プロセステーブル42に登録されているプロセスID毎に、ネットワークアクセスの種類(アクセス確立、アクセス解放、受信、送信)別にカウンタCNT_1、CNT_2、CNT_3、CNT_4を作成する。これらのカウンタは、具体的には例えばメインメモリ内に作成される。図10には、プロセスID=101、113それぞれに対して、カウンタCNT_1、CNT_2、CNT_3、CNT_4が作成されている。
図9に戻り、テストプログラムTPが初回テスト開始コマンドを実行し、初回テスト開始を、テストプロセスPUTとドライバDRVとロギングプログラムLGとに通知する(S34(図8内のS10))。これに応答して、ドライバDRVは動作モードを初回テストに設定し、ロギングプログラムLGも動作モードを初回テストに設定し、テスト対象プロセスPUTが初回テスト動作を実行し(S38)、テスト対象プロセスPUTからの呼び出しに応答して、ドライバDRVが初回テストの処理を実行し(S39)、ロギングプログラムLGが初回テストの処理を実行する(S40)。やがて、テストプログラムTPが初回テスト終了コマンドを実行し、初回テスト終了をテストプロセスPUTとドライバDRVとロギングプログラムLGとに通知する(S41,S42)。初回テストが終了すると、ロギングプログラムLGが、ログファイル25内に、ドライバDRVがネットワークアクセス処理に対応して発生するエラー応答発生時のプロセスID、ログコード、エラー詳細情報(アクセス種類、電文)とカウント値とを格納する。
図11は、ドライバDRVの初回テストでの処理S39のフローチャート図である。ドライバDRVは、実行中のテスト対象プロセスからネットワークアクセスの呼び出しが発生すると処理を開始する(S51のYES)。図11の処理は、初回テストでの処理であるので、動作モードが初回テストでない場合は実行されず(S52のNO)、動作モードが初回テストの場合に実行される(S52のYES)。
次に、ドライバDRVは、呼び出し元プロセスのプロセスIDを取得し(S53)、取得したプロセスIDがプロセステーブル42内のプロセスIDと一致するか否かチェックする。呼び出し元プロセスのプロセスIDは、呼び出し関数の引数に含まれている。
そして、ドライバは、呼び出し元のプロセスIDがプロセステーブル内のプロセスIDと一致する場合(S54のYES)、リトライによるネットワークアクセスでなければ(S55のNO)、呼び出されたネットワークアクセスに対応するカウンタを+1する(S56)。つまり、ネットワークアクセスがアクセス確立、解放、送信、受信のいずれかに応じて対応するカウンタをインクリメントする。リトライによるネットワークアクセスか否かの判定は、呼び出されたネットワークアクセスが、直前のネットワークアクセスと同じアクセス内容(アクセス種類(コマンドコード)と対応する電文)と同じか否かで判定する。図11中、左下に示した前回の呼び出し内容レジスタ43に、ネットワークアクセスのコマンドコードと電文とが記憶されている。前回の呼び出し内容レジスタ43は、例えばメモリ領域などに生成される。
リトライによるネットワークアクセスの場合(S55のYES)、対応するカウンタのカウント値はインクリメントされない。これにより、初回テスト時と再現テスト時のネットワーク状態やその他の要因が異なることに起因してリトライの発生が異なっても、リトライ時の回数をカウントしないことにより、カウント値に基づいて初回テスト時と再現テスト時とで同じネットワークアクセスか否かの判定を高精度に行うことができる。
そして、ドライバは、呼び出されたネットワークアクセスを実行し(S57)、ネットワークインターフェース14にそのネットワークアクセスを実行させる。さらに、ドライバは、今回の呼び出し内容(コマンドコードと電文)を、前述の前回の呼び出し内容レジスタ43内に保存し(S58)、戻り値と共に呼び出し元のプロセスにリターンする。ドライバは、ネットワークアクセスが正常に終了すれば戻り値は「正常」応答でリターンし、異常が発生すれば戻り値は「エラー」応答でリターンする。
一方、ドライバは、呼び出し元のプロセスIDがプロセステーブル内のプロセスIDと不一致の場合(S54のNO)、通常のネットワークアクセスを実行する(S59)。この場合は、カウンタを+1する処理はない。
上記のドライバDRVの初回テストでの処理により、テスト対象プロセスで発生したネットワークアクセスのアクセス種類毎の発生回数をそれぞれのカウンタによりカウントすることができる。
図12は、ロギングプログラムLGのテストでの処理S40を示すフローチャート図である。ロギングプログラムLGは、テスト対象プロセスのエラールーチンなどによるロギングプログラムの呼び出しに応答して動作する(S61のYES)。ロギングプログラムは、呼び出されると、呼び出し元のプロセスID、ログコード(エラーの原因を示す識別コード)、エラー詳細情報(ネットワークアクセスの種類とそれに対応する電文)を引数で受領する(S62)。
そして、動作モードが「初回テスト」の場合は(S63のYES)、ロギングプログラムLGは、引数の呼び出し元プロセスIDとログコードを参照し、注目するプロセスIDで且つ注目するエラーのログコードか否かを判定する(S64)。図12には、ログコードテーブル44の一例としてネットワークエラーのエラーコード「1025」が示されている。このログコードテーブル44には「1025」がテスト準備処理にて予め登録されている。
引数のプロセスIDとログコードとがプロセステーブルのプロセスIDとログコードテーブル44のログコードとそれぞれ共に一致する場合(S64のYES)、ロギングプログラムLGは、引数に含まれているプロセスIDのネットワークアクセスの種類に対応するカウント値を、ドライバDRVから取得し(S65)、ログファイルに、日時、引数に含まれる情報、取得したカウント値を記録する(S66)。一方、引数のプロセスIDがプロセステーブルと不一致またはログコードがログコードテーブル44のログコードと不一致の場合(S64のNO)、ロギングプログラムLGは、日時、引数に含まれる情報をログファイルに記録する(S67)。この処理は、通常のロギング処理である。
以上により、ロギングプログラムは、注目しているプロセスIDの注目しているエラーコードについてのログ情報を、ドライバがカウントしているカウント値とネットワークアクセスに対応する電文とを含めてログファイルに記録する。
[再現テスト]
図13は、再現テストのための準備処理と再現テストの処理シーケンスを示す図である。準備処理として、テストプログラムTPは、ログファイル内のログから注目するエラー応答の再現タイミングのログに絞り(S71)、絞ったログからエラー再現条件テーブルを生成する(S72)。そして、テストプログラムは、ドライバDRVにエラー再現条件テーブルをエラー再現条件として通知すると(S73)、ドライバはエラー再現条件を設定する(S74)。
図14は、ログファイル、再現対象ログファイル、エラー再現条件テーブルの一例を示す図である。ログファイル25は、既に説明したとおり、ログの日時と、プロセスIDと、ログコードと、ネットワークアクセスの詳細内容であるアクセス種類と電文(図14では電文データへのポインタ情報)と、カウント値を有する。プロセスIDの「101」は、図10のプロセステーブル42内のプロセスmwprocのプロセスIDであり、ログコード「1025」は、図12のログコードテーブル内のネットワークエラーのログコードである。
但し、再現テストでは、ログファイル25内の全てのログと一致するタイミングでエラーを再現させるのではなく、別の要因で絞られるログと一致するタイミングでエラーを再現させて、動作テストによって行おうとしている検証精度をより高めたい場合がある。例えば、メインメモリの使用状況を定期的にまたは所定のタイミングで記録していた場合、メインメモリの空きメモリ領域が急減した時刻を特定することができる。その場合は、再現テストでは、空きメモリ領域が急減した時刻直前に記録されたネットワークエラーに関するログに絞って、エラーを再現させたい場合がある。
そこで、テストプログラムTPは、ログファイル25を取得し、絞り込みたい時刻や時間帯を指定して、注目するエラー応答の再現タイミングのログに絞り再現対象ログファイル50を生成する(S71)。図14の再現対象ログファイル50は、ログファイル25のカウント値が32に達する時刻以降のログ(カウント値が32と33のログ)に絞られている。
そして、テストプログラムは、再現対象ログファイル50内の絞ったログから、エラー再現条件テーブル51を生成する(S72)。具体的には、エラー再現条件テーブル51は、再現対象ログファイルログの発生時刻を除いた、プロセスIDと、ログコードと、アクセス種類と、電文と、カウント値を有するテーブルである。
上記のログファイルから注目するエラー応答の再現タイミングのログへの絞り込みは、単に、ログファイル内の注目するプロセスID「101」とログコード「1025」のログに絞り込むだけでもよい。少なくとも、ログにアクセス種類と電文情報とカウント値とが含まれるものに絞り込めば良い。
図13に戻り、上記の再現テストのための準備処理(S72-S74)の後、テストプログラムTPは再現テスト開始コマンドを実行し(S75(図8のS14))、テスト対象プロセスPUTとドライバDRVとロギングプログラムLGに再現テスト開始を通知する(S76)。
これに応答して、ドライバDRVは、カウンタのカウント値を初期化(ゼロに初期化)し(S77)、動作モードを「再現テスト」に設定する(S78)。また、ロギングプログラムLGも、動作モードを「再現テスト」に設定する(S79)。そして、テスト対象プロセスPUTが再現テスト動作を開始し(S80)、それから呼び出されるときにドライバDRVが再現テストの処理を実行し(S81)、ロギングプログラムLGがテストの処理を実行する(S40)。ロギングプログラムの処理は、図12に示した処理S40と同じである。
図15は、ドライバDRVでの再現テストの処理S80のフローチャート図である。ドライバは、初回テストと同様に、ネットワークアクセスの呼び出しに応答して以下の処理を行う(S91のYES)。また、動作モードが「再現テスト」に設定されている場合に以下の処理を行う(S92のYES)。
まず、ドライバは、ネットワークアクセスの呼び出しの引数から、呼び出し元プロセスのプロセスIDを取得し(S93)、そのプロセスIDがプロセステーブル内にあるか否かチェックする(S94)。取得したプロセスIDがプロセステーブル内にない場合は(S94のNO)、通常のネットワークアクセスを実行する(S102)。取得したプロセスIDがプロセステーブル内にある場合(S94のYES)、エラー応答を再現するか否かのチェックを実行する(S95)。エラー応答を再現するか否かのチェックは、ネットワークアクセスの種類(セッション確立、同解放、送信、受信)に応じて異なるので、別の図で説明する。
図16は、ネットワークアクセスの種類が送信の場合のエラー応答の再現か否かのチェックのフローチャート図である。ドライバは、呼び出されたネットワークアクセスの種類に対応するドライバ内の送信カウント値に+1加算した値が、エラー再現条件テーブル内の同じ種類に対応するカウント値と一致するか否かチェックする(S110)。例えば、送信カウント値に+1加算した値が「04」の場合は、図14のエラー再現条件テーブル51内の送信に対応するカウント値「32」「33」のいずれとも一致しないので、チェックルーチンの戻り値(復帰値)を「正常」に設定する(S113)。一方、送信カウント値に+1加算した値が「32」または「33」の場合は一致するので(S111のYES)、電文がエラー発生条件の送信カウンタが一致した電文と一致するか否かチェックし、一致すれば(S111のYES)、戻り値(復帰値)を「エラー応答要」に設定する(S112)。送信カウント値が一致したが電文が不一致であれば(S111のNO)、戻り値(復帰値)を「正常」に設定する(S113)。そして、戻り値(復帰値)とともにドライバプログラムDRVにリターンする。
送信カウント値を+1するのは、図15に示されるとおり、現在のネットワークアクセスについて送信カウント値を加算していないからである。
図17は、ネットワークアクセスの種類が受信の場合のエラー応答の再現か否かのチェックのフローチャート図である。ネットワークアクセスが受信の場合は、電文は受信が正常に完了した時点で判明するので、初回テストのロギングルーチンでは直前の受信の電文がログファイルに記録されている。
そこで、図17での再現テストでは、受信カウント値が一致し(S120のYES)且つ直前の受信の電文が一致する場合(S121のYES)に、戻り値(復帰値)を「エラー応答要」に設定し(S122)、いずれかが不一致の場合は、戻り値(復帰値)を「正常」に設定する(S123)。
図18は、ネットワークアクセスの種類がセッションの確立または解放の場合のエラー応答の再現か否かのチェックのフローチャート図である。ネットワークアクセスがセッションの確立または解放の場合は、確立または解放に対応する電文はない。したがって、確立または解放のカウンタ値が一致するだけでのエラー再現精度の低下を抑制するために、確立または解放の直前の受信(または送信)の電文が一致する場合に、エラー再現を行うようにするのが望ましい。但し、確立または解放のカウンタ値の一致だけでエラー再現を判定してもよい。
そこで、図17での再現テストでは、初回テストのロギングルーチンで直前の受信の電文がログファイルに記録されている場合は、確立または解放カウンタ値が一致し(S130のYES)且つ直前の受信の電文が一致する場合(S131のYES)に、戻り値(復帰値)を「エラー応答要」に設定し(S132)、いずれかが不一致の場合は、戻り値(復帰値)を「正常」に設定する(S133)。
図15に戻り、ドライバは、エラー応答の再現か否かのチェックルーチンS95の戻り値(復帰値)が「エラー応答要」の場合(S96のYES)、呼び出されたネットワークアクセスを実行せず、強制的にドライバの戻り値(復帰値)を「エラー応答」に設定する。これにより、ドライバが呼び出し元のプロセスにリターンする際、戻り値(復帰値)が「エラー応答」になり、強制的にエラー応答が再現される。
また、チェックルーチンS95の戻り値(復帰値)が「エラー応答要」でない場合、すなわち戻り値(復帰値)が「正常」の場合(S96のNO)、コールされたネットワークアクセスを実行し(S103)、エラー(異常)が発生すると(S104のYES)、ドライバはテスト対象プロセスに復帰せずに、コールされたネットワークアクセスをリトライする(S103)。このネットワークアクセスについてエラー(異常)が発生した場合は、リトライ回数が所定回数(例えば3回)に達するまで繰り返すことが好ましい。チェックルーチンS95の戻り値(復帰値)が「正常」の場合は、ネットワークアクセスがエラー応答を再現するタイミングでないアクセスであるので、通常のアクセスのようにエラー応答せず、ドライバがリトライを実行する。これにより、カウンタ値が+1されることはなく、初回テストでのログに残したカウンタ値と、再現テストでログに残すカウンタ値とが同じ再現すべきタイミングで一致する可能性を高めることができる。
その後、ドライバは、今回の呼び出しの内容(コマンドコードと電文(直前の受信の電文))を、「前回呼び出し内容」レジスタに保存し(S98)、リトライでなければ(S99のNO)、ネットワークアクセスの種類に対応するカウンタ値を+1し(S100)、戻り値(復帰値)と共に呼び出し元のプロセスにリターンする。このリトライでなければカウンタ値を+1する処理は、図11の初回テストでの工程S55,S56と同じである。よって、注目しているプロセスIDの注目しているネットワークアクセスでのカウンタ値は、初回テストでログに記憶したカウンタ値と再現テスト中にカウントしているカウンタ値とは一致する確率が高くなる。
再現テストでのロギングプログラムLGでの処理S40は、図12の初回テストでの処理S40と同様である。
以上の通り、本実施の形態では、初回テスト時に発生したエラー応答を、再現テスト時に高い精度で再現することができる。それにより、初回テスト時に問題視された現象(例えばメインメモリの空き領域の不足)の原因と推測したエラー応答を再現テストで確実に再現することができるので、再現テストでも問題視された現象が繰り返されれば、推測したエラー応答が問題の現象の原因であると確証することができる。
本実施の形態におけるネットワークアクセスは、情報処理装置が実行するテスト対象プロセスが、ネットワークインターフェースを介してネットワーク経由でいずれかにアクセスする処理を含む。例えば、情報処理装置にIOバスを介して接続されたストレージ装置へのアクセスや、イントラネットやインターネットを介してアクセス可能なストレージ装置や他のサイトへのアクセスなどが含まれる。
以上の実施の形態をまとめると,次の付記のとおりである。
(付記1)
プロセスによるネットワークアクセスについて、前記のプロセスの実行開始からの累積アクセス数を計測し、
前記ネットワークアクセスのエラーの検知に応じて、前記検知時点の累積アクセス数を含むログを記憶部に記憶し、
前記プロセスが新たに実行された際に、前記プロセスによるネットワークアクセスを検知した際の前記プロセスの新たな実行開始からの累積アクセス数が、前記ログに含まれる累積アクセス数と一致する場合、前記プロセスに対してダミーのエラー応答を行う、
処理をコンピュータに実行させるエラー再現プログラム。
(付記2)
前記ダミーのエラー応答を行うことは、前記ネットワークアセスを実行しないことを含む、付記1に記載のエラー再現プログラム。
(付記3)
前記ログを記憶部に記憶することは、前記ネットワークアクセスの内容も記憶することを含む、付記1に記載のエラー再現プログラム。
(付記4)
前記ネットワークアクセスの内容は、前記ネットワークアクセスの種類に加えて、前記ネットワークアクセスが送信の場合の送信電文、受信の場合の直前に受信した電文のいずれかを含む、付記3に記載のエラー再現プログラム。
(付記5)
前記累積アクセス数を計測することは、前記ネットワークアクセスのリトライは前記累積アクセス数として計測しないことを含む、付記1に記載にエラー再現プログラム。
(付記6)
さらに、
前記プロセスを新たに実行する前に、前記記憶部に記憶したログのうち、所望のログを抽出してエラー再現条件ログを生成し、
前記ダミーのエラー応答を行うことが、前記新たな実行開始からの累積アクセス数が、前記エラー再現条件ログに含まれる累積アクセス数と一致するか否か判定することを含む、付記1に記載のエラー再現プログラム。
(付記7)
前記プロセスを新たに実行する場合、前記プロセスによるネットワークアクセスの前記累積アクセス数が前記ログに含まれる累積アクセス数と不一致の場合、前記ネットワークアクセスを実行し、エラーが発生した場合累積アクセス数をカウントアップせずにリトライを実行する、付記1に記載のエラー再現プログラム。
(付記8)
さらに、
前記プロセスにより依頼された前記ネットワークアクセスを実行し、
前記ネットワークアクセスのエラーが発生した場合、エラー応答で前記ネットワークアクセスを終了し、
前記ネットワークアクセスが正常に完了した場合、正常応答で前記ネットワークアクセスを終了する、
処理をコンピュータに実行させる、付記1に記載のエラー再現プログラム。
(付記9)
プロセスによるネットワークアクセスについて、前記のプロセスの実行開始からの累積アクセス数を計測し、
前記ネットワークアクセスのエラーの検知に応じて、前記検知時点の累積アクセス数を含むログを記憶部に記憶し、
前記プロセスが新たに実行された際に、前記プロセスによるネットワークアクセスを検知した際の前記プロセスの新たな実行開始からの累積アクセス数が、前記ログに含まれる累積アクセス数と一致する場合、前記プロセスに対してダミーのエラー応答を行う、
処理を有するエラー再現方法。
(付記10)
プロセスによるネットワークアクセスについて、前記のプロセスの実行開始からの累積アクセス数を計測する手段と、
前記ネットワークアクセスのエラーの検知に応じて、前記検知時点の累積アクセス数を含むログを記憶部に記憶する手段と、
前記プロセスが新たに実行された際に、前記プロセスによるネットワークアクセスを検知した際の前記プロセスの新たな実行開始からの累積アクセス数が、前記ログに含まれる累積アクセス数と一致する場合、前記プロセスに対してダミーのエラー応答を行う手段とを有する、エラー再現装置。