(57)【特許請求の範囲】
【請求項１】
プログラムの動作検証装置であって、
前記プログラムに従った処理が実行されることにより並列して実行される処理に夫々組み込まれた命令によって出力される通知であって、所定の識別子が指定された通知を取得する通知取得部と、
前記通知において指定される前記所定の識別子の優先度が設定された優先度設定情報に基づき、取得された前記通知に対して、設定された前記優先度の順に応答を行う応答部とを含み、
前記命令は、前記通知を出力した後に前記応答を受けることによって完了し、次の処理に進むことが可能となる命令であることを特徴とする動作検証装置。
【請求項２】
前記通知は、所定の処理の実行を要求する通知であり、
取得された前記通知に基づき、前記所定の処理を実行する処理実行部を含むことを特徴とする請求項１に記載の動作検証装置。
【請求項３】
前記通知は、前記通知において指定された識別子の出力を要求する通知であり、
前記処理実行部は、前記通知において指定されている前記所定の識別子を出力することを特徴とする請求項２に記載の動作検証装置。
【請求項４】
前記通知において指定される前記所定の識別子の出力に際して実行される追加処理が設定された追加処理設定情報に基づき、前記通知において指定されている前記所定の識別子の出力に際して設定された前記追加処理の実行を制御する追加処理実行制御部を含むことを特徴とする請求項３に記載の動作検証装置。
【請求項５】
前記追加処理設定情報は、前記追加処理の実行タイミングを指定する情報を含み、
前記追加処理実行制御部は、指定されたタイミングで前記追加処理の実行を制御することを特徴とする請求項４に記載の動作検証装置。
【請求項６】
前記追加処理設定情報は、前記通知において指定される前記所定の識別子の出力の前及び出力の後の少なくとも一方を前記追加処理の実行タイミングとして指定する情報を含むことを特徴とする請求項５に記載の動作検証装置。
【請求項７】
前記優先度設定情報は、前記通知において要求される処理の実行タイミングを指定する情報が前記所定の識別子に関連付けて記憶された情報であり、
前記処理実行部は、取得された前記通知に基づき、指定された前記所定の識別子に関連付けられたタイミングで前記所定の処理を実行することを特徴とする請求項２乃至６いずれか１項に記載の動作検証装置。
【請求項８】
前記優先度設定情報は、前記通知が取得されたタイミング及び取得された前記通知において指定された前記所定の識別子の優先度に応じた順番に到達したタイミングの少なくとも一方を指定する情報が前記識別子に関連付けて記憶された情報であることを特徴とする請求項７に記載の動作検証装置。
【請求項９】
プログラムの動作検証方法であって、
前記プログラムに従った処理が実行されることにより並列して実行される処理に、所定の識別子が指定された通知を出力する命令であって、前記通知を出力した後に応答を受けることによって完了して次の処理に進むことが可能となる命令を前記プログラムに組み込み、
前記通知において指定される前記所定の識別子の優先度を優先度設定情報として設定し、
前記通知が組み込まれたプログラムに従った処理を実行し、
前記並列して実行される処理に夫々組み込まれた命令によって出力される通知であって、前記所定の識別子が指定された通知を取得し、
前記優先度設定情報に基づき、取得された前記通知に対して、設定された前記優先度の順に応答を行うことを特徴とする動作検証方法。
【請求項１０】
プログラムの動作を検証する動作検証プログラムであって、
検証対象である前記プログラムに従った処理が実行されることにより並列して実行される処理に夫々組み込まれた命令によって出力される通知であって、所定の識別子が指定された通知を取得するステップと、
前記通知において指定される前記所定の識別子の優先度が設定された優先度設定情報に基づき、取得された前記通知に対して、設定された前記優先度の順に応答を行うステップとを情報処理装置に実行させ、
前記命令は、前記通知を出力した後に前記応答を受けることによって完了し、次の処理に進むことが可能となる命令であることを特徴とする動作検証プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、動作検証装置、動作検証方法及び動作検証プログラムに関する。
【背景技術】
【０００２】
近年のソフトウェア開発ではテスト駆動開発が主流となっている。テスト駆動開発において、開発者は開発対象のプログラムであるプロダクトコードを作成すると共に、そのプロダクトコードをテストするためのテストコードを作成する。そして、そのテストコードに基づいてプロダクトコードを動作させることにより、プロダクトコードの動作検証が実行される。
【０００３】
動作検証において発生した障害を解決するためには、障害の発生を再現することが求められる。しかしながら、情報処理機器を含む装置の動作には様々な要因が影響し、障害が発生した状況を忠実に再現することは容易ではない。そのような障害の再現のための技術として、装置の動作環境の情報を不揮発性記憶媒体に記憶しておき、その情報に基づいて動作環境を再現する方法が提案されている（例えば、特許文献１参照）。
【発明の概要】
【発明が解決しようとする課題】
【０００４】
特許文献１に開示された技術においては、温度や電圧等の動作環境を再現することは可能であるが、それ以外の要因によって発生する障害の再現には効果がない。特に、マルチスレッドのプログラムの場合、スレッドを処理するＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）の動作状態によっては、夫々異なるスレッドに含まれる２つの処理の順番が非常に低い頻度で入れ替わるようなことが起こり得る。
【０００５】
このような処理順序の入れ替わりが発生する頻度は、例えば１万回に１度という頻度である。従って、そのような障害を再現するためには、膨大な回数のテストを繰り返し実行する必要があり、テストに要する時間の増大やオペレータの作業負担の増大が問題となる。
【０００６】
本発明は、このような課題を解決するためになされたものであり、処理順序の入れ替わりにより低確率で発生するプログラムの動作障害を確実に再現することを目的とする。
【課題を解決するための手段】
【０００７】
上記課題を解決するために、本発明の一態様は、プログラムの動作検証装置であって、前記プログラムに従った処理が実行されることにより並列して実行される処理に夫々組み込まれた命令によって出力される通知であって、所定の識別子が指定された通知を取得する通知取得部と、前記通知において指定される前記所定の識別子の優先度が設定された優先度設定情報に基づき、取得された前記通知に対して、設定された前記優先度の順に応答を行う応答部とを含み、前記命令は、前記通知を出力した後に前記応答を受けることによって完了し、次の処理に進むことが可能となる命令であることを特徴とする。
【発明の効果】
【０００８】
本発明によれば、処理順序の入れ替わりにより低確率で発生するプログラムの動作障害を確実に再現することができる。
【図面の簡単な説明】
【０００９】
【図１】本発明の実施形態に係る動作検証装置のハードウェア構成を示すブロック図である。
【図２】本発明の実施形態に係る動作検証装置の機能構成を示すブロック図である。
【図３】本発明の実施形態に係るプロダクトコードの例を示す図である。
【図４】本発明の実施形態に係るテストコードの例を示す図である。
【図５】本発明の実施形態に係るログ登録順番テーブルの例を示す図である。
【図６】本発明の実施形態に係る追加処理テーブルの例を示す図である。
【図７】本発明の実施形態に係る動作検証装置の動作を示すシーケンス図である。
【図８】本発明の実施形態に係るログ制御部の動作を示すフローチャートである。
【図９】本発明の実施形態に係るログ出力時の動作を示すフローチャートである。
【図１０】本発明の実施形態に係るログ表示画面の例を示す図である。
【図１１】本発明の実施形態に係る検証対象のプログラムの内容を示す図である。
【図１２】本発明の実施形態に係る検証対象のプログラムの正常な動作を示すシーケンス図である。
【図１３】本発明の実施形態に係る検証対象のプログラムにログ出力処理を追加した内容を示す図である。
【図１４】本発明の実施形態に係る検証対象のプログラムを検証する際のログ登録順番テーブルを示す図である。
【図１５】本発明の実施形態に係る検証対象のプログラムの検証動作を示すシーケンス図である。
【発明を実施するための形態】
【００１０】
以下、図面を参照して、本発明の実施形態について説明する。本実施形態においては、プログラム開発において作成されたプログラムの動作検証を行う方法について説明する。そのような方法において、低頻度で発生する障害を再現するため、並列して実行される夫々の処理の順番を制御することが本実施形態に係る要旨の１つである。
【００１１】
図１は、本実施形態に係る動作検証の方法を実現する動作検証装置のハードウェア構成を示すブロック図である。図１に示すように、本実施形態に係る動作検証装置は、一般的なサーバやＰＣ等と同様の情報処理装置としての構成を含む。即ち、本実施形態に係る動作検証装置は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）１０、ＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）２０、ＲＯＭ（Ｒｅａｄ  Ｏｎｌｙ  Ｍｅｍｏｒｙ）３０、ＨＤＤ（Ｈａｒｄ  Ｄｉｓｋ  Ｄｒｉｖｅ）４０及びＩ／Ｆ５０がバス８０を介して接続されている。また、Ｉ／Ｆ５０にはＬＣＤ（Ｌｉｑｕｉｄ  Ｃｒｙｓｔａｌ  Ｄｉｓｐｌａｙ）６０及び操作部７０が接続されている。
【００１２】
ＣＰＵ１０は演算手段であり、動作検証装置全体の動作を制御する。ＲＡＭ２０は、情報の高速な読み書きが可能な揮発性の記憶媒体であり、ＣＰＵ１０が情報を処理する際の作業領域として用いられる。ＲＯＭ３０は、読み出し専用の不揮発性記憶媒体であり、ファームウェア等のプログラムが格納されている。ＨＤＤ４０は、情報の読み書きが可能な不揮発性の記憶媒体であり、ＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）や各種の制御プログラム、アプリケーション・プログラム等が格納される。
【００１３】
Ｉ／Ｆ５０は、バス８０と各種のハードウェアやネットワーク等を接続し制御する。ＬＣＤ６０は、ユーザが動作検証装置の状態を確認するための視覚的ユーザインタフェースである。操作部７０は、キーボードやマウス等、ユーザが動作検証装置に情報を入力するためのユーザインタフェースである。尚、動作検証装置を遠隔制御で動作するサーバとして構成する場合には、ＬＣＤ６０や操作部７０等のユーザインタフェースは省略可能である。
【００１４】
このようなハードウェア構成において、ＲＯＭ３０に格納されたプログラムや、ＨＤＤ４０若しくは図示しない光学ディスク等の記憶媒体からＲＡＭ２０にロードされたプログラムに従ってＣＰＵ１０が演算を行うことにより、ソフトウェア制御部が構成される。このようにして構成されたソフトウェア制御部と、ハードウェアとの組み合わせによって、本実施形態に係る動作検証装置の機能を実現する機能ブロックが構成される。
【００１５】
次に、本実施形態に係る動作検証装置の機能構成について図２のブロック図を参照して説明する。図２に示すように、本実施形態に係る動作検証装置１は、テスト実行部１１０、テスト対象記憶部１１１及びログ制御部１２０を含む。また、ログ制御部１２０は、順番制御部１２１、ログ出力部１２２、登録順番情報管理部１２３、追加処理管理部１２４及び登録順番記憶部１２５を含む。特に、ログ制御部１２０を実現するためのプログラムが、動作検証プログラムとして用いられる。
【００１６】
テスト実行部１１０は、テスト対象記憶部１１１に記憶されたテスト対象のプログラムのソースコードをビルドした上で実行する。また、本実施形態に係るテスト実行部１１０は、テスト対象のプログラム中に組み込まれたログ出力処理に際してログ制御部１２０との間で情報をやり取りし、ログ制御部１２０にログ出力を実行させる。
【００１７】
テスト対象記憶部１１１はテスト対象のプログラムのソースコードが記憶される記憶部であり、図１において説明したＨＤＤ４０等によって実現される。ここで、テスト対象記憶部１１１に記憶されるソースコードの内容について説明する。図３は、テスト対象のプログラムのソースコードのうち、最終的に製品となるテスト対象のソースコードであるプロダクトコードを示す図である。
【００１８】
図３に示すプロダクトコードは、“関数Ａ”、“関数Ｂ”および“追加処理関数Ｃ”を含む。“関数Ａ”、“関数Ｂ”は、最終的に製品となるプログラムに含まれる関数である。これに対して、“追加処理関数Ｃ”は、“関数Ａ”、“関数Ｂ”が最終的に製品となって動作する際の環境を再現するために組み込まれる関数である。
【００１９】
図３においては、説明の容易化のため、簡易な処理からなるプログラムを例として説明する。“関数Ａ”は、本来の処理として「変数ａ１をインクリメント」することを示す処理を含む。また、“関数Ｂ”は、本来の処理として「変数ｂ１をデクリメント」することを示す処理を含む。
【００２０】
これに対して、本実施形態に係る動作検証に際して、“関数Ａ”には、「“ａａａ”という文字列をログ出力」することを示す処理が組み込まれる。また“関数Ｂ”には、「“ｂｂｂ”という文字列をログ出力」することを示す処理が組み込まれる。このようにログ出力の処理を組み込み、そのログ出力の順番を制御することによって“関数Ａ”、“関数Ｂ”夫々に含まれる処理の順番を制御することが本実施形態に係る要旨の１つである。
【００２１】
“追加処理関数Ｃ”は、「“ｃｃｃ”という文字列をログ出力」することを示す処理を含む。この処理は、本来のプロダクトコードに含まれる処理ではなく、プロダクトコードの動作検証を行う上で、プロダクトコードが実際の運用で動作する際の環境を再現するために組み込まれる。
【００２２】
図４は、テスト対象のプログラムのソースコードのうち、動作検証のためにプロダクトコードを動作させるための機能を提供するプログラムのソースコードであるテストコードを示す図である。図４に示すテストコードは、“ログ出力順番登録命令”、“追加処理登録命令”、“関数実行命令”を含む。
【００２３】
“ログ出力順番登録命令”は、上述した「“ａａａ”という文字列をログ出力」、「“ｂｂｂ”という文字列をログ出力」といったログ出力の順番の登録命令である。図４においては、“ａａａ”という文字列のログ出力が１番目で、“ｂｂｂ”という文字列のログ出力が２番目であることが指定されている。
【００２４】
また、“制御前後出力”は、ログ出力の順番を制御する際に、どのタイミングでログ出力を行うかを指定する情報である。“制御前後出力”の場合、ログの出力が要求されたタイミング、即ち制御前と、ログ出力の順番が到達したタイミング、即ち制御後の２通りのタイミングでログ出力を行うことが指定されている。
【００２５】
この他、“制御前出力”であれば、ログの出力が要求されたタイミングでログ出力は行うが、指定されたログ出力の順番が満たされるまでログ出力の完了を通知せずに待機することによってログ出力の要求元の処理が次のステップに進まないようにする。また、“制御後出力”であれば、ログの出力が要求されたタイミングではログ出力を行わずに待機することによってログ出力の要求元の処理が次のステップに進まないようにする。そして、指定されたログ出力の順番が満たされた段階でログの出力を行うと共にログの出力の完了を通知する。
【００２６】
“制御前後出力”、“制御前出力”、“制御後出力”いずれの場合においても、指定された制御順番が満たされるまで、要求されたログ出力に対する完了通知を行わずに、要求元の処理が次のステップに進まないようにすることは同一である。このような制御が、本実施形態に係る要旨の１つである。
【００２７】
図５は、図４に示す“ログ出力順番登録命令”によってログ制御部１２０に登録される情報であるログ登録順番テーブルを示す図である。図５に示すように、指定された通りの情報、即ち、ログ出力の命令を識別するための識別子となるログの文字列が、ログ出力の実行タイミングを指定する情報と関連付けられた情報が登録される。
【００２８】
“追加処理登録命令”は、上述した“追加処理関数Ｃ”によって提供される機能の実行条件を登録する命令である。図４の例の場合、“ａａａ”という文字列のログ出力が実行される前に、追加処理関数Ｃを実行するべきことが登録される。図６は、このような“追加処理登録命令”によってログ制御部１２０に登録される情報である追加処理テーブルを示す図である。図６に示す追加処理テーブルが追加処理設定情報として用いられる。図６に示すように、指定された通りの情報、即ち、追加処理の内容及び追加処理の実行タイミングを指定する情報が登録される。
【００２９】
“関数実行命令”は、図３に示す“関数Ａ”や“関数Ｂ”等のプロダクトコードに含まれる関数の実行命令である。図４の例の場合、“関数Ａ”、“関数Ｂ”が非同期で実行されることが指定されている。これにより、“関数Ａ”、“関数Ｂ”によって実行される処理は、並列して実行される処理となる。
【００３０】
ログ制御部１２０は、上述したようにテスト実行部１１０からのログ出力の要求に基づいてログ出力を行う。その際、出力されるログの内容に基づいた出力順番の制御を行うことにより、間接的にテスト対象のプログラムに含まれる処理の実行順を制御する。この機能が本実施形態に係る要旨の１つである。
【００３１】
順番制御部１２１は、テスト実行部１１０から受け付けたログ出力の要求に基づいて出力順番の確認や追加処理の有無の確認を行い、出力順番が満たされたらログ出力部１２２にログ出力を実行させるための処理を行う。ログ出力部１２２は、順番制御部１２１からの命令に従ってログ出力を実行する。ログ出力部１２２によるログ出力の結果、出力対象の文字列等の情報が特定のデータに書き出され、若しくはＬＣＤ６０に表示される。
【００３２】
登録順番情報管理部１２３は、ログ出力の実行順番の管理を行う。そのため、登録順番情報管理部１２３は、図４において説明した“ログ出力順番登録命令”に従ってログ出力の実行順番の登録要求を受けると、図５において説明したようなログ登録順番テーブルを登録順番記憶部１２５に記憶させる。
【００３３】
また、テスト実行部１１０からログ出力要求を受けた順番制御部１２１は、指定された文字列のログの出力順番を登録順番情報管理部１２３に確認する。登録順番情報管理部１２３は、登録順番記憶部１２５に記憶したログ登録順番テーブルに基づいてログ出力の実行順番を確認して順番制御部１２１に応答する。
【００３４】
追加処理管理部１２４は、追加処理の管理を行う。そのため、追加処理管理部１２４は、図４において説明した“追加処理登録命令”に従って追加処理の登録要求を受けると、図６において説明したような追加処理テーブルを登録順番記憶部１２５に記憶させる。
【００３５】
登録順番記憶部１２５は、図５において説明したような登録順番テーブルや、図６において説明したような追加処理テーブルを記憶する記憶部であり、図１において説明したＨＤＤ４０等により実現される。そして、登録順番記憶部１２５は、登録順番情報管理部１２３や、追加処理管理部１２４からの要求に応じて情報を提供する。
【００３６】
次に、図３〜図６に示す情報に基づいて動作検証が実行された場合の動作について図７を参照して説明する。図７に示すシーケンスが実行される際の前提として、テスト実行部１１０は、テスト対象記憶部１１１に記憶されたプロダクトコード及びテストコードのビルドを行い、それらのソースコードに基づいた実行ファイルを生成してプログラムを実行する。
【００３７】
図７に示すように、まずはテストコードによって提供されるモジュール（以降、テストコードモジュールとする）が、ログ制御順登録（Ｓ７０１）及び追加処理登録（Ｓ７０３）を実行する。Ｓ７０１、Ｓ７０３の処理は、図４に示す“ログ出力順番登録命令”や“追加処理登録命令”に相当する処理に従って実行される。
【００３８】
テスト実行部１１０からログ制御順登録の要求を受けたログ制御部１２０においては、登録順番情報管理部１２３が順番制御部１２１から要求を受け、図５に示すような登録順番テーブルを登録順番記憶部１２５に記憶させる（Ｓ７０２）。また、テスト実行部１１０から追加処理登録の要求を受けたログ制御部１２０においては、追加処理管理部１２４が順番制御部１２１から要求を受け、図６に示すような追加処理テーブルを登録順番記憶部１２５に記憶させる（Ｓ７０４）。
【００３９】
続いて、テストコードモジュールは、図４に示す“関数実行命令”に相当する処理に従って“関数Ａ”、“関数Ｂ”夫々によって実現されるモジュールの処理を開始させる（Ｓ７０５）。上述したように、図４に示す“関数実行命令”においては“関数Ａ”、“関数Ｂ”は非同期で実行される。従って、関数Ａ、関数Ｂ夫々のモジュールは、独立して図３に示すソースコードの記述内容に従った処理を開始する。
【００４０】
図７に示すように、関数Ｂのモジュールはまず“ｂｂｂ”という文字列のログの出力要求を行う（Ｓ７０６）。このログの出力要求は、ログ制御部１２０のログ出力部１２２によって提供されるログ出力機能の呼び出し命令である。従って、関数Ｂのモジュールはログ制御部１２０に対して“ｂｂｂ”という文字列のログの出力要求を行い、その応答を待つこととなる。
【００４１】
“ｂｂｂ”というログの出力要求を受けたログ制御部１２０においては、ログ出力の要求を受けた文字列に基づいて順番の制御や追加処理の制御が行われる。ここで、ログ出力の要求を受け付けたログ制御部１２０の動作について、図８を参照して説明する。
【００４２】
図８に示すように、ログ制御部１２０は、ログ出力の要求を受け付けると（Ｓ８０１）、順番制御部１２１が、上述したように登録順番情報管理部１２３に問い合わせることによって、その出力対象の文字列が順番の制御対象であるか否か確認する（Ｓ８０２）。その結果、制御対象でなければ（Ｓ８０２／ＮＯ）、順番制御部１２１は、ログ出力部１２２に対して要求に応じたログ出力を実行させ（Ｓ８０９）、ログ出力の要求元に対して完了通知を行って（Ｓ８０８）処理を終了する。
【００４３】
他方、制御対象であった場合（Ｓ８０２／ＹＥＳ）、次に順番制御部１２１は、ログ出力のタイミングとして、制御前の出力が指定されているか否か確認する（Ｓ８０３）。その結果、“制御前後出力”若しくは“制御前出力”のように、制御前の出力が指定されていた場合（Ｓ８０３／ＹＥＳ）、順番制御部１２１は、ログ出力部１２２にログ出力を実行させる（Ｓ８０４）。
【００４４】
制御前の出力が指定されていない場合（Ｓ８０３／ＮＯ）、若しくはＳ８０４の処理が完了した場合、順番制御部１２１は、要求された文字列のログの出力順番の実行順に到達したか否か確認する（Ｓ８０５）。Ｓ８０５の処理は、換言すると、要求された文字列のログの出力順番の実行順よりも早い実行順のログ出力及び完了通知が全て完了したか否か確認する処理である。
【００４５】
順番制御部１２１は、Ｓ８０１において要求されたログ出力の実行順に到達するまで待機し（Ｓ８０５／ＮＯ）、実行順に到達すると（Ｓ８０５／ＹＥＳ）、ログ出力のタイミングとして、制御前の出力が指定されているか否か確認する（Ｓ８０６）。その結果、“制御前後出力”若しくは“制御後出力”のように、制御後の出力が指定されていた場合（Ｓ８０６／ＹＥＳ）、順番制御部１２１は、ログ出力部１２２にログ出力を実行させる（Ｓ８０７）。
【００４６】
制御後の出力が指定されていない場合（Ｓ８０６／ＮＯ）、若しくはＳ８０７の処理が完了した場合、順番制御部１２１は、Ｓ８０１において要求されたログ出力の要求元に対して完了通知を行い（Ｓ８０８）、処理を終了する。このような処理により、ログ出力要求を受けたログ制御部１２０の動作が完了する。
【００４７】
ここで、図６に示すように登録された追加処理テーブルに基づく追加処理の制御は、図８に示すＳ８０４及びＳ８０７、即ち、ログ出力のタイミングで実行される。図９を参照して、図８のＳ８０４、Ｓ８０７の動作の詳細について説明する。
【００４８】
図９に示すように、ログ出力に際して、順番制御部１２１は、追加処理管理部１２４に対して、追加処理のタイミングとして、制御前の実行が指定されているか否か確認する（Ｓ９０１）。Ｓ９０１の判断の結果、制御前の実行が指定されていれば、順番制御部１２１は、指定されている追加処理の実行を制御する（Ｓ９０２）。
【００４９】
制御前の実行が指定されていなかった場合（Ｓ９０１／ＮＯ）、若しくはＳ９０２の処理が完了した場合、順番制御部１２１は、ログ出力部１２２にログ出力を実行させる（Ｓ９０３）。その後、順番制御部１２１は、追加処理管理部１２４に対して、追加処理のタイミングとして、制御後の実行が指定されているか否か確認する（Ｓ９０４）。
【００５０】
Ｓ９０４の判断の結果、制御後の実行が指定されていれば、順番制御部１２１は、指定されている追加処理の実行を制御する（Ｓ９０５）。制御後の実行が指定されていなかった場合（Ｓ９０４／ＮＯ）、若しくはＳ９０５の処理が完了すると、順番制御部１２１は、ログ出力に際しての動作を完了する。
【００５１】
図７に戻り、シーケンスの説明を再開する。図７の例の場合、追加処理は図６に示すように“ｂｂｂ”のログ出力には指定されていない。そして、図５に示すように“ｂｂｂ”のログ出力は制御前後の出力が指定されている。従って、図８、図９に示すような動作に基づき、ログ制御部１２０においては、ログ出力部１２２が“ｂｂｂ”の文字列の制御前出力を実行する（Ｓ７０８）。
【００５２】
そして、図５に示すように、“ｂｂｂ”のログ出力は２番目であり、未だ１番目の“ａａａ”のログ出力が完了していないため、“ｂｂｂ”のログ出力に対する完了通知は行わずに待機する。他方、関数Ａのモジュールは、関数Ｂのモジュールの動作とは非同期で、図３に示すソースコードに記述されたように、変数ａ１のインクリメント処理を行い（Ｓ７０７）、続いて“ａａａ”という文字列のログ出力要求を行う（Ｓ７０９）。
【００５３】
関数Ａのモジュールから“ａａａ”のログ出力要求を受けたログ制御部１２０は、図８、図９において説明した動作を実行する。この場合、ログ制御部１２０は、図６において「“ａａａ”出力前  追加処理関数Ｃ」と記述されている情報に基づき、まず追加処理関数Ｃによって実現されるモジュールの処理を実行させる（Ｓ７１０）。即ち、Ｓ７１０においては、順番制御部１２１が追加処理実行制御部として機能する。これにより、関数Ｃのモジュールは、図３に示すソースコードのように、“ｃｃｃ”という文字列のログ出力をログ制御部１２０に要求する（Ｓ７１１）。
【００５４】
ログ制御部１２０においては、“ｃｃｃ”という文字列のログ出力の要求を受けて図８において説明した動作が同様に実行される。“ｃｃｃ”という文字列は順番制御対象とはなっていないため、ログ出力部１２２がそのまま“ｃｃｃ”という文字列のログ出力を行い、順番制御部１２１は関数Ｃのモジュールに対して完了通知を行う。
【００５５】
続いて、順番制御部１２１は、ログ出力部１２２に対して順番制御前のログ出力を実行させる（Ｓ７１４）。図５に示すように、“ａａａ”の文字列のログ出力の制御順は１番目であり、順番は満たされている。そのため、順番制御部１２１は、続いて順番制御後のログ出力をログ出力部１２２に実行させ（Ｓ７１５）、Ｓ７０９におけるログ出力要求の要求元である関数Ａのモジュールに対して完了通知を行う（Ｓ７１６）。これにより、関数Ａのモジュールにおいては、Ｓ７０９におけるログ出力の要求処理の次のステップに進むことが可能となる。
【００５６】
他方、Ｓ７１５において“ａａａ”の文字列のログ出力が実行されたことにより、図５に示すようにログ出力の制御順において１番目に指定されたログ出力が実行されたこととなる。これにより、２番目に指定された“ｂｂｂ”の文字列のログ出力の実行順に到達することとなる。従って、順番制御部１２１は、“ｂｂｂ”の文字列のログ出力要求について、図８のＳ８０５において“ＹＥＳ”の判断を行い、順番制御後のログ出力をログ出力部１２２に実行させる（Ｓ７１７）。そして、Ｓ７０６におけるログ出力要求の要求元である関数Ｂのモジュールに対して完了通知を行う（Ｓ７１８）。
【００５７】
これにより、関数Ｂのモジュールにおいては、Ｓ７０６におけるログ出力の要求処理の次のステップに進むことが可能となる。その結果、図３に示すソースコードの記述の通り、変数ｂ１のデクリメント処理を実行する（Ｓ７１８）。このような処理により、本実施形態に係る動作検証装置の動作が完了する。
【００５８】
関数Ｂの処理である変数ｂ１のデクリメント処理は、図３に示すように、“ｂｂｂ”という文字列のログ出力の後に実行される。そして、“ｂｂｂ”のログ出力の順番は“ａａａ”のログ出力の後に指定されており、“ａａａ”のログ出力は図３に示すように変数ａ１のインクリメント処理の後の処理である。
【００５９】
結果的に、関数Ｂの処理である変数ｂ１のデクリメント処理を、確実に関数Ａの処理である変数ａ１のインクリメント処理の後に実行させることが可能となる。このように、ログ制御部１２０を介するログ出力処理をソースコード中に埋め込み、そのログ出力の順番を制御することによって、並列して実行される処理の実行順を制御することが本実施形態に係る要旨の１つである。
【００６０】
図１０は、図７の処理が実行された結果のログ出力の態様として、ログがＬＣＤ６０に表示される場合の態様を示す図である。図１０に示すように、“ｂｂｂ”、“ｃｃｃ”、“ａａａ”、“ａａａ”、“ｂｂｂ”の順でログ出力が実行されたことが分かる。このような表示のうち、１つめの“ｂｂｂ”及び１つめの“ａａａ”は、制御前出力によって出力されるログである。
【００６１】
図１０の例においては、１つめの“ａａａ”や、それに伴って追加処理で出力される“ｃｃｃ”よりも先に“ｂｂｂ”が出力されていることが分かる。従って、Ｓ７０６の処理が、Ｓ７０７よりも先に処理されたことを間接的に確認することが可能である。このような間接的な処理順番の確認が、ログの制御前出力の意義である。
【００６２】
尚、図３、図４及び図７の例においては、テストコード中にプロダクトコード内の関数の実行命令が含まれる場合を例としている。しかしながら、これは一例であり、プロダクトコード内に含まれるテスト対象の関数を実行するための命令をプロダクトコード内に含め、その命令を起動するための命令をテストコード内に含めても良い。
【００６３】
いずれの場合であっても、動作検証を行う対象のプログラムであって、並列して実行される複数のプログラム内にログ出力命令を組み込み、出力対象のログの内容に応じた順番制御を行うことによって、上記の目的を達成することが可能である。
【００６４】
次に、低確率で発生する障害の例及びその障害を再現するためのログ出力命令の挿入、順番制御について説明する。図１１は、ログ出力命令が挿入される前の本来のプロダクトコードを示す図である。図１１に示すプロダクトコードは、原稿を撮影するスキャナにおいて、命令に応じてスキャナエンジンを制御してスキャンを実行する機能を提供するプログラムの例である。図１１に示すように、本来のプロダクトコードには、関数Ａ及び関数Ｂの２つの関数が含まれる。
【００６５】
関数Ａは、図１１に示すように、「関数Ｂからイベント通知を受けたら動作開始」する処理、「イベント通知」する処理を含む。また、関数Ｂは、「命令に応じて読取動作指示」する処理、「エンジンからイベント通知を受けたら関数Ａにイベント通知」する処理、「エンジンから完了通知を受けたら完了通知」する処理を含む。
【００６６】
図１２は、図１１に示すプロダクトコードのテスト動作を示すシーケンス図である。図１２に示すように、まずはテストコードのモジュールによって関数Ａ、関数Ｂが実行され（Ｓ１２０１）、更に、関数Ｂに対して読取命令が行われる（Ｓ１２０２）
【００６７】
これにより、関数Ｂのモジュールが読取命令を受けてスキャナエンジンを制御するエンジンドライバに対して読取動作の指示を行う（Ｓ１２０３）。これにより、エンジンドライバは、読取動作のイベントが発生したことを関数Ｂのモジュールに対して通知し（Ｓ１２０４）、スキャナエンジンを制御してスキャンを実行させる。
【００６８】
エンジンドライバからイベント通知を受けた関数Ｂのモジュールは、関数Ａのモジュールに対してイベント通知を行う（Ｓ１２０５）。これにより、関数Ａのモジュールは、テストコードのモジュールに対してイベント通知を行う（Ｓ１２０６）。
【００６９】
他方、スキャナエンジンを制御してスキャンを実行させたエンジンドライバは、スキャンが完了すると読取動作の指示元である関数Ｂのモジュールに対して完了通知を行う（Ｓ１２０７）。完了通知を受けた関数Ｂのモジュールは、テストコードのモジュールに対して完了通知を行う（Ｓ１２０８）。結果的に、テストコードのモジュールは、スキャンが開始される際のイベント通知を受けた後に、完了通知を受けることとなる。
【００７０】
Ｓ１２０４からＳ１２０７の処理の間にはスキャンを実行する期間があり、相応の期間が空いている。そのため、大半の場合にはＳ１２０６の処理は、Ｓ１２０８よりも先に実行される。
【００７１】
しかしながら、Ｓ１２０６の処理とＳ１２０８の処理とは直接関係しているわけではなく、順番が規定されているわけではないため、非常に低頻度ではあるが、Ｓ１２０８の処理がＳ１２０６の処理を追い越してしまう場合がある。その場合、テストコードのモジュールは、スキャンが開始される際のイベント通知を受ける前に、完了通知を受けることとなる。そのような状態を再現するために、本実施形態に係る動作検証の方法が用いられる。
【００７２】
図１３は、図１１に示すプロダクトコードに対して、順番制御のためのログ出力命令を埋め込んだ例を示す図である。図１３に示すように、関数Ａには、「イベント通知」の処理の前に「“ｅｖｅｎｔ”という文字列をログ出力」する処理が組み込まれる。また、関数Ｂには、「エンジンから完了通知を受けたら完了通知」の処理の後に「“ｒｅｓｐｏｎｓｅ”という文字列をログ出力」する処理が組み込まれる。
【００７３】
図１４は、図１３に示すように埋め込まれたログ出力命令の順番制御に対応したログ登録順番テーブルを示す図である。図１４に示すように、“ｒｅｓｐｏｎｓｅ”のログ出力が１番目で、“ｅｖｅｎｔ”のログ出力が２番目であることが指定されると共に、いずれも制御後出力であることが指定される。
【００７４】
図１５は、図１３に示すようにログ出力命令が埋め込まれたプロダクトコードのテスト動作を示すシーケンス図である。図１５に示すように、Ｓ１５０１〜Ｓ１５０５については、図１２のＳ１２０１〜Ｓ１２０５と同様に処理が実行される。
【００７５】
関数Ｂのモジュールからイベント通知を受けた関数Ａのモジュールは、図１３に示すように関数Ｂのモジュールからのイベント通知に応じて動作を開始し、まずはログ制御部１２０に対して“ｅｖｅｎｔ”という文字列のログ出力要求を行う（Ｓ１５０６）。ログ制御部１２０は、関数Ａのモジュールからログ出力要求を受けると、図８の動作を実行する。
【００７６】
しかしながら、図１４に示すように“ｅｖｅｎｔ”のログ出力は“ｒｅｓｐｏｎｓｅ”のログ出力の後に順番が登録されており、且つ制御後出力である。そのため、ログ制御部１２０は、図８のＳ８０５において“ＮＯ”の判断をし、ログ出力の制御順番が満たされるまで待機する。
【００７７】
他方、エンジンドライバは、スキャンが完了すると読取動作の指示元である関数Ｂのモジュールに対して完了通知を行う（Ｓ１５０７）。完了通知を受けた関数Ｂのモジュールは、テストコードのモジュールに対して完了通知を行う（Ｓ１５０８）。続いて、関数Ｂのモジュールは、図１４に示すように、ログ制御部１２０に対して“ｒｅｓｐｏｎｓｅ”という文字列のログ出力要求を行う（Ｓ１５０９）。
【００７８】
ログ制御部１２０は、関数Ｂのモジュールからログ出力要求を受けると、図８の動作を実行する。図１４に示すように、“ｒｅｓｐｏｎｓｅ”のログ出力は１番目に順番が登録されていると共に制御後出力であるため、ログ出力部１２２が“ｒｅｓｐｏｎｓｅ”のログ出力を実行する（Ｓ１５１０）。そして、順番制御部１２１が関数Ｂのモジュールに対して完了通知を行う（Ｓ１５１１）。
【００７９】
これにより、Ｓ１５０６において要求を受け付けた“ｅｖｅｎｔ”のログ出力の順番が満たされることとなるため、ログ出力部１２２が“ｅｖｅｎｔ”のログ出力を実行する（Ｓ１５１２）。そして、順番制御部１２１が関数Ａのモジュールに対して完了通知を行う（Ｓ１５１３）。
【００８０】
ログ出力の完了通知を受けた関数Ａのモジュールにおいては、図１３に示す次のステップに進み、テストコードのモジュールに対してイベント通知を行う（Ｓ１５１４）。このような制御により、関数Ｂのモジュールが実行する完了通知が、関数Ａのモジュールが実行するイベント通知を追い越してしまう状況を再現することが可能となる。
【００８１】
以上、説明したように、本実施形態に係る動作検証方法においては、並列して実行される処理夫々に対して、外部のモジュールにログ出力を要求するための命令を埋め込む。そのログ出力の要求は、ログ出力が完了するまで次の処理に進めないような命令となっている。
【００８２】
そして、ログ出力の要求を受け付ける外部のモジュールは、指定された順番の通りにログ出力の完了通知を行うように制御する。これにより、並列して実行される処理夫々の処理の順番は、命令が埋め込まれたログ出力の順番が制御されることによって間接的に制御されることとなる。従って、処理順序の入れ替わりにより低確率で発生するプログラムの動作障害を確実に再現することが可能となる。
【００８３】
尚、上記実施形態においては、テスト対象のプロダクトコードに対して、ログ制御部１２０にログ出力を要求するための命令を埋め込み、ログ制御部１２０がログ出力の順番を制御する態様を説明した。ログ出力を要求するための命令は、ログ制御部１２０から完了通知を受けなければ完了せず、そのためプロダクトコード側の処理においては、次の処理に進むことが出来ない。これにより、ログ制御部１２０が、プロダクトコードにおいて並列して実行される処理の実行順を制御することが可能となる。
【００８４】
即ち、ログ制御部１２０において順番制御部１２１が通知取得部及び応答部として機能し、ログ出力部１２２が処理実行部として機能する場合を例として説明した。また、図５に示すログ登録順番テーブルが優先度設定情報として用いられる場合を例として説明した。
【００８５】
しかしながら、プロダクトコードに埋め込む命令は、ログ出力を要求するための命令に限らず、外部のモジュールに特定の識別子が指定された通知を行い、その通知に対する応答を待って次の処理に進むことが許可されるような命令であれば良い。そして、そのような命令によって出力された通知に対する応答の順番が制御されることにより、上記と同様の効果を得ることが可能である。
【００８６】
従って、上記実施形態においては、そのような命令をログ出力要求の実行命令とし、指定される特定の識別子として出力されるログの内容を示す文字列として説明したが、これは一例である。何らかの識別子を指定した通知を出力する命令をプロダクトコードに埋め込み、ログ制御部１２０に相当するモジュールがその通知を受け付けて応答の順番を制御することにより、上記と同様の効果を得ることが可能である。
【００８７】
他方、そのように埋め込む命令をログ出力の要求とすることにより、出力されたログを確認することによって実際にどのような順番で処理が実行されたかを確認することが可能となる。従って、順番制御のための、外部のモジュールに処理を要求し、その要求の完了通知をまって次の処理に進むことが許可されるような命令は、ログ出力を要求する命令であることが好ましい。
【００８８】
また、本実施形態において順番制御の対象となるのは並列して実行される処理である。従ってマルチスレッドの処理であることは前提である。上記実施形態の場合、図３、図４に示すようなプロダクトコード及びテストコードはまとめてビルドされ、１つのプロセスとして実行される。そのような１つのプロセスの中でマルチスレッドにより並列して実行される処理が順番制御の対象となる。
【００８９】
しかしながら、マルチプロセスであっても同様に適用可能である。例えば、図３に示すプロダクトコードに含まれる“関数Ａ”、“関数Ｂ”及びテストコードが夫々異なる実行ファイルとしてビルドされて異なるプロセスとして実行される場合が考えられる。この場合、“関数Ａ”、“関数Ｂ”夫々に対応する処理は異なるプロセスで並列して実行されることとなる。
【００９０】
このような場合であっても、異なるプロセスであるテストコードのプロセスに対してログ出力を要求するような命令を“関数Ａ”、“関数Ｂ”夫々に組み込むことにより、上記と同様に順番制御を行うことが可能となる。
【００９１】
また、上記実施形態においては、追加処理管理部１２４を設けることにより、追加処理を実現する場合を例として説明した。これは、図１１、図１３に示すように、ソースコードの編集が可能なプログラム以外の外部プログラムとの連動が求められる場合において、外部プログラムの動作によって実行される処理を代行する等の効果がある。従って、追加処理管理部１２４は必須ではなく、必要に応じて設ければ良い。
【符号の説明】
【００９２】
１  動作検証装置
１０  ＣＰＵ
２０  ＲＡＭ
３０  ＲＯＭ
４０  ＨＤＤ
５０  Ｉ／Ｆ
６０  ＬＣＤ
７０  操作部
８０  バス
１１０  テスト実行部
１１１  テスト対象記憶部
１２０  ログ制御部
１２１  順番制御部
１２２  ログ出力部
１２３  登録順番情報管理部
１２４  追加処理管理部
１２５  登録順番記憶部
【先行技術文献】
【特許文献】
【００９３】
【特許文献１】特開２０１２−１２８４８９号公報
【図１】
0006405972.tif 000002
【図２】
0006405972.tif 000003
【図３】
0006405972.tif 000004
【図４】
0006405972.tif 000005
【図５】
0006405972.tif 000006
【図６】
0006405972.tif 000007
【図７】
0006405972.tif 000008
【図８】
0006405972.tif 000009
【図９】
0006405972.tif 000010
【図１０】
0006405972.tif 000011
【図１１】
0006405972.tif 000012
【図１２】
0006405972.tif 000013
【図１３】
0006405972.tif 000014
【図１４】
0006405972.tif 000015
【図１５】
0006405972.tif 000016