(57)【要約】【課題】試験によって検知した異常の原因箇所の特定を効率的に行うことを可能とする試験装置、試験方法及び試験プログラムを提供する。【解決手段】複数の計算機資源がそれぞれ実行する特定の処理の各ソースコードにおける所定の位置に、特定の命令を追加して追加済ソースコードを生成し、追加済ソースコードを特定の命令の位置において区分けした複数のコードブロックのうち、複数の計算機資源が書き込みを行う記憶装置に対するデータの書き込み命令を含む特定のコードブロックを特定し、特定の処理の実行中において、特定の命令のうち、特定のコードブロックの最後に位置する特定の命令が実行されたことに応じて、特定の命令を実行した計算機資源に処理の停止を指示し、処理の停止を指示された特定の処理において、所定の異常の発生を検知した場合、停止指示部による処理の停止が行われた際に実行された特定の命令を含む特定のコードブロックを特定する。【選択図】図１５
2018165903.tif 000002
【特許請求の範囲】
【請求項１】
１または複数のコンピュータにより提供される複数の計算機資源が連動して行う特定の処理の試験を行う試験装置であって、
前記複数の計算機資源がそれぞれ実行する前記特定の処理の各ソースコードにおける所定の位置に、特定の命令を追加して追加済ソースコードを生成する命令追加部と、
前記追加済ソースコードを前記特定の命令の位置において区分けした複数のコードブロックのうち、前記複数の計算機資源が書き込みを行う記憶装置に対するデータの書き込み命令を含む特定のコードブロックを特定する第１コード特定部と、
前記特定の処理の実行中において、前記特定の命令のうち、前記特定のコードブロックの最後に位置する前記特定の命令が実行されたことに応じて、前記特定の命令を実行した計算機資源に対して処理の停止を指示する停止指示部と、
前記処理の停止の指示に伴って、前記複数の計算機資源において発生した所定の異常を検知する異常検知部と、
前記所定の異常の発生を検知した場合、前記処理の停止が行われた際に実行された前記特定の命令を含む前記特定のコードブロックを特定する第２コード特定部と、を有する、
ことを特徴とする試験装置。
【請求項２】
請求項１において、
前記停止指示部は、前記特定の処理の実行が行われる毎に、前記特定のコードブロックに含まれる前記特定の命令のうちのそれぞれ異なる前記特定の命令が実行されたことに応じて、前記特定の命令を実行した計算機資源に対して処理の停止を指示し、
前記第２コード特定部は、前記停止指示部が前記所定の異常を検知する毎に、前記特定のコードブロックの特定を行う、
ことを特徴とする試験装置。
【請求項３】
請求項１において、さらに、
前記追加済ソースコードにおいて、前記第２コード特定部が特定した前記特定のコードブロックの直前に位置する特定のコードブロックの直後に位置するコードブロックから、前記第２コード特定部が特定した前記特定のコードブロックまでの間に位置するコードブロックを特定する第３コード特定部を有する、
ことを特徴とする試験装置。
【請求項４】
請求項１において、さらに、
前記特定の処理の実行の前に行われる事前処理であって前記停止指示部による処理の停止を行わない前記特定の処理の実行中に、前記複数の計算機資源のいずれかにおいて、前記特定の命令が実行された第１時刻と、前記データの書き込み命令が実行された第２時刻とを特定する時刻特定部と、を有し、
前記第１コード特定部は、前記時刻特定部が特定した前記第１時刻と前記第２時刻とに基づいて、前記特定のコードブロックを特定する、
ことを特徴とする試験装置。
【請求項５】
請求項４において、
前記第１コード特定部は、
前記第１時刻のうち、前記第２時刻の直前の時刻と直後の時刻とを特定し、 
前記複数のコードブロックのうち、前記直前の時刻に対応する前記特定の命令と、前記直後の時刻に対応する前記特定の命令との間に位置するコードブロックを、前記特定のコードブロックとして特定する、
ことを特徴とする試験装置。
【請求項６】
請求項１において、
前記特定の命令は、各計算機資源が次に実行する処理の指示を要求する命令である、
ことを特徴とする試験装置。
【請求項７】
１または複数のコンピュータにより提供される複数の計算機資源が連動して行う特定の処理の試験を行う試験方法であって、
前記複数の計算機資源がそれぞれ実行する前記特定の処理の各ソースコードにおける所定の位置に、特定の命令を追加して追加済ソースコードを生成し、
前記追加済ソースコードを前記特定の命令の位置において区分けした複数のコードブロックのうち、前記複数の計算機資源が書き込みを行う記憶装置に対するデータの書き込み命令を含む特定のコードブロックを特定し、
前記特定の処理の実行中において、前記特定の命令のうち、前記特定のコードブロックの最後に位置する前記特定の命令が実行されたことに応じて、前記特定の命令を実行した計算機資源に対して処理の停止を指示し、
前記処理の停止の指示に伴って、前記複数の計算機資源において発生した所定の異常を検知し、
前記所定の異常の発生を検知した場合、前記処理の停止が行われた際に実行された前記特定の命令を含む前記特定のコードブロックを特定する、
ことを特徴とする試験方法。
【請求項８】
１または複数のコンピュータにより提供される複数の計算機資源が連動して行う特定の処理の試験を行う処理をコンピュータに実行させる試験プログラムであって、
前記複数の計算機資源がそれぞれ実行する前記特定の処理の各ソースコードにおける所定の位置に、特定の命令を追加して追加済ソースコードを生成し、
前記追加済ソースコードを前記特定の命令の位置において区分けした複数のコードブロックのうち、前記複数の計算機資源が書き込みを行う記憶装置に対するデータの書き込み命令を含む特定のコードブロックを特定し、
前記特定の処理の実行中において、前記特定の命令のうち、前記特定のコードブロックの最後に位置する前記特定の命令が実行されたことに応じて、前記特定の命令を実行した計算機資源に対して処理の停止を指示し、
前記処理の停止の指示に伴って、前記複数の計算機資源において発生した所定の異常を検知し、
前記所定の異常の発生を検知した場合、前記処理の停止が行われた際に実行された前記特定の命令を含む前記特定のコードブロックを特定する、
処理をコンピュータに実行させることを特徴とする試験プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、試験装置、試験方法及び試験プログラムに関する。
【背景技術】
【０００２】
例えば、利用者にサービスを提供する事業者（以下、単に事業者とも呼ぶ）は、サービスの提供を行うための業務システム（以下、情報処理システムとも呼ぶ）を構築して稼働させる。そして、事業者は、例えば、業務システムを構成するプログラムを生成した場合、生成したプログラムの動作について各種テストを行う。
【０００３】
具体的に、事業者は、業務システムが１または複数のコンピュータにより提供される複数の計算機資源（例えば、物理マシン上に生成された複数の仮想マシン）によって構成されている場合、例えば、複数の計算機資源が互いに連動して行う処理についての試験を行う。これにより、事業者は、利用者に対するサービスの提供の開始後において、サービスの提供に影響を与える障害の発生を抑制することが可能になる（例えば、特許文献１参照）。
【先行技術文献】
【特許文献】
【０００４】
【特許文献１】特開２００６−０９９７５５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００５】
例えば、障害等の発生によって中断（シャットダウン）した計算機資源が発生した場合、上記のような業務システムでは、中断した計算機資源が実行していた処理を他の計算機資源に引き継ぐ。そのため、事業者は、上記のような業務システムについての試験を行う場合、例えば、中断した計算機資源が発生した場合の試験についても行う。そして、例えば、中断した計算機資源が発生した場合の試験を行うことによって異常を検知した場合、事業者は、複数の計算機資源で動作する各ソースコードから、検知した異常の原因箇所の特定を行う。
【０００６】
しかしながら、検知した異常の原因となった可能性がある箇所が多い場合、事業者は、検知した異常の原因箇所の特定が困難になる。そのため、事業者は、この場合、業務システムの試験を効率的に行うことができない。
【０００７】
そこで、一つの側面では、試験によって検知した異常の原因箇所の特定を効率的に行うことを可能とする試験装置、試験方法及び試験プログラムを提供することを目的とする。
【課題を解決するための手段】
【０００８】
実施の形態の一つの態様によれば、１または複数のコンピュータにより提供される複数の計算機資源が連動して行う特定の処理の試験を行う試験装置は、前記複数の計算機資源がそれぞれ実行する前記特定の処理の各ソースコードにおける所定の位置に、特定の命令を追加して追加済ソースコードを生成する命令追加部と、前記追加済ソースコードを前記特定の命令の位置において区分けした複数のコードブロックのうち、前記複数の計算機資源が書き込みを行う記憶装置に対するデータの書き込み命令を含む特定のコードブロックを特定する第１コード特定部と、前記特定の処理の実行中において、前記特定の命令のうち、前記特定のコードブロックの最後に位置する前記特定の命令が実行されたことに応じて、前記特定の命令を実行した計算機資源に対して処理の停止を指示する停止指示部と、前記処理の停止の指示に伴って、前記複数の計算機資源において発生した所定の異常を検知する異常検知部と、前記所定の異常の発生を検知した場合、前記処理の停止が行われた際に実行された前記特定の命令を含む前記特定のコードブロックを特定する第２コード特定部と、を有する。
【発明の効果】
【０００９】
一つの側面によれば、試験によって検知した異常の原因箇所の特定を効率的に行うことを可能とする。
【図面の簡単な説明】
【００１０】
【図１】図１は、情報処理システム１０の全体構成を示す図である。
【図２】図２は、各仮想マシン３の動作の具体例について説明する図である。
【図３】図３は、各仮想マシン３の動作の具体例について説明する図である。
【図４】図４は、試験装置１のハードウエア構成を説明する図である。
【図５】図５は、情報処理装置２のハードウエア構成を説明する図である。
【図６】図６は、試験装置１の機能ブロック図である。
【図７】図７は、情報処理装置２の機能ブロック図である。
【図８】図８は、第１の実施の形態における試験処理の概略を説明するフローチャートである。
【図９】図９は、第１の実施の形態における試験処理の概略を説明するフローチャートである。
【図１０】図１０は、ソースコード２３１の具体例を説明する図である。
【図１１】図１１は、追加済ソースコード２３２の具体例を説明する図である。
【図１２】図１２は、コードブロックの具体例を説明する図である。
【図１３】図１３は、第１の実施の形態における試験処理の概略を説明する図である。
【図１４】図１４は、第１の実施の形態における試験処理の概略を説明する図である。
【図１５】図１５は、第１の実施の形態における試験処理の概略を説明する図である。
【図１６】図１６は、第１の実施の形態における試験処理の詳細を説明するフローチャートである。
【図１７】図１７は、第１の実施の形態における試験処理の詳細を説明するフローチャートである。
【図１８】図１８は、第１の実施の形態における試験処理の詳細を説明するフローチャートである。
【図１９】図１９は、第１の実施の形態における試験処理の詳細を説明するフローチャートである。
【図２０】図２０は、第１の実施の形態における試験処理の詳細を説明するフローチャートである。
【図２１】図２１は、第１の実施の形態における試験処理の詳細を説明するフローチャートである。
【図２２】図２２は、第１の実施の形態における試験処理の詳細を説明するフローチャートである。
【図２３】図２３は、第１時刻情報１３１の具体例を説明する図である。
【図２４】図２４は、第２時刻情報１３２の具体例を説明する図である。
【図２５】図２５は、特定コード情報１３３の具体例を説明する図である。
【図２６】図２６は、検証結果情報１３４の具体例を説明する図である。
【図２７】図２７は、検証結果情報１３４の具体例を説明する図である。
【図２８】図２８は、検証結果情報１３４の具体例を説明する図である。
【発明を実施するための形態】
【００１１】
［情報処理システムの構成］
図１は、情報処理システム１０の全体構成を示す図である。図１に示す情報処理システム１０は、試験装置１と、情報処理装置２とを有する。
【００１２】
情報処理装置２は、例えば、複数の物理マシンから構成される。各物理マシンは、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｃｏｍｐｕｔｉｎｇ  Ｕｎｉｔ）と、メモリ（ＤＲＡＭ：Ｄｙｎａｍｉｃ  Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）と、ハードディスク（ＨＤＤ：Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）等とを有する。そして、各物理マシンの物理リソースは、利用者に対してサービスの提供を行う各仮想マシン３に割当てられる。
【００１３】
試験装置１は、例えば、１台以上の物理マシンによって構成される。そして、試験装置１は、情報処理装置２上に生成された仮想マシン３の動作についての試験を行う。なお、試験装置１は、仮想マシン３によって構成されるものであってもよい。
【００１４】
仮想化ソフトウエア４は、仮想マシン３の管理を行う管理装置（図示しない）からの指示に応じて、情報処理装置２のＣＰＵ、メモリ及びハードディスク等を割当てることにより、仮想マシン３を動作させる基盤ソフトウエアである。仮想化ソフトウエア４は、例えば、情報処理装置２上で動作する。
【００１５】
［各仮想マシン３の動作の具体例］
次に、各仮想マシン３の動作の具体例について説明を行う。図２及び図３は、各仮想マシン３の動作の具体例について説明する図である。
【００１６】
図２及び図３に示す例において、仮想マシン群ＭＧ１に含まれる仮想マシン３１と、仮想マシン群ＭＧ２に含まれる仮想マシン３２と、仮想マシン群ＭＧ３に含まれる仮想マシン３３、３４及び３５と、仮想マシン群ＭＧ４に含まれる仮想マシン３６とは、互いに連動して試験対象処理（以下、特定の処理とも呼ぶ）を行う。以下、仮想マシン３１、３２、３３、３４、３５及び３６を総称して仮想マシン３とも呼ぶ。
【００１７】
また、図２及び図３に示す例において、同じ仮想マシン群に含まれる仮想マシン３は、それぞれ同一の処理を行う仮想マシンである。そのため、各仮想マシン３は、例えば、同じ仮想マシン群に含まれる他の仮想マシンが障害等の発生に伴って中断した場合、中断した仮想マシンが行っていた処理を引き継いで実行することが可能である。具体的に、各仮想マシン３の管理装置（図示しない）は、例えば、中断した仮想マシン３が発生したことを検知した場合、中断した仮想マシン３と同じ仮想マシン群に含まれる他の仮想マシンに、中断した仮想マシン３が行っていた処理を実行させる。
【００１８】
さらに、図２及び図３に示す例における試験装置１は、仮想マシン３に対して無作為に中断（シャットダウン）を指示する。
【００１９】
具体的に、仮想マシン３１は、図２に示すように、例えば、試験装置１から指示を受けたクライアント端末（図示しない）からデータを受信した場合、受信したデータに基づく処理を開始する（図２の（１））。そして、仮想マシン３２は、例えば、処理を開始した仮想マシン３１からデータを受信した場合、受信したデータに基づく処理を開始する（図２の（２））。同様に、仮想マシン３３は、例えば、処理を開始した仮想マシン３２からデータを受信した場合、受信したデータに基づく処理を開始する。
【００２０】
その後、試験装置１は、例えば、仮想マシン３３が処理を実行している間に、仮想マシン３３に対して中断指示を送信する（図２の（３））。そして、仮想マシン３３は、試験装置１から送信された中断指示の受信に応じて、仮想マシン３３自体を中断する（図２の（４））。
【００２１】
続いて、仮想マシン３４は、仮想マシン３３が実行していた処理を引き継いで実行を開始し、例えば、データベースＤＢ１に対してデータの書き込み指示の送信を行う（図２の（５）及び（６））。そして、データベースＤＢ１は、仮想マシン３４から受信した書き込み指示の内容に応じたデータの書き込みを行う（図２の（７））。
【００２２】
さらに、試験装置１は、図３に示すように、例えば、仮想マシン３４が処理を実行している間に、仮想マシン３４に対して中断指示を送信する（図３の（８））。そして、仮想マシン３４は、試験装置１から送信された中断指示の受信に応じて、仮想マシン３４自体を中断する（図３の（９））。
【００２３】
続いて、仮想マシン３５は、仮想マシン３４が実行していた処理を引き継いで実行を開始し、例えば、データベースＤＢ１に対してデータの書き込み指示の送信を行う（図３の（１０）及び（１１））。そして、データベースＤＢ１は、仮想マシン３５から受信した書き込み指示の内容に応じたデータの書き込みを行う（図３の（１２））。
【００２４】
その後、仮想マシン３１は、例えば、クライアント端末から受信したデータに基づく処理の実行に伴って、仮想マシン３６に対して処理要求を送信する（図３の（１３））。そして、仮想マシン３６は、仮想マシン３１から送信された処理要求を受信したことに応じて、受信した処理要求の内容に従い、データベースＤＢ１に記憶されたデータに対する読み込みを行う（図３の（１４））。
【００２５】
ここで、図２及び図３に示す例において、仮想マシン３４及び仮想マシン３５は、データベースＤＢ１に対する書き込みをそれぞれ行っている。そのため、例えば、仮想マシン３４及び仮想マシン３５によってそれぞれ行われた書き込みが、仮想マシン３４における中断の発生に伴って重複して行われた処理であった場合、データベースＤＢ１では、データの不整合等の異常が発生する。したがって、データベースＤＢ１に記憶されたデータの読み込みを行った仮想マシン３６は、例えば、データベースＤＢ１において異常が発生していることを検知し、試験対象処理の実行に伴って異常が発生している旨の通知を試験装置１に送信する（図３の（１５））。
【００２６】
このように、試験装置１は、例えば、試験対象処理を実行している仮想マシン３を中断することによって、仮想マシン３に内在する異常を検知することが可能になる。
【００２７】
しかしながら、検知した異常の原因となった可能性がある箇所が多い場合、検知した異常の原因箇所を特定するための調査範囲は膨大になる。具体的に、図２等で説明した例では、仮想マシン３６が異常の発生を検知するまでに、仮想マシン３１、３２、３３、３４、３５及び３６のそれぞれが試験対象処理を実行している。そのため、事業者は、この場合、例えば、仮想マシン３１、３２、３３、３４、３５及び３６のそれぞれで動作するソースコードに対して、検知した異常の原因箇所を特定するための調査を行う必要がある。したがって、事業者は、この場合、業務システムの試験を効率的に行うことができない。
【００２８】
そこで、本実施の形態における試験装置１は、複数の仮想マシン３がそれぞれ実行する試験対象処理の各ソースコードにおける所定の位置に、特定の命令を追加して追加済ソースコードを生成する。特定の命令は、例えば、各仮想マシン３が次に実行する処理の指示を要求する命令である。そして、試験装置１は、生成した追加済ソースコードを特定の命令の位置において区分けした複数のコードブロックのうち、複数の仮想マシン３が書き込みを行う記憶装置に対するデータの書き込み命令を含むコードブロック（以下、特定のコードブロックとも呼ぶ）を特定する。
【００２９】
その後、試験装置１は、試験対象処理の実行中において、各仮想マシン３において実行される追加済ソースコードに含まれる特定の命令のうち、特定のコードブロックの最後に位置する特定の命令が実行されたことに応じて、特定の命令を実行した仮想マシン３に対して処理の停止を指示する。そして、試験装置１は、試験対象処理（途中で処理が停止された試験対象処理）において所定の異常を検知した場合、処理の停止が行われた際に実行された特定の命令を含む特定のコードブロックを特定する。所定の異常は、例えば、記憶装置に対する同一データの二重書き込みの発生である。
【００３０】
すなわち、本実施の形態における試験装置１は、図２等で説明したように、試験対象処理の実行中において異常が検知された場合、試験対象処理において書き込み処理が行われていた箇所を、検知された異常の原因となった可能性が高い箇所として特定する。そして、試験装置１は、仮想マシン３において試験対象処理が再度実行された場合、書き込み処理が行われた直後において処理を停止し、処理が停止されるまでの試験対象処理の実行によって異常が発生しているか否かの判定を行う。その結果、異常が発生していた場合、試験装置１は、特定された書き込み処理が行われていた箇所を、検知した異常の原因となった可能性が極めて高い箇所として特定する。
【００３１】
これにより、事業者は、試験対象処理の実行によって検知した異常の原因箇所の特定を効率的に行うことが可能になる。そのため、事業者は、試験対象処理の試験を効率的に行うことが可能になる。
【００３２】
［情報処理システムのハードウエア構成］
次に、情報処理システム１０のハードウエア構成について説明する。図４は、試験装置１のハードウエア構成を説明する図である。また、図５は、情報処理装置２のハードウエア構成を説明する図である。
【００３３】
試験装置１は、図４に示すように、プロセッサであるＣＰＵ１０１と、メモリ１０２と、外部インターフェース（Ｉ／Ｏユニット）１０３と、記憶媒体（ストレージ）１０４とを有する。各部は、バス１０５を介して互いに接続される。
【００３４】
記憶媒体１０４は、記憶媒体１０４内のプログラム格納領域（図示しない）に、各仮想マシン３が実行する試験対象処理の試験を行う処理（以下、試験処理とも呼ぶ）を行うためのプログラム１１０を記憶する。
【００３５】
ＣＰＵ１０１は、図４に示すように、プログラム１１０の実行時に、プログラム１１０を記憶媒体１０４からメモリ１０２にロードし、プログラム１１０と協働して試験処理を行う。
【００３６】
記憶媒体１０４は、例えば、試験処理を行う際に用いられる情報を記憶する情報格納領域１３０（以下、記憶部１３０とも呼ぶ）を有する。また、外部インターフェース１０３は、情報処理装置２と通信を行う。
【００３７】
また、情報処理装置２は、図５に示すように、プロセッサであるＣＰＵ２０１と、メモリ２０２と、外部インターフェース（Ｉ／Ｏユニット）２０３と、記憶媒体（ストレージ）２０４とを有する。各部は、バス２０５を介して互いに接続される。
【００３８】
記憶媒体２０４は、記憶媒体２０４内のプログラム格納領域（図示しない）に、試験処理を行うためのプログラム２１０を記憶する。
【００３９】
ＣＰＵ２０１は、図５に示すように、プログラム２１０の実行時に、プログラム２１０を記憶媒体２０４からメモリ２０２にロードし、プログラム２１０と協働して試験処理を行う。
【００４０】
記憶媒体２０４は、例えば、試験処理を行う際に用いられる情報を記憶する情報格納領域２３０（以下、記憶部２３０とも呼ぶ）を有する。また、外部インターフェース２０３は、試験装置１と通信を行う。
【００４１】
［情報処理システムのソフトウエア構成］
次に、情報処理システム１０のソフトウエア構成について説明する。図６は、試験装置１の機能ブロック図である。また、図７は、情報処理装置２の機能ブロック図である。
【００４２】
ＣＰＵ１０１は、図６に示すように、プログラム１１０と協働することにより、命令追加部１１１と、情報受信部１１２と、第１コード特定部１１３と、停止指示部１１４として動作する。また、ＣＰＵ１０１は、図６に示すように、プログラム１１０と協働することにより、異常検知部１１５と、第２コード特定部１１６と、第３コード特定部１１７と、情報出力部１１８と、時刻特定部１１９として動作する。さらに、情報格納領域１３０には、図６に示すように、第１時刻情報１３１と、第２時刻情報１３２と、特定コード情報１３３と、検証結果情報１３４とが記憶される。
【００４３】
そして、ＣＰＵ２０１は、図７に示すように、プログラム２１０と協働することにより、各仮想マシン３の機能として、情報送信部２１１と、情報受信部２１２と、処理実行部２１３として動作する。また、情報格納領域２３０には、図７に示すように、ソースコード２３１と、追加済ソースコード２３２とが記憶される。
【００４４】
初めに、試験装置１の機能について説明を行う。試験装置１の機能である命令追加部１１１は、各仮想マシン３のそれぞれが実行する試験対象処理の各ソースコード２３１における所定の位置に、試験装置１に指示を要求する特定の命令を追加して追加済ソースコード２３２を生成する。所定の位置は、各ソースコード２３１において、例えば、サブルーチン呼び出し命令の前後や空白行が複数行続く位置であってよい。具体的に、命令追加部１１１は、例えば、情報処理装置２の情報格納領域２３０に記憶されたソースコード２３１を取得し、追加済ソースコード２３２の生成を行う。そして、命令追加部１１１は、例えば、生成した追加済ソースコード２３２を情報格納領域２３０に記憶する。
【００４５】
試験装置１の機能である情報受信部１１２は、各仮想マシン３による試験対象処理の実行に伴って、特定の命令が実行されたことを示す通知を各仮想マシン３から受信する。
【００４６】
試験装置１の機能である第１コード特定部１１３は、命令追加部１１１が生成した追加済ソースコード２３２を特定の命令の位置において区分けした複数のコードブロックのうち、各仮想マシン３が書き込みを行う記憶装置（図示しない）に対するデータの書き込み命令（以下、単に書き込み命令とも呼ぶ）を含む特定のコードブロックを特定する。そして、第１コード特定部１１３は、例えば、特定のコードブロックを示す情報を特定コード情報１３３として情報格納領域１３０に記憶する。
【００４７】
試験装置１の機能である停止指示部１１４は、各仮想マシン３における試験対象処理の実行中において、各追加済ソースコード２３２のいずれかに含まれる特定の命令のうち、第１コード特定部１１３が特定した特定のコードブロックに含まれる特定の命令が実行されたことに応じて、特定の命令を実行した仮想マシン３に対して処理の停止を指示する。具体的に、停止指示部１１４は、例えば、特定の命令を実行した仮想マシン３に対して、仮想マシン３の中断（シャットダウン）や実行中の処理の停止を指示する。
【００４８】
なお、各仮想マシン３において試験対象処理の実行が繰り返し行われる場合、停止指示部１１４は、各仮想マシン３において試験対象処理の実行が行われる毎に、第１コード特定部１１３が特定した特定のコードブロックに含まれる特定の命令のうちのそれぞれ異なる特定の命令が実行されたことに応じて、特定の命令を実行した仮想マシン３に対して処理の停止を指示する。
【００４９】
試験装置１の機能である異常検知部１１５は、停止指示部１１４による処理の停止の指示に伴って、各仮想マシン３において発生した異常を検知する。すなわち、異常検知部１１５は、停止指示部１１４による処理の停止の指示に伴って、各仮想マシン３において異常が発生したか否かの判定を行う。
【００５０】
試験装置１の機能である第２コード特定部１１６は、異常検知部１１５が異常を検知した場合、第１コード特定部１１３が特定した特定のコードブロックのうち、停止指示部１１４による処理の停止が行われた際に実行された特定の命令を含む特定のコードブロックを特定する。
【００５１】
試験装置１の機能である第３コード特定部１１７は、命令追加部１１１が生成した追加済ソースコード２３２において、第２コード特定部１１６が特定した特定のコードブロックの直前に位置する特定のコードブロックの直後に位置するコードブロックから、第２コード特定部１１６が特定した特定のコードブロックまでの間に位置するコードブロックを特定する。
【００５２】
試験装置１の機能である情報出力部１１８は、第３コード特定部１１７が特定したコードブロックを出力する。具体的に、情報出力部１１８は、例えば、事業者（試験担当者）が操作する操作端末（図示しない）に対して、第３コード特定部１１７が特定したコードブロックの出力を行う。
【００５３】
試験装置１の機能である時刻特定部１１９は、試験対象処理の実行の前に行われる事前処理であって、停止指示部１１４による処理の停止を行わない試験対象処理（以下、単に事前処理とも呼ぶ）の実行中に、各仮想マシン３において特定の命令が実行された時刻（以下、第１時刻とも呼ぶ）を特定する。また、時刻特定部１１９は、事前処理の実行中に、各仮想マシン３において書き込み命令が実行された時刻（以下、第２時刻とも呼ぶ）を特定する。そして、第１コード特定部１１３は、この場合、第１時刻と第２時刻とに基づいて、特定のコードブロックの特定を行う。なお、検証結果情報１３４については後述する。
【００５４】
次に、仮想マシン３の機能について説明を行う。仮想マシン３の機能である情報受信部２１２は、例えば、他の仮想マシン３から送信されたデータを受信する。
【００５５】
仮想マシン３の機能である処理実行部２１３は、例えば、情報受信部２１２が他の仮想マシン３から送信されたデータを受信した場合、受信したデータを用いて試験対象処理を実行する。
【００５６】
仮想マシン３の機能である情報送信部２１１は、例えば、他の仮想マシン３に対して、処理実行部２１３における処理の実行によって生成されたデータを送信する。
【００５７】
また、情報送信部２１１は、処理実行部２１３が試験対象処理の実行に伴って特定の命令を実行したことに応じて、次に実行を行う処理の指示要求を試験装置１に対して送信する。
【００５８】
そして、情報受信部２１２は、情報送信部２１１が送信した処理の指示要求に対して試験装置１が送信した処理の指示を受信する。さらに、処理実行部２１３は、この場合、情報受信部２１２が受信した処理の指示に対応する処理を実行する。具体的に、処理実行部２１３は、情報受信部２１２が受信した指示の内容に従って、仮想マシン３の中断または仮想マシン３における処理の再開を実行する。
【００５９】
［第１の実施の形態の概略］
次に、第１の実施の形態の概略について説明する。図８及び図９は、第１の実施の形態における試験処理の概略を説明するフローチャートである。図１０及び図１５は、第１の実施の形態における試験処理の概略を説明する図である。図１０及び図１５を参照しながら、図８及び図９に示す試験処理を説明する。
【００６０】
試験装置１は、図８に示すように、試験開始タイミングになるまで待機する（Ｓ１のＮＯ）。試験開始タイミングは、例えば、試験対象処理に実行に伴って発生した異常の原因箇所の特定を行うために、事業者が試験装置１に対して試験処理の実行を開始する旨の入力を行ったタイミングであってよい。
【００６１】
そして、試験開始タイミングなった場合（Ｓ１のＹＥＳ）、試験装置１は、各仮想マシン３のそれぞれが実行する試験対象処理の各ソースコード２３１における所定の位置に、試験装置１に指示を要求する特定の命令を追加して追加済ソースコード２３２を生成する（Ｓ２）。以下、ソースコード２３１及び追加済ソースコード２３２の具体例について説明を行う。
【００６２】
［ソースコードの具体例］
初めに、ソースコード２３１の具体例について説明を行う。図１０は、ソースコード２３１の具体例を説明する図である。図１０は、図２等で説明した仮想マシン群ＭＧ３に含まれる各仮想マシン３（仮想マシン３３、仮想マシン３４及び仮想マシン３５）において実行されるソースコード２３１の具体例である。なお、以下、「ｗｒｉｔｅ  ｎｅｗ  ｄａｔａ」は、データベースＤＢ１に対する書き込み命令であるものとする。
【００６３】
具体的に、図１０に示すソースコード２３１には、「Ｌｏｇｉｃ＿Ａ」、「Ｌｏｇｉｃ＿Ｂ，ｗｒｉｔｅ  ｎｅｗ  ｄａｔａ」、「Ｌｏｇｉｃ＿Ｃ」、「Ｌｏｇｉｃ＿Ｄ」、「Ｌｏｇｉｃ＿Ｅ，ｗｒｉｔｅ  ｎｅｗ  ｄａｔａ」及び「Ｌｏｇｉｃ＿Ｆ」がそれぞれ記述されている。
【００６４】
［追加済ソースコードの具体例］
次に、追加済ソースコード２３２の具体例について説明を行う。図１１は、追加済ソースコード２３２の具体例を説明する図である。図１１は、図１０で説明したソースコード２３１に対して特定の命令を追加した場合に生成される追加済ソースコード２３２の具体例である。
【００６５】
図１１に示す追加済ソースコード２３２には、図１０で説明したソースコード２３１と比較して、各命令の前後に特定の命令が追加されている。
【００６６】
具体的に、図１１に示す追加済ソースコード２３２には、例えば、「Ｌｏｇｉｃ＿Ａ」の前に、特定の命令である「Ｉｆ（ｌｉｓｔｅｎ＿１）｛Ｅｘｉｔ（１）；｝」が記述されている。また、図１１に示す追加済ソースコード２３２には、例えば、「Ｌｏｇｉｃ＿Ａ」と「Ｌｏｇｉｃ＿Ｂ，ｗｒｉｔｅ  ｎｅｗ  ｄａｔａ」との間に、特定の命令である「Ｉｆ（ｌｉｓｔｅｎ＿２）｛Ｅｘｉｔ（２）；｝」が記述されている。図１１に含まれる他の命令については説明を省略する。
【００６７】
図８に戻り、試験装置１は、Ｓ２の処理で生成した追加済ソースコード２３２を特定の命令の位置において区分けした複数のコードブロックのうち、各仮想マシン３が書き込みを行う記憶装置に対するデータの書き込み命令を含む特定のコードブロックを特定する（Ｓ３）。以下、コードブロックの具体例について説明を行う。
【００６８】
［コードブロックの具体例］
図１２は、コードブロックの具体例を説明する図である。試験装置１は、Ｓ３の処理において、例えば、図１１で説明した追加済ソースコード２３２において特定の命令に囲まれた部分と、特定の命令に囲まれた部分の直後に位置する特定の命令とを、１つのコードブロックとして特定する。
【００６９】
具体的に、試験装置１は、図１２に示すように、「Ｉｆ（ｌｉｓｔｅｎ＿１）｛Ｅｘｉｔ（１）；｝」と「Ｉｆ（ｌｉｓｔｅｎ＿２）｛Ｅｘｉｔ（２）；｝」との間に位置する「Ｌｏｇｉｃ＿Ａ」と、「Ｌｏｇｉｃ＿Ａ」の直後に位置する「Ｉｆ（ｌｉｓｔｅｎ＿２）｛Ｅｘｉｔ（２）；｝」とをコードブロック２３２ａとして特定する。また、試験装置１は、図１２に示すように、「Ｉｆ（ｌｉｓｔｅｎ＿２）｛Ｅｘｉｔ（２）；｝」と「Ｉｆ（ｌｉｓｔｅｎ＿３）｛Ｅｘｉｔ（３）；｝」との間に位置する「Ｌｏｇｉｃ＿Ｂ，ｗｒｉｔｅ  ｎｅｗ  ｄａｔａ」と、「Ｌｏｇｉｃ＿Ｂ，ｗｒｉｔｅ  ｎｅｗ  ｄａｔａ」の直後に位置する「Ｉｆ（ｌｉｓｔｅｎ＿３）｛Ｅｘｉｔ（３）；｝」とをコードブロック２３２ｂとして特定する。図１２に含まれる他の命令については説明を省略する。
【００７０】
なお、図１２に示す追加済ソースコード２３２において、書き込み命令を含むコードブロックは、コードブロック２３２ｂ及びコードブロック２３２ｅである。そのため、試験装置１は、Ｓ３の処理において、例えば、コードブロック２３２ｂ及びコードブロック２３２ｅを特定のコードブロックとして特定する。
【００７１】
図８に戻り、試験装置１は、仮想マシン３のいずれかにおいて、Ｓ３の処理で特定した特定のコードブロックに含まれる特定の命令が実行されるまで待機する（Ｓ４のＮＯ）。
【００７２】
すなわち、試験装置１は、図１３に示すように、各仮想マシン３における試験対象処理の実行に伴って、仮想マシン３のいずれかにおいて特定のコードブロックに含まれる特定の命令が実行されるまで待機する。具体的に、試験装置１は、図１３に示すように、例えば、仮想マシン３３における特定のコードブロック内の特定の命令の実行に伴って、仮想マシン３３から特定の命令が実行された旨の通知を受信するまで待機する。
【００７３】
そして、Ｓ３の処理で特定した特定のコードブロックの最後に位置する特定の命令が実行された場合（Ｓ４のＹＥＳ）、試験装置１は、Ｓ４の処理で実行された特定の命令を実行した仮想マシン３に対して処理の停止を指示する（Ｓ５）。具体的に、試験装置１は、図１４に示すように、例えば、特定の命令が実行された旨の通知を送信した仮想マシン３３に対し、実行中の処理の停止を指示する。なお、試験装置１は、例えば、各追加済ソースコード２３２に含まれる特定の命令のうち、予め決められた特定の命令が実行された場合にのみ、Ｓ５の処理を行うものであってもよい。
【００７４】
その後、試験装置１は、図９に示すように、Ｓ５の処理で指示した処理の停止に伴って、各仮想マシン３において発生した所定の異常を検知する（Ｓ１１）。
【００７５】
そして、異常の発生を検知した場合（Ｓ１２のＹＥＳ）、試験装置１は、Ｓ５の処理で指示した処理の停止が行われた際に実行されていた特定の命令を含む特定のコードブロックを特定する（Ｓ１３）。具体的に、試験装置１は、図１５に示すように、仮想マシン３３が実行していた処理（試験装置１によって停止されるまで実行していた処理）の結果に異常が含まれていた場合、処理が停止された際に仮想マシン３３が実行していた特定の命令を含む特定のコードブロックを特定する。
【００７６】
一方、異常の発生を検知しなかった場合（Ｓ１２のＮＯ）、試験装置１は、Ｓ１３の処理を行わない。
【００７７】
すなわち、本実施の形態における試験装置１は、試験対象処理の実行中において異常が検知された場合、試験対象処理において書き込み処理が行われていた箇所を、検知された異常の原因となった可能性が高い箇所として特定する。そして、試験装置１は、仮想マシン３において試験対象処理が再度実行された場合、書き込み処理が行われた直後において処理を停止し、処理が停止されるまでの試験対象処理の実行によって異常が発生しているか否かの判定を行う。その結果、異常が発生していた場合、試験装置１は、特定された書き込み処理が行われていた箇所を、検知した異常の原因となった可能性が極めて高い箇所として特定する。
【００７８】
これにより、事業者は、試験対象処理の実行によって検知した異常の原因箇所の特定を効率的に行うことが可能になる。そのため、事業者は、試験対象処理の試験を効率的に行うことが可能になる。
【００７９】
［第１の実施の形態の詳細］
次に、第１の実施の形態の詳細について説明する。図１６から図２２は、第１の実施の形態における試験処理の詳細を説明するフローチャートである。また、図２３から図２８は、第１の実施の形態における試験処理の詳細を説明する図である。図２３から図２８を参照しながら、図１６から図２２に示す試験処理を説明する。
【００８０】
［試験装置が行う命令追加処理］
初めに、試験装置１が行う試験処理のうち、追加済ソースコード２３２を生成する処理（以下、命令追加処理とも呼ぶ）について説明を行う。図１６は、試験装置１が行う命令追加処理を説明する図である。
【００８１】
命令追加部１１１は、命令追加タイミングになるまで待機する（Ｓ２１のＮＯ）。命令追加タイミングは、例えば、事業者が試験装置１に対して追加済ソースコード２３２の生成を開始する旨の入力を行ったタイミングであってよい。
【００８２】
そして、命令追加タイミングになった場合（Ｓ２１のＹＥＳ）、命令追加部１１１は、仮想マシン３のそれぞれが実行する試験対象処理の各ソースコード２３１における所定の位置に、試験装置１に指示を要求する特定の命令を追加して追加済ソースコード２３２を生成する（Ｓ２２）。
【００８３】
［試験装置が行う第１時刻特定処理］
次に、試験装置１が行う試験処理のうち、追加済ソースコード２３２に含まれる特定の命令の実行時刻を取得する処理（以下、第１時刻特定処理とも呼ぶ）について説明を行う。図１７は、試験装置１が行う第１時刻特定処理を説明する図である。
【００８４】
時刻特定部１１９は、図１７に示すように、各仮想マシン３において試験対象処理の実行が開始するまで待機する（Ｓ３１のＮＯ）。そして、各仮想マシン３において試験対象処理の実行が開始された場合（Ｓ３１のＹＥＳ）、情報受信部１１２は、各仮想マシン３のいずれかから次の処理の指示要求を受信するまで待機する（Ｓ３２）。すなわち、情報受信部１１２は、各仮想マシン３のいずれかにおいて特定の命令が実行されるまで待機する。
【００８５】
その後、各仮想マシン３のいずれかにおいて特定の命令が実行された場合（Ｓ３２のＹＥＳ）、時刻特定部１１９は、Ｓ３２の処理で受信した指示要求に対応する特定の命令が実行された第１時刻を特定する（Ｓ３３）。具体的に、時刻特定部１１９は、例えば、各仮想マシン３から出力されたログ情報（図示しない）を参照することにより、第１時刻の特定を行うものであってよい。そして、時刻特定部１１９は、特定した第１時刻を示す情報を第１時刻情報１３１として情報格納領域１３０に記憶する（Ｓ３４）。以下、第１時刻情報１３１の具体例について説明を行う。
【００８６】
［第１時刻情報の具体例］
図２３は、第１時刻情報１３１の具体例を説明する図である。図２３に示す第１時刻情報１３１は、第１時刻情報１３１に含まれる各情報を識別する「項番」と、追加済ソースコード２３２に含まれる各特定の命令を識別する「命令識別情報」と、各特定の命令の実行日時（実行時刻）を示す「実行日時」とを項目として有する。なお、以下、図２等で説明した各仮想マシン３のうち、仮想マシン３３において実行された特定の命令についての第１時刻情報１３１について説明を行う。
【００８７】
具体的に、図２３に示す第１時刻情報１３１において、「項番」が「１」である情報には、「命令識別情報」として「Ｉｆ（ｌｉｓｔｅｎ＿１）｛Ｅｘｉｔ（１）；｝」を示す「ｌｉｓｔｅｎ＿１」が設定され、「実行日時」として「２０１７／２／１３  ０８：００：００」が設定されている。また、図２３に示す第１時刻情報１３１において、「項番」が「２」である情報には、「命令識別情報」として「Ｉｆ（ｌｉｓｔｅｎ＿２）｛Ｅｘｉｔ（２）；｝」を示す「ｌｉｓｔｅｎ＿２」が設定され、「実行日時」として「２０１７／２／１３  ０８：０１：００」が設定されている。図２３に含まれる他の情報については説明を省略する。
【００８８】
図１７に戻り、各仮想マシン３において試験対象処理の実行が終了している場合（Ｓ３５のＹＥＳ）、試験装置１は、第１時刻特定処理を終了する。一方、各仮想マシン３において試験対象処理の実行が終了していない場合（Ｓ３５のＮＯ）、情報受信部１１２は、Ｓ３２以降の処理を再度行う。
【００８９】
すなわち、時刻特定部１１９は、第１時刻特定処理を行うことにより、追加済ソースコード２３２に含まれる各特定の命令の実行時刻である第１時刻を特定する。これにより、第１コード特定部１１３は、後述するように、特定のコードブロックを特定することが可能になる。
【００９０】
［試験装置が行う第２時刻特定処理］
次に、試験装置１が行う試験処理のうち、追加済ソースコード２３２に含まれる書き込み命令の実行時刻を取得する処理（以下、第２時刻特定処理とも呼ぶ）について説明を行う。図１８は、試験装置１が行う第２時刻特定処理を説明する図である。なお、以下、第１時刻特定処理と第２時刻特定処理とが並行して行われるものとして説明を行う。
【００９１】
時刻特定部１１９は、図１８に示すように、各仮想マシン３において試験対象処理の実行が開始するまで待機する（Ｓ４１のＮＯ）。そして、各仮想マシン３において試験対象処理の実行が開始された場合（Ｓ４１のＹＥＳ）、情報受信部１１２は、記憶装置に対するデータの書き込み命令の実行を検知するまで待機する（Ｓ４２）。すなわち、情報受信部１１２は、例えば、図２等で説明したデータベースＤＢ１に対する書き込み命令の実行を検知する書き込み検知装置（図示しない）から、データベースＤＢ１に対する書き込み命令の実行が行われたことを示す情報を受信するまで待機する。
【００９２】
その後、記憶装置に対する書き込み命令の実行を検知した場合（Ｓ４２のＹＥＳ）、時刻特定部１１９は、Ｓ４２の処理で検知した書き込み命令が実行された第２時刻を特定する（Ｓ４３）。続いて、時刻特定部１１９は、特定した第２時刻を示す情報を第２時刻情報１３２として情報格納領域１３０に記憶する（Ｓ４４）。以下、第２時刻情報１３２の具体例について説明を行う。
【００９３】
［第２時刻情報の具体例］
図２４は、第２時刻情報１３２の具体例を説明する図である。図２４に示す第２時刻情報１３２は、第２時刻情報１３２に含まれる各情報を識別する「項番」と、各書き込み命令の実行日時（実行時刻）を示す「実行日時」とを項目として有する。なお、以下、図２等で説明した各仮想マシン３のうち、仮想マシン３３において実行された特定の命令についての第２時刻情報１３２について説明を行う。
【００９４】
具体的に、図２４に示す第２時刻情報１３２において、「項番」が「１」である情報には、「実行日時」として「２０１７/２/１３  ０８：０１：３０」が設定されている。図２４に含まれる他の情報については説明を省略する。
【００９５】
図１８に戻り、各仮想マシン３において試験対象処理の実行が終了している場合（Ｓ４５のＹＥＳ）、試験装置１は、第２時刻特定処理を終了する。一方、各仮想マシン３において試験対象処理の実行が終了していない場合（Ｓ４５のＮＯ）、情報受信部１１２は、Ｓ４２以降の処理を再度行う。
【００９６】
すなわち、時刻特定部１１９は、第２時刻特定処理を行うことにより、追加済ソースコード２３２に含まれる各書き込み命令の実行時刻である第２時刻を特定する。これにより、第１コード特定部１１３は、後述するように、特定のコードブロックを特定することが可能になる。
【００９７】
［試験装置が行うコードブロック特定処理］
次に、試験装置１が行う試験処理のうち、特定のコードブロックの特定を行う処理（以下、コードブロック特定処理とも呼ぶ）について説明を行う。図１９は、試験装置１が行うコードブロック特定処理を説明する図である。
【００９８】
第１コード特定部１１３は、第１時刻及び第２時刻が特定されるまで待機する（Ｓ５１のＮＯ）。すなわち、第１コード特定部１１３は、図１７及び図１８で説明した第１時刻特定処理及び第２時刻特定処理が実行されるまで待機する。
【００９９】
そして、第１時刻及び第２時刻が特定された場合（Ｓ５１のＹＥＳ）、第１コード特定部１１３は、Ｓ２２の処理で生成した追加済ソースコード２３２を特定の命令の位置において区分けした複数のコードブロックを特定する（Ｓ５２）。
【０１００】
続いて、第１コード特定部１１３は、Ｓ３３の処理で特定した第１時刻のうち、Ｓ４３の処理で特定した第２時刻の直前の時刻と直後の時刻とを特定する（Ｓ５３）。その後、第１コード特定部１１３は、Ｓ５２の処理で特定した複数のコードブロックのうち、Ｓ５３の処理で特定した直前の時刻に対応する特定の命令と、Ｓ５３の処理で特定した直後の時刻に対応する特定の命令との間に位置するコードブロックを、特定のコードブロックとして特定する（Ｓ５４）。さらに、第１コード特定部１１３は、Ｓ５４の処理で特定した特定のコードブロックを示す情報を、特定コード情報１３３として情報格納領域１３０に記憶する（Ｓ５５）。以下、特定コード情報１３３の具体例について説明を行う。
【０１０１】
［特定コード情報の具体例］
図２５は、特定コード情報１３３の具体例を説明する図である。図２５に示す特定コード情報１３３は、特定コード情報１３３に含まれる各情報を識別する「項番」と、追加済ソースコード２３２に含まれる各特定の命令を識別する「命令識別情報」と、コードブロックを識別する「コードブロック識別情報」とを項目として有する。
【０１０２】
具体的に、例えば、図２４で説明した第２時刻情報１３２の「項番」が「１」である情報の「実行日時」には、「２０１７／２／１３  ０８：０１：３０」が設定されている。また、例えば、図２３で説明した第１時刻情報１３１の「項番」が「２」である情報の「実行日時」には、「２０１７／２／１３  ０８：０１：００」が設定され、「項番」が「３」である情報の「実行日時」には、「２０１７／２／１３  ０８：０２：００」が設定されている。そのため、第１コード特定部１１３は、図２３で説明した第１時刻情報１３１における「項番」が「２」である情報の「命令識別情報」に設定された「ｌｉｓｔｅｎ＿２」が示す特定の命令と、「項番」が「３」である情報の「命令識別情報」に設定された「ｌｉｓｔｅｎ＿３」が示す特定の命令との間に位置するコードブロックとを特定のコードブロックとして特定する。
【０１０３】
したがって、第１コード特定部１１３は、図２５に示すように、「項番」が「１」である情報の「命令識別情報」に、特定のコードブロックの最後に位置する特定の命令を識別する「ｌｉｓｔｅｎ＿３」を設定する。また、第１コード特定部１１３は、図２５に示すように、「項番」が「１」である情報の「コードブロック識別情報」に、例えば、図１２で説明した例において「ｌｉｓｔｅｎ＿２」が示す特定の命令と「ｌｉｓｔｅｎ＿３」が示す特定の命令との間に位置するコードブロックを識別する「コードブロック２３２ｂ」を設定する。図２５に含まれる他の情報については説明を省略する。
【０１０４】
これにより、第１コード特定部１１３は、異常の原因箇所である可能性が高い命令である書き込み命令を含むコードブロックを特定することが可能になる。そのため、停止指示部１１４は、後述するように、書き込み命令が行われた場合に限り、仮想マシン３に対して処理の停止を指示することが可能になる。
【０１０５】
なお、第１コード特定部１１３は、Ｓ５４の処理の後、Ｓ２２の処理で生成された追加済ソースコード２３２に含まれる特定の命令のうち、特定のコードブロックの最後に位置する特定の命令以外の特定の命令を削除するものであってもよい。
【０１０６】
これにより、各仮想マシン３は、試験対象処理を再度行う場合、後述するように、試験装置１に対して処理の指示要求を送信する頻度を抑制することが可能になる。そのため、各仮想マシン３は、後述するように、試験装置１から次の処理の指示を受信するまで待機する頻度を抑制することが可能になる。
【０１０７】
［各仮想マシンが行う試験処理］
次に、各仮想マシン３が行う試験処理について説明を行う。図２０は、各仮想マシン３が行う試験処理を説明する図である。
【０１０８】
処理実行部２１３は、試験対象処理の実行タイミングまで待機する（Ｓ１０１のＮＯ）。具体的に、試験対象処理の実行タイミングは、例えば、試験対象処理のうちの前段の処理を行う仮想マシン３からデータを受信したタイミングである。そして、試験対象処理の実行タイミングになった場合（Ｓ１０１のＹＥＳ）、処理実行部２１３は、Ｓ１２の処理で生成された追加済ソースコード２３２の実行を開始する（Ｓ１０２）。
【０１０９】
続いて、情報送信部２１１は、追加済ソースコード２３２に含まれる命令のうち、特定の命令を実行するまで待機する（Ｓ１０３のＮＯ）。そして、特定の命令を実行した場合（Ｓ１０３のＹＥＳ）、情報送信部２１１は、試験装置１に対して次の処理の指示要求を送信する（Ｓ１０４）。
【０１１０】
その後、情報受信部２１２は、試験装置１から次の処理の指示を受信するまで待機する（Ｓ１０５のＮＯ）。そして、次の処理の指示を受信した場合（Ｓ１０５のＹＥＳ）、処理実行部２１３は、Ｓ１０５の処理において受信した指示に対応する処理を実行する（Ｓ１０６）。
【０１１１】
すなわち、本実施の形態における試験装置１は、各仮想マシン３が特定の命令を実行する毎に、各仮想マシン３が次に実行する処理の決定を行う。これにより、試験装置１は、試験対象処理の実行中における各仮想マシン３の状態を制御することが可能になる。
【０１１２】
さらに、処理実行部２１３は、追加済ソースコード２３２に含まれる全ての特定の命令が実行されたか否かを判定する（Ｓ１０７）。その結果、全ての特定の命令が実行されていないと判定した場合（Ｓ１０７のＮＯ）、仮想マシン３は、Ｓ１０３以降の処理を再度行う。一方、全ての特定の命令が実行されたと判定した場合（Ｓ１０７のＹＥＳ）、処理実行部２１３は、Ｓ１２の処理で生成された追加済ソースコード２３２に含まれる命令のうち、実行されていない命令を実行する（Ｓ１０８）。
【０１１３】
なお、処理実行部２１３は、例えば、試験装置１から特定コード情報１３３を予め取得するものであってもよい。そして、処理実行部２１３は、特定コード情報１３３を参照し、特定コードブロックの最後に位置する特定の命令が実行されたと判定した場合に、試験装置１に対して次の処理の指示要求を送信するものであってもよい（Ｓ１０３のＹＥＳ、Ｓ１０４）。さらに、処理実行部２１３は、特定コード情報１３３を参照し、特定コードブロックの最後に位置する特定の命令の全てが実行されたと判定した場合に、追加済ソースコード２３２に含まれる命令のうち、実行されていない命令の実行を行うものであってもよい（Ｓ１０７のＹＥＳ、Ｓ１０８）。
【０１１４】
これにより、処理実行部２１３は、試験装置１に対する処理の指示要求の送信頻度を抑制することが可能になる。そのため、処理実行部２１３は、試験装置１から次の処理の指示を受信するまで待機する頻度を抑制することが可能になる。
【０１１５】
［試験装置が行う異常特定処理］
次に、試験装置１が行う試験処理のうち、異常の原因箇所である可能性があるコードブロックを特定する処理（以下、異常特定処理とも呼ぶ）について説明を行う。図２１及び図２２は、試験装置１が行う異常特定処理を説明する図である。
【０１１６】
情報受信部１１２は、異常特定タイミングまで待機する（Ｓ６１のＮＯ）。異常特定タイミングは、例えば、事業者が試験装置１に対して異常特定処理を行う旨の入力を行ったタイミングであってよい。
【０１１７】
そして、異常特定タイミングになった場合（Ｓ６１のＹＥＳ）、停止指示部１１４は、Ｓ５４の処理で特定された特定のコードブロックを１つ特定する（Ｓ６２）。具体的に、停止指示部１１４は、例えば、図２５で説明した特定コード情報１３３を参照し、「コードブロック識別情報」に設定された情報のうちのいずれか１つを特定する。なお、以下、停止指示部１１４は、追加済ソースコード２３２において記述された順に書き込み命令の特定を行うものとする。
【０１１８】
続いて、停止指示部１１４は、Ｓ６２の処理で特定した特定のコードブロックの最後に位置する特定の命令が実行されるまで待機する（Ｓ６３のＮＯ）。そして、Ｓ６２の処理で特定した特定のコードブロックの最後に位置する特定の命令が実行された場合（Ｓ６３のＹＥＳ）、停止指示部１１４は、Ｓ６３の処理で実行された特定の命令を実行した仮想マシン３に対して処理の停止を指示する（Ｓ６４）。
【０１１９】
その後、異常検知部１１５は、Ｓ６４の処理で指示した処理の停止に伴って、各仮想マシン３において発生した異常を検知する（Ｓ６５）。
【０１２０】
その結果、異常の発生を検知した場合（Ｓ７１のＹＥＳ）、第２コード特定部１１６は、図２２に示すように、Ｓ５４の処理で特定した特定のコードブロックのうち、Ｓ６４の処理で指示した処理の停止が行われた際に実行された特定の命令を含む特定のコードブロックを特定する（Ｓ７２）。そして、第２コード特定部１１６は、Ｓ７２の処理で特定した特定のコードブロックを示す情報を、検証結果情報１３４として情報格納領域１３０に記憶する（Ｓ７３）。一方、異常の発生を検知しなかった場合（Ｓ７１のＮＯ）、第２コード特定部１１６は、Ｓ７２の処理を行わない。
【０１２１】
すなわち、Ｓ６５の処理において、仮想マシン３のいずれかにおいて異常の発生を検知した場合、異常検知部１１５は、Ｓ６４の処理で停止されるまでに実行されたコードブロックのいずれかに異常の原因箇所が存在するものと判定する。また、第２コード特定部１１６は、この場合、Ｓ７２の処理で特定した特定のコードブロックが異常の原因箇所である可能性が特に高いものと判定する。
【０１２２】
これにより、事業者は、異常の原因箇所を効率的に特定することが可能になる。以下、検証結果情報１３４の具体例について説明を行う。
【０１２３】
［検証結果情報の具体例］
図２６から図２８は、検証結果情報１３４の具体例を説明する図である。検証結果情報１３４は、検知された異常の原因箇所を特定するために行われた検証の結果を示す情報である。
【０１２４】
図２６等に示す検証結果情報１３４は、検証結果情報１３４に含まれる各情報を識別する「項番」と、追加済ソースコード２３２に含まれる各特定の命令を識別する「命令識別情報」と、Ｓ７１の処理における判定結果を設定する「検証結果」とを項目として有する。「検証結果」には、異常が発生しなかったことを示す「○」、または、異常が発生したことを示す「×」が設定される。
【０１２５】
具体的に、例えば、「ｌｉｓｔｅｎ＿３」が示す特定の命令を実行した仮想マシン３に対して処理の停止を指示した場合において、仮想マシン３において異常の発生を検知していない場合、第２コード特定部１１６は、例えば、図２６に示すように、「項番」が「１」である情報の「命令識別情報」に「ｌｉｓｔｅｎ＿３」を設定し、「検証結果」に「○」を設定する。図２６に含まれる他の情報については説明を省略する。
【０１２６】
図２２に戻り、Ｓ６２の処理において特定のコードブロックの全てを特定していない場合（Ｓ７４のＮＯ）、停止指示部１１４は、Ｓ６２以降の処理を再度行う。すなわち、第３コード特定部１１７は、図２７に示すように、検証結果情報１３４の「検証結果」の全てに「○」または「×」が設定されるまで、Ｓ６２からＳ７４の処理を繰り返し行う。
【０１２７】
一方、Ｓ６２の処理において特定のコードブロックの全てを特定した場合（Ｓ７４のＹＥＳ）、第３コード特定部１１７は、Ｓ２２の処理で生成した追加済ソースコード２３２において、Ｓ７２で特定した特定のコードブロックの直前に位置する特定のコードブロックの直後に位置するコードブロックから、Ｓ７２で特定した特定のコードブロックまでの間に位置するコードブロックを、異常の調査対象コードブロックとして特定する（Ｓ７５）。なお、Ｓ２２の処理で生成した追加済ソースコード２３２において、Ｓ７２で特定した特定のコードブロックの前に特定のコードブロックが存在しない場合、第３コード特定部１１７は、例えば、最初のコードブロックから、Ｓ７２で特定した特定のコードブロックまでの間に位置するコードブロックを、調査対象コードブロックとして特定する。
【０１２８】
これにより、事業者は、試験対象処理において検知された異常の原因箇所を特定する際に、調査を行う必要があるコードブロック（調査対象コードブロック）の特定を行うことが可能になる。
【０１２９】
具体的に、図２７に示す検証結果情報１３４において、「項番」が「３」である情報における「検証結果」及び「項番」が「４」である情報における「検証結果」には、それぞれ「×」が設定されている。そして、図１２で説明した追加済ソースコード２３２において、コードブロック２３２ｂ（「ｌｉｓｔｅｎ＿３」が示す特定の命令を含むコードブロック）の前には、特定のコードブロックが存在しない。また、図１２で説明した追加済ソースコード２３２において、コードブロック２３２ｅ（「ｌｉｓｔｅｎ＿６」が示す特定の命令を含むコードブロック）の直前に位置する特定のコードブロックの直後に位置するコードブロックは、コードブロック２３２ｃである。
【０１３０】
そのため、第３コード特定部１１７は、図１２で説明した追加済ソースコード２３２において、コードブロック２３２ａ（最初のコードブロック）から、コードブロック２３２ｂまでを、調査対象コードブロックとして特定する。また、第３コード特定部１１７は、図１２で説明した追加済ソースコード２３２において、コードブロック２３２ｃから、コードブロック２３２ｅまでを、調査対象コードブロックとして特定する。すなわち、第３コード特定部１１７は、この場合、図１２で説明した追加済ソースコード２３２において、コードブロック２３２ａからコードブロック２３２ｅまでを、調査対象コードブロックとして特定する。
【０１３１】
その後、情報出力部１１８は、例えば、Ｓ７２の処理で特定した特定のコードブロックと、Ｓ７５の処理で特定した調査対象コードブロックとを出力する（Ｓ７６）。具体的に、情報出力部１１８は、例えば、事業者（試験担当者）が操作する操作端末（図示しない）に対して、図２７で説明した検証結果情報１３４と、Ｓ７５の処理で特定した調査対象コードブロックを示す情報との出力を行う。
【０１３２】
これにより、情報出力部１１８は、異常の原因箇所である可能性が高いコードブロックと、異常の原因箇所である可能性を有しているコードブロックとをそれぞれ出力することが可能になる。
【０１３３】
なお、追加済ソースコード２３２に異常の原因箇所が存在する場合、処理の停止を指示した際に異常が検知される特定のコードブロックは、追加済ソースコード２３２において連続して位置している可能性がある。そのため、停止指示部１１４は、処理の停止を指示した際に異常が検知された特定のコードブロックが特定された場合、その異常が検知された特定のコードブロックに隣接する特定のコードブロックについての検証を優先的に行うものであってもよい。
【０１３４】
具体的に、停止指示部１１４は、例えば、Ｓ６２の処理において、「ｌｉｓｔｅｎ＿９」が示す特定の命令を含むコードブロックの特定を最初に行い、Ｓ６３以降の処理を行う。そして、Ｓ７１の処理において異常が検知された場合、停止指示部１１４は、図２８に示すように、「命令識別情報」に「ｌｉｓｔｅｎ＿９」が設定された情報の「検証結果」に「×」を設定する（Ｓ７２）。
【０１３５】
続いて、停止指示部１１４は、例えば、Ｓ６２の処理において、「ｌｉｓｔｅｎ＿９」が示す特定の命令に隣接する「ｌｉｓｔｅｎ＿６」が示す特定の命令を含むコードブロックの特定を行い、Ｓ６３以降の処理を行う。そして、Ｓ７１の処理において異常が検知されなかった場合、停止指示部１１４は、図２８に示すように、「命令識別情報」に「ｌｉｓｔｅｎ＿６」が設定された情報の「検証結果」に「○」を設定する（Ｓ７２）。
【０１３６】
その後、停止指示部１１４は、例えば、Ｓ６２の処理において、「ｌｉｓｔｅｎ＿９」が示す特定の命令に隣接する「ｌｉｓｔｅｎ＿１０」が示す特定の命令を含むコードブロックの特定を行い、Ｓ６３以降の処理を行う。そして、Ｓ７１の処理において異常が検知された場合、停止指示部１１４は、図２８に示すように、「命令識別情報」に「ｌｉｓｔｅｎ＿１０」が設定された情報の「検証結果」に「×」を設定する（Ｓ７２）。
【０１３７】
さらに、停止指示部１１４は、例えば、Ｓ６２の処理において、「ｌｉｓｔｅｎ＿１０」が示す特定の命令に隣接する「ｌｉｓｔｅｎ＿１６」が示す特定の命令を含むコードブロックの特定を行い、Ｓ６３以降の処理を行う。そして、Ｓ７１の処理において異常が検知されなかった場合、停止指示部１１４は、図２８に示すように、「命令識別情報」に「ｌｉｓｔｅｎ＿１６」が設定された情報の「検証結果」に「○」を設定する（Ｓ７２）。
【０１３８】
これにより、停止指示部１１４は、図２６等で説明した場合と比較して、調査対象コードブロックをより迅速に特定することが可能になる。そのため、事業者は、調査対象コードブロックについての調査を早期に開始することが可能になる。
【０１３９】
このように、本実施の形態における試験装置１は、複数の仮想マシン３がそれぞれ実行する試験対象処理の各ソースコードにおける所定の位置に、特定の命令を追加して追加済ソースコードを生成する。そして、試験装置１は、生成した追加済ソースコードを特定の命令の位置において区分けした複数のコードブロックのうち、複数の仮想マシン３が書き込みを行う記憶装置に対するデータの書き込み命令を含む特定のコードブロックを特定する。
【０１４０】
その後、試験装置１は、試験対象処理の実行中において、各仮想マシン３において実行される追加済ソースコードに含まれる特定の命令のうち、特定のコードブロックの最後に位置する特定の命令が実行されたことに応じて、特定の命令を実行した仮想マシン３に対して処理の停止を指示する。そして、試験装置１は、処理の途中で停止された試験対象処理において異常を検知した場合、仮想マシン３の停止が行われた際に実行された特定の命令を含む特定のコードブロックを特定する。
【０１４１】
これにより、事業者は、試験対象処理の実行によって検知した異常の原因箇所の特定を効率的に行うことが可能になる。そのため、事業者は、試験対象処理の試験を効率的に行うことが可能になる。
【０１４２】
なお、本実施の形態における試験処理によって、試験装置１は、例えば、追加済ソースコード２３２におけるアトミック操作の実装漏れを検知することが可能になる。
【０１４３】
アトミック操作は、不可分操作のことであり、複数の操作が行われている間、他のプログラム等が複数の操作の間に割り込むことができない操作である。そのため、例えば、追加済ソースコード２３２に含まれる各命令がアトミック操作として実装されている場合、検証結果情報１３４の「検証結果」には、全て同じ情報（「○」または「×」）が設定される。
【０１４４】
この点、図２７で説明した検証結果情報１３４における「検証結果」には、「○」と「×」とが混在して設定されている。そのため、試験装置１は、この場合、追加済ソースコード２３２に含まれる各命令がアトミック操作として実装されていないこと（アトミック操作の実装漏れが発生していること）の検知が可能になる。
【０１４５】
以上の実施の形態をまとめると、以下の付記の通りである。
【０１４６】
（付記１）
１または複数のコンピュータにより提供される複数の計算機資源が連動して行う特定の処理の試験を行う試験装置であって、
前記複数の計算機資源がそれぞれ実行する前記特定の処理の各ソースコードにおける所定の位置に、特定の命令を追加して追加済ソースコードを生成する命令追加部と、
前記追加済ソースコードを前記特定の命令の位置において区分けした複数のコードブロックのうち、前記複数の計算機資源が書き込みを行う記憶装置に対するデータの書き込み命令を含む特定のコードブロックを特定する第１コード特定部と、
前記特定の処理の実行中において、前記特定の命令のうち、前記特定のコードブロックの最後に位置する前記特定の命令が実行されたことに応じて、前記特定の命令を実行した計算機資源に対して処理の停止を指示する停止指示部と、
前記処理の停止の指示に伴って、前記複数の計算機資源において発生した所定の異常を検知する異常検知部と、
前記所定の異常の発生を検知した場合、前記処理の停止が行われた際に実行された前記特定の命令を含む前記特定のコードブロックを特定する第２コード特定部と、を有する、
ことを特徴とする試験装置。
【０１４７】
（付記２）
付記１において、
前記停止指示部は、前記特定の処理の実行が行われる毎に、前記特定のコードブロックに含まれる前記特定の命令のうちのそれぞれ異なる前記特定の命令が実行されたことに応じて、前記特定の命令を実行した計算機資源に対して処理の停止を指示し、
前記第２コード特定部は、前記停止指示部が前記所定の異常を検知する毎に、前記特定のコードブロックの特定を行う、
ことを特徴とする試験装置。
【０１４８】
（付記３）
付記１において、さらに、
前記追加済ソースコードにおいて、前記第２コード特定部が特定した前記特定のコードブロックの直前に位置する特定のコードブロックの直後に位置するコードブロックから、前記第２コード特定部が特定した前記特定のコードブロックまでの間に位置するコードブロックを特定する第３コード特定部を有する、
ことを特徴とする試験装置。
【０１４９】
（付記４）
付記１において、さらに、
前記特定の処理の実行の前に行われる事前処理であって前記停止指示部による処理の停止を行わない前記特定の処理の実行中に、前記複数の計算機資源のいずれかにおいて、前記特定の命令が実行された第１時刻と、前記データの書き込み命令が実行された第２時刻とを特定する時刻特定部と、を有し、
前記第１コード特定部は、前記時刻特定部が特定した前記第１時刻と前記第２時刻とに基づいて、前記特定のコードブロックを特定する、
ことを特徴とする試験装置。
【０１５０】
（付記５）
付記４において、
前記第１コード特定部は、
前記第１時刻のうち、前記第２時刻の直前の時刻と直後の時刻とを特定し、 
前記複数のコードブロックのうち、前記直前の時刻に対応する前記特定の命令と、前記直後の時刻に対応する前記特定の命令との間に位置するコードブロックを、前記特定のコードブロックとして特定する、
ことを特徴とする試験装置。
【０１５１】
（付記６）
付記３において、さらに、
前記第３コード特定部が特定したコードブロックを出力する情報出力部を有する、
ことを特徴とする試験装置。
【０１５２】
（付記７）
付記１において、
前記特定の命令は、各計算機資源が次に実行する処理の指示を要求する命令である、
ことを特徴とする試験装置。
【０１５３】
（付記８）
１または複数のコンピュータにより提供される複数の計算機資源が連動して行う特定の処理の試験を行う試験方法であって、
前記複数の計算機資源がそれぞれ実行する前記特定の処理の各ソースコードにおける所定の位置に、特定の命令を追加して追加済ソースコードを生成し、
前記追加済ソースコードを前記特定の命令の位置において区分けした複数のコードブロックのうち、前記複数の計算機資源が書き込みを行う記憶装置に対するデータの書き込み命令を含む特定のコードブロックを特定し、
前記特定の処理の実行中において、前記特定の命令のうち、前記特定のコードブロックの最後に位置する前記特定の命令が実行されたことに応じて、前記特定の命令を実行した計算機資源に対して処理の停止を指示し、
前記処理の停止の指示に伴って、前記複数の計算機資源において発生した所定の異常を検知し、
前記所定の異常の発生を検知した場合、前記処理の停止が行われた際に実行された前記特定の命令を含む前記特定のコードブロックを特定する、
ことを特徴とする試験方法。
【０１５４】
（付記９）
１または複数のコンピュータにより提供される複数の計算機資源が連動して行う特定の処理の試験を行う処理をコンピュータに実行させる試験プログラムであって、
前記複数の計算機資源がそれぞれ実行する前記特定の処理の各ソースコードにおける所定の位置に、特定の命令を追加して追加済ソースコードを生成し、
前記追加済ソースコードを前記特定の命令の位置において区分けした複数のコードブロックのうち、前記複数の計算機資源が書き込みを行う記憶装置に対するデータの書き込み命令を含む特定のコードブロックを特定し、
前記特定の処理の実行中において、前記特定の命令のうち、前記特定のコードブロックの最後に位置する前記特定の命令が実行されたことに応じて、前記特定の命令を実行した計算機資源に対して処理の停止を指示し、
前記処理の停止の指示に伴って、前記複数の計算機資源において発生した所定の異常を検知し、
前記所定の異常の発生を検知した場合、前記処理の停止が行われた際に実行された前記特定の命令を含む前記特定のコードブロックを特定する、
処理をコンピュータに実行させることを特徴とする試験プログラム。
【符号の説明】
【０１５５】
１：試験装置                ２：情報処理装置
３：仮想マシン              ４：仮想化ソフトウエア
【図１】
2018165903.tif 000003
【図２】
2018165903.tif 000004
【図３】
2018165903.tif 000005
【図４】
2018165903.tif 000006
【図５】
2018165903.tif 000007
【図６】
2018165903.tif 000008
【図７】
2018165903.tif 000009
【図８】
2018165903.tif 000010
【図９】
2018165903.tif 000011
【図１０】
2018165903.tif 000012
【図１１】
2018165903.tif 000013
【図１２】
2018165903.tif 000014
【図１３】
2018165903.tif 000015
【図１４】
2018165903.tif 000016
【図１５】
2018165903.tif 000017
【図１６】
2018165903.tif 000018
【図１７】
2018165903.tif 000019
【図１８】
2018165903.tif 000020
【図１９】
2018165903.tif 000021
【図２０】
2018165903.tif 000022
【図２１】
2018165903.tif 000023
【図２２】
2018165903.tif 000024
【図２３】
2018165903.tif 000025
【図２４】
2018165903.tif 000026
【図２５】
2018165903.tif 000027
【図２６】
2018165903.tif 000028
【図２７】
2018165903.tif 000029
【図２８】
2018165903.tif 000030