以下に、本願の開示する制御プログラム、制御方法および制御装置の実施例を図面に基づいて詳細に説明する。なお、この実施例によりこの発明が限定されるものではない。
[全体構成]
図1は、実施例1に係る検証装置を説明する図である。図1に示す検証装置10は、ソフトウェアの開発段階において、ソフトウェアが正常に動作するかを検証するサーバなどの装置である。
まず、検証装置10は、検証データ生成用プログラムを実行して、ストレージ装置50に検証用の検証データを生成する。具体的には、検証装置10は、所定の処理を実行する検証対象プログラムと同様の処理を実行する検証データ生成用プログラムを実行する。検証データ生成用プログラムは、ストレージ装置50がOS等の情報を管理する管理領域をオープンし、ストレージ装置50のデータ領域に対してデータの書き込みやデータの読出しを実行して、ストレージ装置50の検証データを生成する。
次に、検証装置10は、検証対象プログラムを実行して検証処理を行う。具体的には、検証装置10は、検証用プログラムを実行して、検証用プログラムによって検証対象プログラムに所定の処理を実行させる。検証用プログラムは、検証データ生成用プログラムを同様の処理を実行し、書き込み命令(以下、ライト命令と記載する場合がある)や読出し命令(以下、リード命令と記載する場合がある)を指示するコマンド等を検証対象プログラムに発行する。検証対象プログラムは、検証用プログラムから受け付けたコマンド等にしたがって、ストレージ装置50の管理領域をオープンし、データ領域に対してデータの書き込みや読出しを実行する。
このように、検証装置10は、検証対象プログラムを各開発段階で検証する際に、検証データ生成用プログラムで検証データを生成した後に検証処理を実行する。そして、検証装置10は、書き込みや読出しが正常に終了するか、意図するデータを書き込みまたは読み出すことができるかなどを検証する。なお、実施例では、検証データ生成プログラムと検証対象プログラムとをまとめて「検証対象ソフトウェア」と記載する場合がある。
実施例1に係る検証装置10は、ストレージ装置50に対してデータの読み書き命令を実行する検証対象ソフトウェアに、読み書き命令を含む所定の処理を実行させる。このとき、検証装置10は、当該所定の処理実行時に、ストレージ装置50への書き込み命令が行われ、かつ、該書き込み命令後に読出し命令が行われるデータを特定する情報を記憶部に記憶する。
続いて、検証装置10は、情報を記憶部に記憶した後に所定の処理を検証対象ソフトウェアに実行させた際に、当該所定の処理時にライト命令を受けたデータのうち、記憶部に記憶される情報に基づき特定されるデータをストレージ装置50や検証装置10内のワークファイル等に記憶する。
つまり、検証装置10は、1回目の検証時に検証対象ソフトウェアがライト後にリードするデータを特定し、2回目からは特定したデータに対してだけ実際にライトを実行する。この結果、検証装置10は、検証に要するデータ量を減らし、検証精度も向上させることができる。
[検証装置の機能構成]
図2は、実施例1に係る検証装置の機能構成を示す機能ブロック図である。図2に示すように、検証装置10は、通信制御部11、記憶部12、制御部20を有する。
通信制御部11は、他の装置との通信を制御する処理部であり、例えば、ネットワークインタフェースカードなどである。例えば、通信制御部11は、ストレージ装置50に対してデータのライト命令やリード命令等を送信し、命令の実行結果をストレージ装置50から受信する。
記憶部12は、制御部20が実行するプログラム等を記憶する記憶装置であり、例えばハードディスクやメモリなどである。この記憶部12は、プログラムDB13、リード領域テーブル14、ワークテーブル15、ワークファイル16等を記憶する。
プログラムDB13は、制御部20が実行する各種プログラムを記憶する。例えば、プログラムDB13は、検証データ生成用プログラム、検証対象プログラム、検証用プログラム、リード領域を特定するトレースプログラム、ワークファイル等を作成する準備プログラム等を記憶する。
リード領域テーブル14は、所定の処理実行時に、ストレージ装置50へのライト命令が行われ、かつ、該ライト命令後にリード命令が行われるデータを特定する情報を記憶する。具体的には、リード領域テーブル14は、検証対象ソフトウェアがリード命令を発行してデータを読み出すストレージ装置50の領域を記憶する。
図3は、リード領域テーブルに記憶される情報の例を示す図である。図3に示すように、リード領域テーブル14は、ブロック番号とリードされたか否かを示す情報とを対応付けて記憶する。図3の例では、ブロック番号0、ブロック番号1、ブロック番号64がリードされた領域であることを示している。
一例を挙げると、オフセットが128から1152の領域にデータの書き込みが実行された後、データの読出しが実行された場合、ブロック番号0と1がリード領域として記録(ON)される。同様に、オフセットが6553から6579の領域にデータの書き込みが実行された後、データの読出しが実行された場合、ブロック番号64がリード領域として記録される。
ワークテーブル15は、ワークファイルの情報を記憶する。図4は、ワークテーブルに記憶される情報の例を示す図である。図4に示すように、ワークテーブル15は、ワークファイル16内のブロック番号と、ストレージ装置50において実際に書き込み後に読み出されたブロック番号とを対応付けて記憶する。図4の例では、ワークファイル16内のブロック番号0、1、2がそれぞれストレージ装置15内のブロック番号0、1、64に対応付けられている。
ワークファイル16は、検証対象ソフトウェアが検証処理時にデータの書き込みを実行し、書き込み後に読出しを実行した領域を記憶する一時領域である。すなわち、ワークファイル16は、検証対象ソフトウェアが検証処理時にリードする領域を連続領域で記憶する。
上記例で説明すると、ワークファイル16は、ブロック番号0の領域に、ストレージ装置50のブロック番号0に対応する領域に記憶されていたデータを記憶する。同様に、ワークファイル16は、ブロック番号2の領域に、ストレージ装置50のブロック番号64に対応する領域に記憶されていたデータを記憶する。
制御部20は、プロセッサなどであり、検証データ生成部21、特定部22、ワークファイル生成部23、検証実行部24を有する。なお、各処理部は、電子回路の一例やプロセッサが実行するプロセスなどの一例である。
検証データ生成部21は、検証対象の検証データを生成する処理部である。例えば、検証データ生成部21は、検証対象プログラムの検証を実行する前に、検証対象プログラムと同じ処理を実行する検証データ生成用プログラムをプログラムDB13から読み出して実行する。
1回目の実行時には、検証データ用生成プログラムは、ストレージ装置50に対して、管理領域のオープン、データ領域へのデータ書き込みやデータ読み出しを実行して、検証データを生成する。2回目以降は、応答制御部24bによって応答が制御される。
特定部22は、検証対象ソフトウェアが読み出すデータの領域を特定する処理部である。例えば、特定部22は、1回目の検証データ生成用プログラムの動作を監視し、検証データ生成用プログラムがデータを書き込んだ後に読出したデータの領域を特定する。そして、特定部22は、特定した領域の情報をリード領域テーブル14に格納する。
同様に、特定部22は、ソフトウェア実行部24aが実行した1回目の検証対象プログラムの動作を監視し、検証対象プログラムがデータを書き込んだ後に読出したデータの領域を特定する。そして、特定部22は、特定した領域の情報をリード領域テーブル14に格納する。
なお、ここでは、検証前に検証データ生成用プログラムを実行してテストデータを生成する例を説明したが、検証データ生成用プログラムを用いない検証手法においても適用することができる。その場合、ストレージ装置50にはすでに検証データが生成されているので、特定部22は、初回の検証対象プログラムの処理を監視し、ストレージ装置50から読み出されるデータの領域を特定する。
ワークファイル生成部23は、リード領域テーブル14に格納された情報に基づいて、ワークファイル16を生成する処理部である。具体的には、ワークファイル生成部23は、リード領域テーブル14を参照して、リードされた順に、リードされた領域にワークファイル上のブロック番号を割り振って、ワークテーブル15を生成する。
そして、ワークファイル生成部23は、ワークテーブル15を参照して、ワークファイル16内に、リードされたストレージ装置50の領域を割り当てる。すなわち、ワークファイル生成部23は、ワークファイル16内に、検証データ生成用プログラムまたは検証対象プログラムがストレージ装置50からリードしたデータを格納する。
ここで、ワークファイルの生成の一例を説明する。図5は、ワークファイルの生成を説明する図である。図5に示すように、検証装置10は、アクセステーブルとブロックテーブルとを記憶部12等に保持する。アクセステーブルは、検証対象ソフトウェアごとに、検証対象ソフトウェアがアクセスするファイル名を記憶する。ブロックテーブルは、検証対象ソフトウェアがアクセスするファイル名ごとに、ブロック数とリード対象のブロック数とを記憶する。
また、アクセステーブルの各ファイルは、ポインタによってブロックテーブルに関連付けられており、ブロックテーブルの各ファイル名は、ポインタによってリード領域テーブル14に関連付けられている。なお、各テーブルは、管理者等が事前に生成してもよく、制御部20が各プログラムを解析して生成することもできる。また、各テーブルは、記憶部12等に記憶される。
このような状態において、特定部22は、検証対象ソフトウェアが実行されると、検証対象ソフトウェアがアクセスするファイル名をアクセステーブルから検索し、検索された各ファイルのブロック数とリード対象のブロック数とをブロックテーブルから特定する。そして、特定部22は、検証対象ソフトウェアがアクセスするブロック総数の合計とリード対象のブロック総数の合計とから、リード対象領域の割合を算出する。これは、必要に応じて、テスト実施者がテストプログラムの実行単位をさらに分割または実行単位にまとめることを行う場合に使用できる。なお、特定部22は、テストプログラムごと、または、分割したテストプログラムごとにディスクの使用率をディスプレイ等に表示させることもできる。
図5の例では、特定部22は、検証対象ソフトウェアがアクセスするブロックの総数が150個、そのうちリード対象のブロック総数が20となり、リードされるブロックの割合を「20/150×100≒13%」と算出する。
さらに、特定部22は、各ファイルへのアクセスを監視して、リードされたブロック番号にフラグ(ON)を立てる。図5の例では、特定部22は、ファイル名「/urawa/ponte/eme10」について、ブロック番号1、12、13、22、50がリードされたことを検出している。
その後、ワークファイル生成部23は、リードされた領域にワークファイル16上のブロック番号を割り振って、ワークテーブル15を生成し、ワークファイル16内に、リードされたストレージ装置50の領域を割り当てる。
図5の例では、ワークファイル生成部23は、ストレージ装置50のブロック1、12、13、22、50に、ワークファイル16内のブロック番号1、2、3、4、5を割り振る。そして、ワークファイル生成部23は、ストレージ装置50のブロック1、12、13、22、50の各領域に記憶されるデータを、ワークファイル16内に領域が連続するように格納する。
図2に戻り、検証実行部24は、ソフトウェア実行部24aと応答制御部24bとを有し、これらによって、検証対象プログラムの動作を検証する処理部である。
ソフトウェア実行部24aは、検証対象プログラムを実行する処理部である。具体的には、ソフトウェア実行部24aは、検証データ生成部21による検証データ生成プログラムの実行が完了した場合に、検証用プログラムをプログラムDB13から読み出して実行する。検証用プログラムは、プログラムDB13に記憶される検証対象プログラムに対して、データの書き込みや読出しを実行する。
応答制御部24bは、1回目の検証時にストレージ装置50へのアクセスを実行し、2回目以降の検証時は、ワークファイル16を利用した応答制御を実行する処理部である。
具体的には、応答制御部24bは、1回目の検証時、すなわち1回目の検証対象ソフトウェアの実行時には、各プログラムのアクセス要求をストレージ装置50に対して実行して、その結果を応答する。ここで、アクセス要求とは、管理領域へのオープン要求、データ書き込み命令、データ読出し命令などである。
また、応答制御部24bは、2回目の検証時、すなわち2回目の検証対象ソフトウェアの実行時には、リード領域テーブル14を参照して応答を制御する。例えば、応答制御部24bは、検証対象ソフトウェアから管理領域へのオープン要求を受け付けた場合には、パススルーさせて、ストレージ装置50へ当該要求を送信する。
また、応答制御部24bは、検証対象ソフトウェアからワークテーブル15に記憶されない領域へのライト命令を受け付けた場合、ライト命令が正常に終了したことを検証対象ソフトウェアに応答する。つまり、応答制御部24bは、実際の書き込みを実行せずに、応答の送信だけを実行する。
また、応答制御部24bは、検証対象ソフトウェアからワークテーブル15に記憶される領域へのライト命令を受け付けた場合、ワークファイル16に対してデータの書き込みを実行し、その結果を応答する。例えば図4の例で説明すると、応答制御部24bは、ストレージ装置50上のブロック番号64へのライト命令を受信すると、ワークファイル16上のブロック番号2の領域にデータの書き込みを実行する。
また、応答制御部24bは、検証対象ソフトウェアからワークテーブル15に記憶されない領域へのリード命令を受け付けた場合、リード命令が正常に終了したことを検証プログラムに応答する。つまり、応答制御部24bは、実際の読出しを実行せずに、応答の送信だけを実行する。
また、応答制御部24bは、検証対象ソフトウェアからワークテーブル15に記憶される領域へのリード命令を受け付けた場合、ワークファイル16に対してデータの読出しを実行し、読み出したデータを検証対象ソフトウェアに応答する。例えば図4の例で説明すると、応答制御部24bは、ストレージ装置50上のブロック番号10487に対するリード命令を受信すると、ワークファイル16上のブロック番号3の領域に記憶されるデータを読み出して、検証対象ソフトウェアに応答する。
[処理の流れ]
次に、各処理部が実行する処理の流れについて説明する。ここでは、リード領域の特定処理、リード領域の割合を算出する処理、ワークファイルを生成する処理、検証処理の各処理について説明する。
(リード領域の特定処理)
図6は、リード領域を特定する処理の流れを示すフローチャートである。このフローチャートを実行することで、上記アクセステーブルやリード領域テーブル14が生成される。
図6に示すように、特定部22は、実行された検証対象ソフトウェアからデータアクセスを取得すると、当該データアクセスの種別を取得し(S101)、当該種別がライト命令であるかを判定する(S102)。
そして、特定部22は、ライト命令であると判定した場合(S102:Yes)、ディスクドライバへライト命令の実行を依頼し(S103)、ライト命令の復帰値をセットして呼出元に戻る(S104)。
一方、特定部22は、リード命令であると判定した場合(S102:No)、リード命令のパラメータであるオフセットやサイズから、読出し対象のブロック番号を特定する(S105)。続いて、特定部22は、リード命令のパラメータであるファイルディスクリプター等からファイル名を取得する(S106)。
そして、特定部22は、取得したファイルをキーにしてアクセステーブルを検索し、該当ファイルについてリード領域テーブル14の該当ブロック番号のフィールドをONにする(S107)。なお、特定部22は、リード領域テーブル14に該当するブロック番号がない場合、リード領域テーブル14を拡張して同様の処理を実行する。
その後、特定部22は、ディスクドライバへリード命令の実行を依頼し(S108)、リード命令の復帰値をセットして呼出元に戻る(S109)。
(リード領域の割合算出処理)
図7は、リード領域の割合を算出する処理の流れを示すフローチャートである。図7に示すように、特定部22は、ファイルに関するカウンターであるjに1をセットし(S201)、リード領域テーブル14を読み込む(S202)。続いて、特定部22は、変数であるwork1とwork2のそれぞれに1を設定する(S203)。
その後、特定部22は、ブロック番号の通番であるkに1を設定して(S204)、リード領域テーブル14(j,k)の値がONか否かを判定する(S205)。
ここで、特定部22は、リード領域テーブル(j,k)がONではない場合(S205:No)、work2にwork2+1の値を設定する(S206)。一方、特定部22は、リード領域テーブル(j,k)がONである場合(S205:Yes)、work1にwork1+1の値を設定する(S207)。
その後、特定部22は、kにk+1の値を代入し(S208)、ファイルの終端か否かを判定し(S209)、ファイルの終端ではない場合(S209:No)、S205に戻って以降を繰り返す。
一方、特定部22は、ファイルの終端である場合(S209:Yes)、リード対象ブロック数(i)にwork1の値を設定し(S210)、ブロック総数(i)にwork2の値を設定する(S211)。
その後、特定部22は、リード対象ブロック数(i)とブロック総数(i)とをブロックテーブルに格納した後(S212)、jにj+1の値を設定し(S213)、jがファイルの総数を超えているかを判定する(S214)。
そして、特定部22は、jがファイルの総数を超えていない場合(S214:No)、S202に戻って以降を繰り返す。一方、特定部22は、jがファイルの総数を超えている場合(S214:Yes)、全ファイルに関するリード対象ブロック数とブロック総数とから、リード対象ブロック数の割合を算出して、ブロックテーブルに格納する(S215)。すなわち、特定部22は、検証対象ソフトウェアがアクセスするブロック数のうちリード対象ブロック数の割合を算出する。
(ワークファイルの生成処理)
図8は、ワークファイルを生成する処理の流れを示すフローチャートである。図8に示すように、ワークファイル生成部23は、ファイルに関するカウンターであるjに1をセットし(S301)、リード領域テーブル(j,k)をコピーする(S302)。なお、kは、ブロック番号の通番、すなわちファイル位置に関するカウンターである。
続いて、ワークファイル生成部23は、変数wに1を代入し(S303)、変数kに1を代入し(S304)、リード領域テーブル(j,k)の値がONか否かを判定する(S305)。
そして、ワークファイル生成部23は、リード領域テーブル(j,k)の値がONである場合(S305:Yes)、ワークテーブル(j,w)にkの値を設定し、wにw+1の値を設定する(S306)。一方、ワークファイル生成部23は、リード領域テーブル(j,k)の値がONではない場合(S305:No)、S306を実行せずにS307を実行する。
その後、ワークファイル生成部23は、kにk+1の値を設定し(S307)、ファイルの終端か否かを判定し(S308)、ファイルの終端ではない場合(S308:No)、S305に戻って以降を繰り返す。
一方、ワークファイル生成部23は、ファイルの終端である場合(S308:Yes)、jにj+1の値を設定し(S309)、jがファイルの総数を超えているかを判定する(S310)。
そして、ワークファイル生成部23は、jがファイルの総数を超えていない場合(S310:No)、S303に戻って以降を繰り返す。
一方、ワークファイル生成部23は、jがファイルの総数を超えている場合(S310:Yes)、上述した処理で生成されたワークテーブル15にしたがって、ワークファイル16を生成する(S311)。その後、実行回数が2回目以降となる検証対象ソフトウェアが起動される(S312)。
(検証処理)
図9は、実施例1に係る検証処理の流れを示すフローチャートである。この処理は、検証対象ソフトウェアによるファイルアクセスが発生するたびに実行される。図9に示すように、応答制御部24bは、検証対象ソフトウェアから命令を受け付けると、当該命令の種別がリード命令か否かを判定する(S401)。
そして、応答制御部24bは、リード命令であると判定した場合(S401:Yes)、リード命令のパラメータであるファイルディスクリプター等からファイル名を取得する(S402)。続いて、応答制御部24bは、ファイル名をキーにしてアクセステーブルを参照してファイル番号を特定する(S403)。
その後、応答制御部24bは、リード命令のパラメータであるオフセットやサイズから、リード対象のブロック番号を特定する(S404)。そして、応答制御部24bは、特定したストレージ装置50のブロック番号をキーにしてワークテーブル15を検索し、リード対象のワークファイル16上のブロック番号を特定する(S405)。
続いて、応答制御部24bは、動作モードがリード待ちモードであるかを判定する(S406)。なお、動作モードについては実施例3で詳細に説明する。
そして、応答制御部24bは、動作モードがリード待ちモードである場合(S406:Yes)、特定したファイル番号が最後のファイル番号を示すラストファイル番号であるかを判定する(S407)。
ここで、応答制御部24bは、特定したファイル番号が最後のファイル番号を示すラストファイル番号ではない場合(S407:No)、S408を実行する。すなわち、応答制御部24bは、元のファイルにおいてリード対象のブロックの先頭にあたるブロック番号を「先頭ブロック−org(i)」にセットし、ワークファイル16における先頭にあたるブロック番号を「先頭ブロック−work(i)」にセットする。
さらに、応答制御部24bは、「ラストブロック−work(i)」が「先頭ブロック−work(i)」の次のブロックである場合(S409:Yes)、S410を実行する。すなわち、応答制御部24bは、「ラストブロック−org(i)」が「先頭ブロック−org(i)」の次のブロックではないか否かを判定する。
ここで、応答制御部24bは、「ラストブロック−org(i)」が「先頭ブロック−org(i)」の次のブロックではないと判定した場合(S410:Yes)、一定時間待機する(S411)。その後、応答制御部24bは、ワークファイル16の該当ブロックに対するリード命令をドライバへ依頼する(S412)。
そして、応答制御部24bは、動作モードがリード待ちモードである場合(S413:Yes)、S414を実行する。すなわち、応答制御部24bは、元のファイルにおいてリード対象のブロックの最後にあたるブロック番号を「ラストブロック−org(i)」にセットし、ワークファイル16における最後にあたるブロック番号を「ラストブロック−work(i)」にセットする。
そして、応答制御部24bは、ラストファイル番号にファイル番号をセットし(S415)、リード命令の復帰値をセットして呼出元に戻る(S416)。
なお、S406において、応答制御部24bは、動作モードがリード待ちモードではない場合(S406:No)、S407からS411を実行することなく、S412を実行する。
また、S407において、応答制御部24bは、特定したファイル番号が最後のファイル番号を示すラストファイル番号であると判定した場合(S407:Yes)、S408からS411を実行することなく、S412を実行する。
また、S409において、応答制御部24bは、「ラストブロック−work(i)」が「先頭ブロック−work(i)」の次のブロックではないと判定した場合(S409:No)、S410とS411を実行することなく、S412を実行する。
同様に、S410において、応答制御部24bは、「ラストブロック−org(i)」が「先頭ブロック−org(i)」の次のブロックであると判定した場合(S410:No)、S411を実行することなく、S412を実行する。
また、S413において、動作モードがリード待ちモードではないと判定した場合(S413:No)、S414およびS415を実行することなく、S416を実行する。
一方で、S401において、応答制御部24bは、ライト命令であると判定した場合(S401:No)、ライト命令のパラメータであるファイルディスクリプター等からファイル名を取得する(S417)。続いて、応答制御部24bは、ファイル名をキーにしてアクセステーブルを参照してファイル番号を特定する(S418)。
その後、応答制御部24bは、ライト命令のパラメータであるオフセットやサイズから、ライト対象のブロック番号を特定する(S419)。そして、応答制御部24bは、特定したストレージ装置50のフロック番号をキーにしてリード領域テーブル14を参照して、ONになっているブロック番号が含まれているかを判定する(S420)。
ここで、応答制御部24bは、ONになっているブロック番号が含まれていない場合(S420:No)、そのまま処理を終了する。つまり、応答制御部24bは、ライト対象の領域がその後にリードされない領域であることから、データの書き込みを実行したように見せかける。
一方、応答制御部24bは、ONになっているブロック番号が含まれている場合(S420:Yes)、特定したストレージ装置50のフロック番号をキーにしてワークテーブル15を検索し、ライト対象のワークファイル16上のブロック番号を特定する(S421)。
続いて、応答制御部24bは、動作モードがライト待ちモードであるかを判定する(S422)。なお、動作モードについては実施例3で詳細に説明する。
そして、応答制御部24bは、動作モードがライト待ちモードである場合(S422:Yes)、特定したファイル番号が最後のファイル番号を示すラストファイル番号であるかを判定する(S423)。
ここで、応答制御部24bは、特定したファイル番号が最後のファイル番号を示すラストファイル番号ではない場合(S423:No)、S424を実行する。すなわち、応答制御部24bは、元のファイルにおいてライト対象のブロックの先頭にあたるブロック番号を「先頭ブロック−org(i)」にセットし、ワークファイル16における先頭にあたるブロック番号を「先頭ブロック−work(i)」にセットする。
さらに、応答制御部24bは、「ラストブロック−work(i)」が「先頭ブロック−work(i)」の次のブロックである場合(S425:Yes)、S426を実行する。すなわち、応答制御部24bは、「ラストブロック−org(i)」が「先頭ブロック−org(i)」の次のブロックではないか否かを定する。
ここで、応答制御部24bは、「ラストブロック−org(i)」が「先頭ブロック−org(i)」の次のブロックではないと判定した場合(S426:Yes)、一定時間待機する(S427)。その後、応答制御部24bは、ワークファイル16の該当ブロックに対するライト命令をドライバへ依頼する(S428)。
そして、応答制御部24bは、動作モードがライト待ちモードである場合(S429:Yes)、S430を実行する。すなわち、応答制御部24bは、元のファイルにおいてライト対象のブロックの最後にあたるブロック番号を「ラストブロック−org(i)」にセットし、ワークファイル16における最後にあたるブロック番号を「ラストブロック−work(i)」にセットする。
そして、応答制御部24bは、ラストファイル番号にファイル番号をセットし(S431)、ライト命令の復帰値をセットして呼出元に戻る(S432)。
なお、S422において、応答制御部24bは、動作モードがライト待ちモードではない場合(S422:No)、S423からS427を実行することなく、S428を実行する。
また、S423において、応答制御部24bは、特定したファイル番号が最後のファイル番号を示すラストファイル番号であると判定した場合(S423:Yes)、S424からS427を実行することなく、S428を実行する。
また、S425において、応答制御部24bは、「ラストブロック−work(i)」が「先頭ブロック−work(i)」の次のブロックではないと判定した場合(S425:No)、S426とS427を実行することなく、S428を実行する。
同様に、S426において、応答制御部24bは、「ラストブロック−org(i)」が「先頭ブロック−org(i)」の次のブロックであると判定した場合(S426:No)、S427を実行することなく、S428を実行する。
また、S429において、動作モードがリード待ちモードではないと判定した場合(S429:No)、S430およびS431を実行することなく、S432を実行する。
[効果]
このように、検証装置10は、検証対象ソフトウェアの初回の実行の際に、検証対象ソフトウェアがアクセスする各ファイルのリード対象となる位置を記録し、記録した内容を基に該当領域サイズ分のワークファイル16を生成する。そして、検証装置10は、2回目以降に検証対象ソフトウェアを実行する際には、リード対象となる領域へのライトやリードなどのアクセスの際に実際のファイルではなく、ワークファイル16へアクセスする。
したがって、検証装置10は、検証時に使用するストレージ装置の記憶容量を削減してソフトウェアの動作検証を行なう場合の、検証精度の低下を抑止できる。
また、検証装置10は、ソフトウェアのエンハンスやパッチ提供時において、大容量のディスクをその都度用意せずに、また、常時用意しておくことなく、検証処理が実行できる。このため、開発期間で保持するトータルの設備として、ディスク装置の削減が可能である。
また、検証装置10は、テスト実行前に大容量のテストデータを作成するケースにおいて、テストデータ作成にかかる時間を大幅に短縮できる。また、検証装置10は、テストデータ生成を行うプログラムで読出し命令を行う領域のみディスクに対する書き込みを行う。従って、2回目以降のデータ生成に関する大半の書き込み命令はディスクへの書き込みを行わないので、テストの準備時間がほとんどかからない。このため、トータルの実行時間は、従来手法に比べ、大幅に短縮できる。さらに、使用するディスク容量が削減させることにより、ストレージ装置の台数についても2回目以降では削減できる。
ところで、実施例1では、複数の検証対象ソフトウェアを順次実行する場合、各検証対象ソフトウェアがリードする全領域を有するワークファイル16を用意することになるが、これに限定されるものではなく、ワークファイル16の容量を削減することもできる。
そこで、実施例2では、検証装置10が、未実行の検証対象ソフトウェアに対応する領域のワークファイル16を用意して、検証対象ソフトウェアを順次実行することで、ワークファイル16の容量を削減する例を説明する。なお、実施例2では、検証対象ソフトウェア1、検証対象ソフトウェア2、検証対象ソフトウェア3を順に検証するものとする。
[処理の説明]
図10は、実施例2に係るワークファイルの構成変更を説明する図である。検証装置10は、検証対象プログラム1の検証を実行する場合、検証対象ソフトウェア1がリードする領域を有するワークファイル16を生成して、検証を実行する。
その後、検証装置10は、検証対象プログラム2の検証を実行する場合、ワークファイル16の構成を変更する準備プログラムを実行する。そして、検証装置10は、検証対象ソフトウェア2がリードする領域を有するように、ワークファイル16の構成を変更してから、検証を実行する。
このようにすることで、検証装置10は、1つの検証対象プログラムの検証完了後、以降の検証対象プログラムがリードする領域を有するようにワークファイル16の構成を変更することで、ワークファイル16の容量を削減することができる。
[機能構成]
図11は、実施例2に係る検証装置の機能構成を示す機能ブロック図である。なお、実施例1と同様の機能については、図2と同一符号を付し、詳細な説明を省略する。ここでは、使用期間テーブル17、使用期間調査部25、ワークファイル構成部26について説明する。
使用期間テーブル17は、ストレージ装置50の各ブロックがどの検証対象ソフトウェアからどの検証対象ソフトウェアまで使用されるかを示す情報を記憶するテーブルである。図12は、使用期間テーブルを説明する図である。図12に示すように、使用期間テーブル17は、リード領域テーブル14とライトされた領域を記憶するライト領域テーブルとを用いて生成される。なお、ライト領域テーブルは、記憶部12等に格納されている。
図12の例では、ブロック番号1およびブロック番号2は、検証対象ソフトウェア1にリードおよびライトされる。ブロック番号3は、検証対象ソフトウェア1と検証対象ソフトウェア3にリードされ、検証対象ソフトウェア1と検証対象ソフトウェア2にライトされる。ブロック番号4は、いずれの検証対象ソフトウェアにもリードもライトもされない。
ブロック番号5は、検証対象ソフトウェア2にリードされ、検証対象ソフトウェア1と検証対象ソフトウェア2にライトされる。ブロック番号6は、検証対象ソフトウェア2と検証対象ソフトウェア3にリードおよびライトされる。ブロック番号7−9は、いずれの検証対象ソフトウェアにもリードもライトもされない。
この結果、使用期間テーブル17には、ブロック番号1については検証対象ソフトウェア1で使用が開始されて使用が終了することから、ブロック番号1に対応付けて「始&終」がセットされる。同様に、使用期間テーブル17には、ブロック番号2については検証対象ソフトウェア1で使用が開始されて使用が終了することから、ブロック番号1に対応付けて「始&終」がセットされる。
また、ブロック番号3については検証対象ソフトウェア1で使用が開始されて、検証対象ソフトウェア3で使用が終了すると判定する。この結果、使用期間テーブル17には、ブロック番号1に対応付けて「始」、ブロック番号2に対応付けて「中」、ブロック番号3に対応付けて「終」がセットされる。
また、ブロック番号5については検証対象ソフトウェア1で使用が開始されて、検証対象ソフトウェア2で使用が終了すると判定する。この結果、使用期間テーブル17には、ブロック番号1に対応付けて「始」、ブロック番号2に対応付けて「終」がセットされる。
また、ブロック番号6については検証対象ソフトウェア2で使用が開始されて、検証対象ソフトウェア3で使用が終了すると判定する。この結果、使用期間テーブル17には、ブロック番号2に対応付けて「始」、ブロック番号3に対応付けて「終」がセットされる。
使用期間調査部25は、各検証対象ソフトウェアがリードする領域やライトする領域に基づいて、ストレージ装置50の各ブロックが使用される期間を特定する処理部である。例えば、特定部22は、実施例1と同様の手法でリード領域テーブル14を生成し、リード領域テーブル14と同様の手法で、図12に示したライト領域テーブルを生成する。そして、使用期間調査部25は、図12で説明した手法で、リード領域テーブル14およびライト領域テーブルの情報にしたがって使用期間テーブル17を生成する。
ワークファイル構成部26は、検証対象ソフトウェアの検証が完了すると、次以降の検証対象ソフトウェアに対応するワークファイル16を生成する処理部である。例えば、ワークファイル構成部26は、検証実行部24から検証の順番の指定を受け付ける。
そして、ワークファイル構成部26は、検証対象ソフトウェア1の実行開始指示を検証実行部24から受け付けると、検証対象ソフトウェア1、2、3のそれぞれで使用される領域を有するワークファイル16を生成する。
検証対象ソフトウェア1の実行が完了し、ワークファイル構成部26は、検証対象ソフトウェア2の実行開始指示を検証実行部24から受け付けると、検証対象ソフトウェア2、3で使用される領域を有するワークファイル16を生成する。このようにして、ワークファイル構成部26は、検証対象ソフトウェアが実行されるタイミングで、ワークファイル16を生成する。なお、特定部22は、実施例1と同様に、検証対象ソフトウェア1、検証対象ソフトウェア2、検証対象ソフトウェア3のそれぞれの検証対象ソフトウェアがアクセスするブロック総数の合計、リード対象のブロック総数の合計、リード対象領域の割合を算出する。これらの値をもとにして、検証対象ソフトウェアを分割することにより、ワークファイル16の容量を削減することもできる。
[処理の流れ]
次に、実施例2で実行される各処理について説明するが、検証処理については実施例1と同様の処理なので、詳細な説明は省略する。
(使用期間の抽出処理)
図13は、使用期間を抽出する処理の流れを示すフローチャートである。ここでは、検証対象ソフトウェア1に対して実行する例を説明するが、他の検証対象ソフトウェアについても同様に実行される。なお、このフローチャートを実行することで、上記アクセステーブル、リード領域テーブル14、ライト領域テーブルが生成される。
図13に示すように、特定部22は、検証対象ソフトウェア1が実行されると、検証対象ソフトウェア1を特定するカウンターiに1を代入し(S501)、ファイルに関するカウンターjに1を代入する(S502)。
続いて、特定部22は、検証対象ソフトウェア1からデータアクセスを取得すると、当該データアクセスの種別を取得し、当該種別がライト命令であるかを判定する(S503)。
そして、特定部22は、ライト命令と判定した場合(S503:Yes)、ライト領域テーブルを生成する(S504)。具体的には、特定部22は、オフセットとサイズを基に、ライト領域テーブル(i;j,k)の該当ブロック番号にONを設定する。なお、kは、ブロック番号である。
その後、特定部22は、jにj+1を代入した後(S505)、ライト命令の実行をディスクドライバへ依頼し(S506)、S503以降を繰り返す。
一方、S503において、特定部22は、リード命令と判定した場合(S503:No)、リード領域テーブルを生成する(S507)。具体的には、特定部22は、オフセットとサイズを基に、リード領域テーブル(i;j,k)の該当ブロック番号にONを設定する。なお、kは、ブロック番号である。
その後、特定部22は、jにj+1を代入した後(S508)、ライト命令の実行をディスクドライバへ依頼し(S506)、S503以降を繰り返す。
(使用期間テーブルの生成処理)
図14と図15は、使用期間テーブルの生成処理の流れを示すフローチャートである。この処理では、使用期間テーブルとブロックテーブルとを作成する。また、図14では、各テーブルの作成処理をシーケンシャルに実行する例を説明するが、並列に実行することもできる。
図14に示すように、使用期間調査部25は、検証対象ソフトウェアを特定するカウンターiに1を代入し(S601)、ファイルを表すカウンターjに1を代入し(S602)、ブロック番号を表すカウンターkに1を代入する(S603)。
そして、使用期間調査部25は、リード領域テーブル(i;j,k)とライト領域テーブル(i;j,k)とから、該当ブロックに対して最初にライトする検証対象ソフトウェアと最後にリードする検証対象ソフトウェアを特定する(S604)。このとき、使用期間調査部25は、該当する検証対象ソフトウェアの番号を「最初の番号」と「最後の番号」に設定する。
その後、使用期間調査部25は、使用期間テーブル(i;j,k)を生成する(S605)。具体的には、使用期間調査部25は、使用期間テーブル(i;j,k)を初期化する。続いて、使用期間調査部25は、jが最初の番号、最後の番号としたとき、使用期間テーブル(i;k,最初の番号)=“始”、使用期間テーブル(i;k,最後の番号)=“終”と設定する。なお、最初の番号=最後の番号のときは、“始&終”が設定される。
そして、使用期間調査部25は、kにk+1の値を設定し(S606)、kがファイルの終端番号以下の場合(S607:No)、S604以降を繰り返す。
また、使用期間調査部25は、kがファイルの終端番号より大きい場合(S607:Yes)、jにj+1の値を設定し(S608)、jがファイル総数以下の場合(S609:No)、S603以降を繰り返す。つまり、使用期間調査部25は、ファイルの最後のブロック番号である場合、S608を実行する。
また、使用期間調査部25は、jがファイル総数より大きい場合(S609:Yes)、iにi+1の値を設定し(S610)、iが検証対象ソフトウェアの総数以下の場合(S611:No)、S602以降を繰り返す。
その後、図15に示すように、使用期間調査部25は、iが検証対象ソフトウェアの総数より大きい場合(S611:Yes)、iに1を設定し(S612)、jに1を設定し(S613)、使用期間テーブルを読み込む(S614)。
続いて、使用期間調査部25は、変数work1およびwork2のそれぞれに1を設定し(S615)、kに1を設定し(S616)、使用期間テーブル(i;j,k)の値が0か否かを判定する(S617)。つまり、使用期間調査部25は、j番目のファイルのブロック番号kが0か否かを判定する。
そして、使用期間調査部25は、使用期間テーブル(i;j,k)の値が0以外の場合(S617:No)、work1にwork1+1の値を設定し(S618)、kにk+1の値を設定する(S619)。なお、使用期間調査部25は、使用期間テーブル(i;j,k)の値が0である場合(S617:Yes)、S618を実行することなくS619を実行する。
続いて、使用期間調査部25は、ファイルの終端ではない場合(S620:No)、S617以降を繰り返し、ファイルの終端である場合(S620:Yes)、リード対象ブロック数(i)にwork1の値を設定する(S621)。さらに、使用期間調査部25は、ブロック総数(i)にwork2の値を設定する(S622)。
その後、使用期間調査部25は、リード対象ブロック数(i)とブロック総数(i)とをブロックテーブルにセットし(S623)、jにj+1の値をセットする(S624)。そして、使用期間調査部25は、jがファイルの総数を超えない場合(S625:No)、S614以降を繰り返す。
一方、使用期間調査部25は、jがファイルの総数を超える場合(S625:Yes)、全ファイルに関するリード対象ブロック数とブロック総数とから、リード対象ブロック数の割合を算出して、ブロックテーブルに格納する(S626)。なお、S626は、検証対象ソフトウェアごとに実行される。
その後、使用期間調査部25は、iにi+1の値を設定し(S627)、iが検証対象ソフトウェアの総数を超えない場合は(S628:No)、S613以降を繰り返し、
iが検証対象ソフトウェアの総数を超える場合は(S628:Yes)、処理を終了する。
(ワークファイルの構成変更処理)
図16は、ワークファイルの構成を変更する処理の流れを示すフローチャートである。この処理は、複数の検証対象ソフトウェアが順次実行される場合に、各検証対象ソフトウェアの実行前に起動され、図10に示した準備プログラムの処理に該当する。
また、図16では、検証対象ソフトウェアの番号を引数で渡すように制御しているが、呼ばれるたびに自身でカウントアップするように制御することもできる。この処理によって、順次実行される検証対象ソフトウェアに関する実行環境が生成される。つまり、1つ前の検証対象ソフトウェアに関するワークファイルの引き継ぎが実行される。
図16に示すように、ワークファイル構成部26は、変数iに引数(検証対象ソフトウェア)をセットし(S701)、ファイルに関するカウンターjに1を設定する(S702)。
そして、ワークファイル構成部26は、ワークファイル16を読み込み、DATA(r)を生成し(S703)、ワークテーブル(j,b)を読み込む(S704)。なお、r=1、2、・・・、SUM(j)である。SUM(j)は、j番目のワークファイル16のブロック数である。この時点のワークファイル16、ワークテーブルは、前の検証対象ソフトウェアの実行が完了した状態のデータである。
その後、ワークファイル構成部26は、bに1を設定し(S705)、kにワークテーブル(j;b)の値を設定する(S706)。そして、ワークファイル構成部26は、使用期間テーブル(i;j,k)の値を判定する(S707)。
そして、ワークファイル構成部26は、使用期間テーブル(i;j,k)の値が“始”または“始&終”である場合、今回の検証対象ソフトウェアに関するデータをセットする(S708)。具体的には、ワークファイル構成部26は、新DATA(k)に0を設定する。
また、ワークファイル構成部26は、使用期間テーブル(i;j,k)の値が“中”または“終”である場合、前回のワークファイル16の内容をコピーする(S709)。また、ワークファイル構成部26は、使用期間テーブル(i;j,k)の値が空白である場合、何も実行せずにS710を実行する。
その後、ワークファイル構成部26は、リード領域テーブル(j,k)に使用期間テーブル(i;j,k)の値を設定し(S710)、bにb+1の値を設定する(S711)。すなわち、ワークファイル構成部26は、リード領域テーブル14を生成する。
そして、ワークファイル構成部26は、変数bの値がリード対象ブロック数以下の場合(S712:No)、S706以降を繰り返す。
続いて、ワークファイル構成部26は、リード領域テーブル(j,k)からワークテーブル(j,b)を生成する(S713)。つまり、今回の検証対象ソフトウェアの実行時に参照されるワークテーブル15が生成される。なお、b=1、2、・・・、NUM(j)である。
その後、ワークファイル構成部26は、「新DATA(r):r=1、2、・・・、SUM(j)」からワークファイル16へ書き込む(S714)。
そして、ワークファイル構成部26は、jがファイルの総数を超えない場合(S715:No)、S703以降を繰り返す。一方、jがファイルの総数を超える場合(S715:Yes)、ソフトウェア実行部24aが該当する次の検証対象ソフトウェアを実行する(S716)。
[効果]
このように、検証装置10は、次の検証対象ソフトウェアを実行する際に、実行済みの検証対象ソフトウェアしか参照しないワークファイル16の領域を削除し、次以降の検証対象ソフトウェアが参照するワークファイル16を再構成する。その後、検証装置10は、再構成後のワークファイル16を用いて検証処理を実行する。
図17は、実施例2に係るワークファイルの構成変更の具体例を説明する図である。図17に示すように、検証装置10は、検証対象ソフトウェア1の検証時は、4つのブロックを有するワークファイル16を用いて検証する。
そして、検証装置10は、検証対象ソフトウェア1の検証が終了すると、準備プログラムを実行して、ワークファイル16の構成を変更する。この結果、検証装置10は、検証対象ソフトウェア2の検証時は、3つのブロックを有するワークファイル16を用いて検証する。
そして、検証装置10は、検証対象ソフトウェア2の検証が終了すると、準備プログラムを実行して、ワークファイル16の構成を変更する。この結果、検証装置10は、検証対象ソフトウェア3の検証時は、2つのブロックを有するワークファイル16を用いて検証する。
このように、検証装置10は、実行対象の検証対象ソフトウェアの数が減るに連れてワークファイル16が有するブロック数を減らすことができ、ワークファイル16の容量を削減できる。