図1は本実施の形態を適用できるシステムの構成例を示している。同図においてジョブ処理システム10は第1サーバ12、第2サーバ14の2つのサーバを含む。また第1サーバ12はデータベース17に接続している。ユーザは各サーバの端末などを操作し、設定、登録を行うことにより、所望のジョブを所望の時間に処理させる。なお、サーバやデータベースの数、データベースの接続先は図1に示したものに限らず、ジョブを処理できるシステムであればいかなる構成においても本実施の形態を適用できる。また各サーバにさらにクライアント端末などが接続していてもよい。
第1サーバ12および第2サーバ14はそれぞれ、一以上のCPUとメモリ、記憶装置、入出力装置、表示装置など、あるいはそのいずれかの組み合わせを備えた一般的な情報処理装置であればよく、パーソナルコンピュータ、汎用大型コンピュータなどその規模は限定されない。同図は一例として第1サーバ12がハードディスク13を、第2サーバ14がハードディスク15をそれぞれ備えた構成を示している。また第1サーバ12、第2サーバ14はネットワーク20に接続され、互いにデータを送受することができる。
ユーザは第1サーバ12、第2サーバ14のいずれかに対しジョブフロー、バッチ処理時の処理の順序、処理開始時間などの設定を行うことにより、ジョブ処理システム10にジョブを処理させる。ここで「ジョブフロー」とは、ジョブごとの具体的な処理内容のことである。各ジョブを第1サーバ12、第2サーバ14のいずれかひとつのサーバで処理するようにしてもよいし、双方のサーバで並列に処理するようにしてもよい。ジョブをどのサーバでどのような順序で処理させるか、また、並列に複数のジョブを処理させるかどうかなどは、CPUの処理能力やネットワークの帯域など利用可能なリソースや、データベースへのアクセス順といった処理内容に鑑み、ユーザが設定を行う。これらの手続きは、ジョブのバッチ処理に際し行われる 一般的な手法を用いることができる。
ジョブ処理システム10は、各種機能やサービスをユーザに提供する本番機でよい。すなわちジョブ処理システム10は、ネットワーク20を介してアクセスを行った端末(図示せず)などにサービスを提供したり、各支店から計上されるデータを当該支店の端末から取得してデータベース17を更新したり、その他、一般的に実現されているいかなる機能を発揮してもよい。以後、ジョブ処理システム10にはあらかじめジョブが登録されており、それを実行することにより、各種機能を発揮する実運用がなされているものとして説明する。
このような状態においてジョブ処理システム10は、新たに導入すべき新規プログラム、修正プログラム、あるいは新規ジョブに関する情報の入力をユーザから受け付ける。そして実運用と並行して当該新規プログラムやジョブのテストを行い、必要な情報を比較する。比較結果をユーザに示すことにより、ユーザはまさに本番の環境に新規ジョブを導入した場合の問題点を抽出でき、効率よい開発や本格導入の可否判断を実現できる。
図2はジョブ処理システム10でバッチ処理されるジョブの例を模式的に示している。同図の横方向が時間の経過を表し、最小単位の矩形が一のジョブを表している。上述の通り、ジョブ処理システム10では実際のシステム運用が行われており、その際に実行される処理の例が同図上段の「本番処理」72とする。すなわち本番処理72においては、「ジョブA」、「ジョブB」、「ジョブC」、「ジョブE」がこの順で処理される。
このような状況において、本番処理72に含まれる「ジョブB」に代わる、「ジョブb」、「ジョブd」なる新規ジョブのテストを行いたいとする。このときジョブ処理システム10は、本番処理72において「ジョブA」を処理した後、本番ジョブ76として「ジョブB」を処理するとともに、テスト対象である「ジョブb」、「ジョブc」も処理する。以後、テスト対象である一連のジョブを「仮想ジョブ」78と呼ぶ。なお以後の説明で各「ジョブ」は「プログラム」と置き換えることもできる。
同図の例で本番ジョブ76である「ジョブB」では、ファイル名「aaa.txt」なるファイルを入力ファイルとし、データベース17を参照して処理を行うことにより、ファイル名「bbb.txt」なるファイルを出力している。一方、仮想ジョブ78に含まれる「ジョブb」では、「ジョブB」と同じくファイル「aaa.txt」を入力ファイルとし、データベース17を参照して処理を行い、ファイル名「ccc.txt」なるファイルを中間ファイルとして出力する。その後、「ジョブd」が、例えば中間ファイル「ccc.txt」を用いて処理を行い、ファイル名「ddd.txt」なるファイルを出力する。本番ジョブ76および仮想ジョブ78の入力ファイル「aaa.txt」は「ジョブA」が出力するファイルでもよい。
ここで「ジョブd」が出力するファイル「ddd.txt」は、仮想ジョブ78のテスト結果が良好となり、本番ジョブ76である「ジョブB」に代えて本格導入した場合に、「ジョブB」が出力するファイル「bbb.txt」に代わるファイルである。従ってファイル「ddd.txt」とファイル「bbb.txt」を比較することにより、仮想ジョブ78を導入した際の、出力結果に与える影響を確認することができる。以後、本番ジョブ76の出力ファイルを「本番出力ファイル」、仮想ジョブ78において出力され、本番出力ファイルと比較することのできるファイルを「仮想出力ファイル」と呼ぶ。
ジョブ処理システム10は、仮想ジョブ78の処理を行うのに先立ち、本番出力ファイル「bbb.txt」と仮想出力ファイル「ddd.txt」を比較する比較用ジョブ80を生成させる。そして仮想ジョブ78の処理後のいずれかのタイミングで比較用ジョブ80を実行し、比較結果を出力する。ユーザは比較結果を参照し、本番出力ファイル「bbb.txt」と仮想出力ファイル「ddd.txt」の中身が同一であったり、それらの差分が予定されていたものであった場合など、所定の基準によって仮想ジョブ78の本格導入を決定できる。
仮想ジョブ78および比較用ジョブ80は、ユーザが新規ジョブのテストを行いたい場合にのみ発生するジョブ群であり、以後、これらをまとめて「仮想処理」74と呼ぶ。仮想処理74を実行するために必要な情報、すなわち、「ジョブb」、「ジョブd」の処理内容を示すジョブフローの情報、各ジョブにおいて実行されるプログラム、各ジョブの処理順、比較用ジョブ80において比較すべきファイルの情報などは、本番処理72を実行するために必要な情報の記憶装置における格納先とは異なる記憶領域に格納する。以後、この記憶領域を「仮想ディレクトリ」と呼ぶ。仮想ディレクトリに格納された情報は、テスト終了と同時に削除する。これにより、テストの実行によって本番処理が予想外の影響を受けたり、記憶領域を圧迫したり、といったことを防止し、より安全にテストを実行することができるとともに、テスト終了後にジョブ処理システム10を元の状態に復元できる。
図2の例では、仮想処理74は、本番処理72に含まれる「ジョブA」の処理終了後に、本番ジョブ76と並列に行っている。このように仮想処理74は本番処理72といずれかのタイミングで並列に処理するようにしてもよいし、リソース上の制限などによっては一部あるいは全部の処理を、本番処理72と別のタイミングで行ってもよい。いずれにしろ、本番処理72に含まれる「ジョブA」の出力ファイルを仮想ジョブ78に含まれる「ジョブb」の入力ファイルとするときは、実際に「ジョブA」が出力したファイルをコピーして入力することにより、出力ファイルを比較する際の正確性が増す。
図3は第1サーバ12の構成をより詳細に示している。第2サーバ14も同様の構成としてよい。第1サーバ12は、本番処理72および仮想処理74の処理に必要なファイルおよび出力ファイルなどを記憶する前出のハードディスク13の他、本番処理72を構成するジョブの処理内容、処理順、仮想ジョブ78の処理内容などの登録を受け付け、比較用ジョブ80の生成に必要な情報を抽出するジョブ登録部22、比較用ジョブ80を生成する比較用ジョブ生成部26、本番処理72や仮想処理74を実行するジョブ処理部28、本番処理72の各出力ファイルを解析し、テストに必要な環境を整えるファイル解析部38、出力ファイルの比較の結果、仮想ジョブ78の本格導入が決定した際、本格導入(以後、「リリース」)と呼ぶ)のための処理を行うリリース処理部40、および、出力ファイルの比較結果やテストの進捗度合いなどを出力してユーザに通知する出力部42を含む。
図3において、様々な処理を行う機能ブロックとして記載される各要素は、ハードウェア的には、CPU、メモリ、その他のLSIで構成することができ、ソフトウェア的には、演算やファイル操作、データベースへのアクセスを行うプログラムなどによって実現される。したがって、これらの機能ブロックがハードウェアのみ、ソフトウェアのみ、またはそれらの組合せによっていろいろな形で実現できることは当業者には理解されるところであり、いずれかに限定されるものではない。
ジョブ登録部22は、本番処理72に含まれるジョブのジョブフローやジョブの処理順など、ジョブの処理に必要な情報の登録の他、新規ジョブのテストを行いたい場合は当該新規ジョブのジョブフローや処理順の登録をユーザが行うためのインターフェースである。ジョブ登録部22は、登録画面を表示した表示装置と、キーボード、ポインティングデバイスなど登録画面に対して入力を行う入力装置と、CPUなど各種演算を行う装置との組み合わせでよい。
登録された情報は、スクリプトコードやジョブネット図など所定の形式でハードディスク13に格納する。またジョブ登録部22は、登録を受け付けたジョブが処理するプログラム等をハードディスク13に格納する。ハードディスク13には前述のとおり、本番処理72に含まれるジョブが処理するプログラム等を格納する記憶領域として本番ディレクトリ34を、仮想処理74に含まれるジョブが処理するプログラム等を格納する記憶領域として仮想ディレクトリ36を用意する。本番ディレクトリ34と仮想ディレクトリ36は、実際には一のハードディスクに含まれていなくてよく、例えば仮想ディレクトリ36をネットワーク20に接続した別のハードディスク中に設けてもよい。
さらにジョブ登録部22は、テストを行う新規ジョブが処理するプログラムを仮想ディレクトリ36に格納する際、当該格納処理に係る情報を仮想リリースログとして記録し、仮想ディレクトリ36に格納する。仮想リリースログは例えば、プログラム名、格納日時、格納先である仮想ディレクトリ36配下の個別ディレクトリの名前とを対応付けたテーブルとして構成する。仮想リリースログを保持することにより、テスト対象のジョブが存在することをジョブ処理部28が検知できるとともに、本番ジョブとしてリリースを行う際にリリース処理部40が、リリース対象のジョブのみをもれなく本番ディレクトリ34にコピーし、確実に本番リリースを行える。さらにテスト終了後の不要なデータを確実に削除できる。仮想リリースログの具体例は後に述べる。
新規ジョブのテストを行う場合、ジョブ登録部22は、本番ジョブ76と仮想ジョブ78のジョブフローから、比較対象のファイル名などを抽出してファイル情報のテーブルを作成し、仮想ディレクトリ36に格納する。あるいは、本番処理72に含まれるジョブのファイル情報のテーブルを、各ジョブが登録された時点であらかじめ作成して本番ディレクトリ34に格納しておき、新規ジョブのテストについて登録がなされた際に、当該ジョブのファイル情報のテーブルを別に作成して仮想ディレクトリ36に格納してもよい。ファイル情報のテーブルは、本番ジョブ76と仮想ジョブ78に含まれる各ジョブの名前と、それがアクセスするリソース名やファイル名、入出力の区別などの情報を含むテーブルである。ファイル情報のテーブルの具体例は後に述べる。
比較用ジョブ生成部26は、新規ジョブのテストを行う際、ジョブ登録部22が作成したファイル情報のテーブルを読み出し、本番ジョブ76と仮想ジョブ78がそれぞれ出力するファイルから、比較を行うべきファイルを抽出して、比較用ジョブ80のジョブフローを作成する。比較用ジョブ80は図2に示すとおり、比較対象となる出力ファイルを読み出し、あらかじめ用意された比較用プログラムを実行することによりファイルの差分などを抽出した後、その情報を比較結果として出力する処理である。比較用プログラムは、必要な差分情報などを考慮してあらかじめ作成したものを仮想ディレクトリ36等に格納しておく。作成された比較用ジョブのジョブフローも仮想ディレクトリ36に格納しておく。
ジョブ処理部28は、本番処理72を実行する本番ジョブ処理部30と、仮想ジョブ78および比較用ジョブ80を含む仮想処理74を実行する仮想ジョブ処理部32を含む。いずれの場合も、ジョブフロー、ジョブの処理順などの情報と、処理に必要なプログラムなどをハードディスク13から読み出して実行する。本番ジョブ処理部30は、本番処理72の出力データを本番ディレクトリ34に格納する。仮想ジョブ処理部32は、前述の仮想リリースログを参照し、テスト対象となるジョブがあることを検知したら処理を開始し、仮想処理74の出力データを仮想ディレクトリ36に格納する。仮想処理74に含まれる比較用ジョブ80の出力データである比較結果も仮想ディレクトリ36に格納する。
プログラム等、処理に必要なデータと出力データとは、実際には異なる記憶領域に分けて保存してもよいが、その場合も本番処理用のディレクトリと仮想処理用のディレクトリとで区別する。本番ジョブ処理部30と仮想ジョブ処理部32は、実際には一のCPUユニットの処理時間をそれぞれに割り当てることにより実体化してもよい。
ジョブ処理部28は、一般的に用いられるジョブスケジューラを起動し、環境変数を設定することによりジョブの処理を開始してもよい。この場合、新規ジョブのテストをする際は、仮想ディレクトリ36を優先させて環境変数の設定を行うようジョブスケジューラを管理する。本番処理72および仮想処理74を並列で実行するか否かによって、本番ディレクトリ34、仮想ディレクトリ36の優先の度合いを適宜変化させる。
ファイル解析部38は、ハードディスク13に格納されたファイルを解析することにより、効率的かつ正確にテストが遂行されるように、仮想処理74を行うタイミングなどの管理を行う。例えば、月末に日々の計上数値を集計する場合など、実行される日によってジョブの処理内容が異なる場合、ある1日のみテストを行って問題が発生しなかったとしても、別の日には問題となることがあり得る。従って、処理内容が変化するジョブの場合は、処理内容が異なる全ての日程でテストを行い、その結果を確認する必要がある。ファイル解析部38は、本番ディレクトリ34に蓄積して格納された、本番処理72の出力ファイルを解析することによって、どのような日程でテストを行うべきかを割り出す。そしてジョブ処理部28にその情報を通知することにより、仮想ジョブ処理部32がその日程で仮想処理74を実行する。
仮想ジョブ処理部32が仮想処理74を行う都度、ファイル解析部38はテストが必要な全日程のうちどの程度の割合でテストが終了したかを管理し、ユーザに通知する。これにより、ユーザはリリースの見通しを正確に把握することができる。ファイル解析部38は上述のとおり、本番処理72の出力ファイルを解析することによりテストが必要な日程を割り出すことができるため、本番処理72に含まれるジョブの詳細な処理内容をユーザが把握していない場合は特に有用となる。ファイル解析部38は、テスト日程を割り出す前段階として、ジョブで実行されるプログラムが行う処理の内容を導出する。したがってこの機能を、単にプログラムの処理内容を把握したい場合に用いることもできる。さらに、ファイルの解析結果を利用して、比較用ジョブ80が行った比較結果の解釈を行うこともできる。ファイル解析部38の具体的な処理手順は後に述べる。
リリース処理部40は、仮想ジョブのリリースを行う旨の指示入力をユーザから受け付け、リリースのための処理を行う。具体的には仮想リリースログを仮想ディレクトリ36から読み出し、ユーザがリリースを許可したジョブが処理するプログラムを仮想ディレクトリ36の格納先から本番ディレクトリ34へコピーし、コピーしたプログラムを実行すべきジョブのジョブフローを本番ジョブ76のジョブフローとして設定し直す。さらにジョブの処理順に係る情報を、当該ジョブを含むように設定し直す。
その後、リリース処理部40は、本番ディレクトリ34へコピーしたプログラムが格納されていた仮想ディレクトリ36内の記憶領域から当該プログラムを削除するとともに、仮想ジョブ78や比較用ジョブ80のジョブフロー、仮想ジョブが出力したファイルも、仮想ディレクトリ36から削除する。テスト終了後、リリースを行わない場合も同様の削除処理を行ってよい。リリース処理部40は、入力装置と、CPUなど各種ファイル操作を行う装置との組み合わせでよい。
出力部42は、仮想ジョブ処理部32において実行された比較用ジョブ80の出力データである、本番出力ファイルと仮想出力ファイルとの比較結果を出力する。さらに、ファイル解析部38が割り出した、テストが必要な日程や、テストの進捗度合いなどの情報も出力する。出力部42は一般的な表示装置やプリンタなどの出力装置でもよいし、電子メールやファクシミリなどの通信機器をさらに含んでもよい。
次に、これまで述べた構成によって実現できる、第1サーバ12の動作を説明する。図4は第1サーバ12が行う新規ジョブのテストの処理手順を示すフローチャートである。まずユーザがジョブ登録部22に対し、新規ジョブのテストを行いたい旨の入力と、新規ジョブに係る情報の登録を行う(S10)。このときユーザは、テストを行う新規ジョブと入れ替えたい本番処理72に含まれるジョブ、すなわち本番ジョブ76の指定も行う。
するとジョブ登録部22は、新規ジョブを仮想ジョブ78としてジョブフローや処理順などの情報、および当該ジョブが処理するプログラムを、仮想ディレクトリ36に格納し、格納情報を仮想リリースログとして記録する(S12)。既に別のジョブについてテスト中である場合など、仮想リリースログが既存の場合は更新する。また、新規ジョブと入れ替えるジョブとして指定された本番ジョブ76の識別情報も仮想ディレクトリ36に記録しておく。
次にジョブ登録部22は、本番ジョブ76および仮想ジョブ78のジョブフローから、アクセスするファイル名や入出力の区別などの情報をそれぞれ抽出し、ファイル情報のテーブルを作成して仮想ディレクトリ36に格納する(S14)。上述のとおり本番ジョブ76のファイル情報はあらかじめ本番ディレクトリ34に格納しておいてもよい。その後、比較用ジョブ生成部26は、ファイル情報のテーブルから、本番出力ファイルおよび仮想出力ファイルのファイル名とそれが格納される記憶領域を抽出して比較対象を特定し、比較用ジョブ80のジョブフローを作成する(S16)。
各ジョブの出力ファイルが複数存在する場合など、ジョブフローから比較対象となるファイルの特定が困難な場合は、出力部42を制御してユーザに確認を促す出力を行ってもよい。あるいはジョブ登録部22があらかじめ比較対象となるファイルを登録するようにユーザに求めるようにしてもよい。また仮想ジョブ78が、本番処理72において本番ジョブ76の前に処理されるジョブ(図2の例では「ジョブA」)の出力ファイルを入力ファイル(図2の例では「aaa.txt」)とする処理を行う場合は、当該前に処理されるジョブのファイル情報も抽出しておく。本番ジョブ76の前に処理されるジョブは、記憶しておいた本番ジョブ76の識別情報と本番処理72のジョブフローから特定できる。これにより、仮想ジョブ78の入力ファイルを、本番処理72で実際に出力されるファイルとして設定する処理を、ファイル情報のテーブルに基づき行うこともできる。
次にジョブ処理部28は、本番処理72および仮想処理74を実行する(S18)。ただし本実施の形態は本番機でのテストを想定しているため、本番処理72は、元々設定されたスケジュールで実行する。一方、仮想処理74は、ファイル解析部38が導出した、テストが必要な日程で、本番処理72と並列に、あるいは本番処理72の処理後に実行する。一回のテストで十分であることが明らかな場合などは、ファイル解析部38による処理を適宜省略してもよい。
ジョブ処理部28の仮想ジョブ処理部32は、仮想処理74として、仮想ジョブ78に続き比較用ジョブ80を処理して、本番出力ファイルと仮想出力ファイルとを比較する(S20)。比較結果は出力部42を介してユーザに通知される。ユーザが比較結果を確認し、テスト結果が問題ない旨の入力を行ったら(S22のY)、リリース処理部40は、仮想ディレクトリ36に格納されたプログラムを本番ディレクトリ34にコピーし、本番ディレクトリ34のジョブフローやジョブの処理順などを更新することにより、仮想ジョブ78を本番環境に移行する(S24)。そして、仮想ディレクトリ36に格納された当該ジョブのプログラムや比較用ジョブ80のジョブフロー、仮想出力ファイルなどを削除する(S26)。
一方、出力ファイルの比較結果に問題があるなどして、仮想ジョブ78をリリースせずにテストを終了したい旨の入力がユーザよりなされたら(S22のN)、S24の本番環境への移行処理を行わずに仮想ディレクトリ36に格納されたデータのみ削除する(S26)。ファイル解析部38が解析した結果、別の日程で複数回のテストを行う必要がある場合は、S24における本番環境への移行などのリリース処理は、全てのテストを終了した後に行う。なお後に述べるように、S22においてテスト結果を問題なしと判断するのは、ファイル解析部38が自動で行うこともできる。
図5は、ジョブ登録部22が本番ジョブ76および仮想ジョブ78から抽出して作成する、ファイル情報のテーブルの例を示している。ファイル情報のテーブル100は、ジョブ名欄102、利用リソース種類欄106、リソース詳細欄108、処理内容欄110、入力ファイル欄112、出力ファイル欄114、および比較対象欄116を含む。ジョブ名欄102にジョブ名が記載された各ジョブが利用するリソースの種類、具体的なリソースの識別情報、当該リソースに対し行う処理の内容、当該処理によって各ジョブに入力されるファイル名、出力されるファイル名、比較対象のファイルであるか否かの識別情報が、利用リソース種類欄106、リソース詳細欄108、処理内容欄110、入力ファイル欄112、出力ファイル欄114、および比較対象欄116を含む。ジョブ名欄102にそれぞれ記載される。
図5の例は、図2に示した本番ジョブ76である「ジョブB」、および仮想ジョブ78である「ジョブb」、「ジョブd」の処理をファイル情報のテーブルとしたものである。すなわち「ジョブB」は、利用するリソースとしてデータベース17を表す「DBMS」およびハードディスク13を表す「DISK」が利用リソース種類欄106に記載され、具体的なリソースとしてデータベース17中のデータベース名「会計DB」、およびハードディスク13における「ドライブD」がリソース詳細欄108に記載される。また、データベースに対する処理は「会計DB」に対する「参照」であり、「ドライブD」に対する処理はファイル「aaa.txt」の読み出し(すなわちジョブに対する入力)およびファイル「bbb.txt」の書き込み(すなわちジョブからの出力)であるため、処理内容欄110、入力ファイル欄112、出力ファイル欄114にはそれぞれそのように記載されている。
「ジョブb」および「ジョブc」に対しても同様の記載がなされている。また、比較対象欄116には、「ジョブB」が出力するファイル「bbb.txt」および「ジョブd」が出力するファイル「ddd.txt」が比較対象であることを識別する情報が記載されている。同図の例では双方に「1」が記載されているが、その他に比較対象の組が存在する場合は「2」などとすることにより組同士を識別できるようにする。前述のとおり、比較対象のファイルはユーザによって指定するようにしてもよいし、出力されるファイルを抽出したり、そのファイル名から類推したりして、ジョブ登録部22が自動で判断を行うようにしてもよい。
自動で判断を行う場合、ファイル情報のテーブル100に比較対象欄116を設けず、比較用ジョブ生成部26が比較用ジョブ80を作成する際に判断するようにしてもよい。その場合もファイル情報のテーブル100を準備しておくことにより、以前に登録された本番ジョブ76であっても、出力ファイルのファイル名や格納先などのファイル情報を容易に特定することができる。なおファイル情報のテーブルのデータ構造は、図5に示した欄に限定するものではなく、比較対象となるファイルが特定できればその形式はいかなるものでもよい。
図6はジョブ登録部22が記録し、リリース処理部40が更新する、仮想リリースログの、各処理段階における変化例を示している。まず、本番処理72のみが登録され、実運用されている状態では、図6(a)に示すように、本番処理72に含まれるジョブのプログラムが本番ディレクトリ34にのみ、格納されている。この例では、「プログラムA」、「プログラムB」、「プログラムC」、「プログラムE」が格納されているが、これは図2の本番処理72における「ジョブA」、「ジョブB」、「ジョブC」、「ジョブE」において実行されるプログラムと考えることができる。仮想リリースログにはプログラム名のほか、それをディレクトリに格納したタイムスタンプの日付を記録する。本番ディレクトリなどが複数存在する場合は、その場所を特定できるように所属するサーバ名やドライブ名などをさらに記録してもよい。
図6(b)はテストを行いたい新規ジョブの登録を受け、仮想ディレクトリ36に当該ジョブのプログラムを格納した後の仮想リリースログを示している。この例では、「プログラムB」の代替プログラムとして「プログラムb」および「プログラムd」が仮想ディレクトリ36のいずれかのディレクトリ「第1ディレクトリ」に「7月1日」のタイムスタンプで格納されている。これらのプログラムはそれぞれ、図2における仮想ジョブ78の「ジョブb」、「ジョブd」において実行されるプログラムと考えることができる。
図6(b)のように仮想リリースログが記録されている場合、テストが必要な日程において、本番処理72に加え、「プログラムA」を実行するジョブの処理の後、「プログラムb」を実行するジョブ、および「プログラムd」を実行するジョブを処理するよう、ジョブスケジューラなどが環境設定を行う。これにより本番ジョブ処理部30および仮想ジョブ処理部32では「プログラムB」と、「プログラムb」および「プログラムd」がそれぞれ実行される。「プログラムd」を実行するジョブの後、仮想ジョブ処理部32は前述のとおり比較用ジョブ80を処理する。本番ジョブ処理部30は当然、「プログラムB」を処理するジョブの後、「プログラムC」、「プログラムE」を実行するジョブを処理する。
図6(c)は、図6(b)のような状況において、新たにテストを行いたい新規ジョブの追加登録がなされた場合を示している。同図の例では、「プログラムe」が「7月2日」のタイムスタンプで仮想ディレクトリ36の「第1ディレクトリ」と異なるディレクトリ「第2ディレクトリ」に格納されている。このプログラムは本番処理72に含まれる「プログラムE」の代替プログラムである。このように、テストを行いたい単位ごとに異なる記憶領域を仮想ディレクトリ36内に設けることにより、世代別にテストを行い、比較結果をそれぞれ確認することができる。
同図の例では、「プログラムA」→「プログラムb」→「プログラムd」→「プログラムC」→「プログラムE」なる処理と、「プログラムA」→「プログラムb」→「プログラムd」→「プログラムC」→「プログラムe」なる処理とを個別のテストとして行える。すなわち、「プログラムb」と「プログラムd」がリリースされた後の世代として「プログラムe」のリリースの可否をテストする、という世代別のテストを個々に行うことができる。比較用ジョブ生成部26は、それぞれのテスト対応する比較用ジョブのジョブフローを作成し、ジョブ処理部28は各テストの後にそれぞれの比較用ジョブを処理する。
また、リリース処理も個別に行うことができる。図6(d)は、「プログラムb」および「プログラムd」のテスト結果が良好だった場合に、当該プログラムを実行するジョブをリリースした後の仮想リリースログを示している。この段階では、図中、太字で示したように「プログラムb」および「プログラムd」が本番ディレクトリ34に格納され、仮想ディレクトリ36に残されているプログラムは「プログラムe」のみとなっている。図6(e)はその後、ユーザの指示により、「プログラムe」を実行するジョブのリリースを行わずにテストを終了させた段階を示している。このとき「プログラムe」は仮想ディレクトリ36から削除され、本番ディレクトリ34のみに本番処理72で処理されるプログラムが格納されている。
このように仮想リリースログを記録することにより、テストを行う単位が明確となり、リリースが許可された際も、もれなく本番環境への移行を行うことができる。なお図6に示した仮想リリースログは、理解を容易にするために本番ディレクトリ34に格納されるプログラムも併記したが、実際には仮想ディレクトリ36に格納されているプログラム、およびそのプログラムが本番ディレクトリ34に格納されたどのプログラムの代替となるか、の情報のみをもって仮想リリースログとしてもよい。また場合によっては、別個に登録した複数の新規ジョブのテストを同時に行うような設定を受け付けてもよい。この場合、仮想ディレクトリ36の同じ格納領域に当該複数の新規ジョブが実行するプログラムを全て格納することにより、上述と同様の手続きでテストを行うことができる。
次にファイル解析部38の構成および動作について説明する。図7はファイル解析部38の詳細な構成を示している。ファイル解析部38は前述のとおり、プログラムの出力結果から当該プログラムの処理内容の特性を自動で取得し、テストを行うべき日程などを決定する。ファイル解析部38は、プログラムのソースコードなどから出力ファイルのデータ形式を解析し、注目すべき項目を特定するデータ形式解析部52、ハードディスク13に蓄積された複数の出力ファイルの差分から更新内容を取得し、プログラムの処理内容を特定する処理内容特定部54、更新内容をグルーピングして更新特性を取得する更新特性取得部56を含む。
ファイル解析部38はさらに、プログラムのテストを行う際に、テストを行うべき日程を決定するとともに、テスト結果において確認すべき項目を決定するテストケース作成部58、テストを行うべき日程においてジョブ処理部28に仮想処理74を実行させるとともに、出力部42から出力する、テストの進捗度合いなどの情報を作成する比較処理管理部60を含む。
データ形式解析部52は、プログラムのソースコードを解析して、当該プログラムの入力ファイル、出力ファイルのレイアウトおよびデータキーを特定する。ここで「データキー」とは、入力ファイルに記録された複数の項目に対応してプログラムが生成したデータを各項目と対応づけて記録した出力ファイルにおいて、データを特定する項目、またはその値をいう。例えば「従業員番号」と当該従業員の「給与支払い残高」とを対応づけた給与ファイルを例にとると、従業員番号から給与が特定できるため「データキー」となる。データキーは、その値を1つ選択すると、対応する値、すなわち支払い残高の数値データが定まる。
「ファイルのレイアウト」はファイルに含まれる項目と、それが記載されているファイル上の位置やアドレスなどとを対応付けた情報である。例えば「従業員番号」が1カラムめ、「給与支払い残高」が2カラムめに記載されている、などといったデータの並び方をいう。ファイルのレイアウトとデータキーを特定すると、解析対象プログラムの入力ファイルと出力ファイルのデータを同一のデータキーで比較して、差分を取得することができる。この差分がすなわち当該プログラムの処理内容を表すことになる。
ファイルのレイアウトとデータキーを特定するために、あらかじめプログラム解析用のロジックパターンを用意しておく。データ形式解析部52は、このロジックパターンに基づきプログラムのソースコードを検索し、レイアウト定義を行っている箇所およびマッチング処理、ブレーク処理を行っている箇所をプログラムから抽出することにより出力ファイルのレイアウトおよびデータキーをそれぞれ特定する。通常、レイアウト定義やマッチング処理、ブレーク処理の記述式はフォーマットが限定的であるため、ロジックパターンでの抽出が可能である。なお出力ファイルのレイアウトが特殊な場合など、定義の記述を抽出できない場合は、ユーザにレイアウトに係る情報を入力させるようにしてもよい。
ここでマッチング処理とは、出力ファイルを生成するために複数の入力ファイルを突き合わせて同じ項目、すなわち同一のデータキーに対応づけられた数値データを抽出する処理である。前出の給与ファイルの例では、入力ファイルとして従業員番号と基本給とを対応づけたファイルaと、従業員番号と残業時間および時給を対応づけたファイルbとをマッチング処理することにより、同じ従業員番号の基本給と(残業時間×時給)から算出される残業代を合計し、従業員番号と最終的な給与額とを対応付けた出力ファイルを生成できる。このような処理を行っている箇所をソースコードより抽出し、マッチングの根拠となっている項目を同定することにより、「従業員番号」がデータキーであることが特定できる。
ブレーク処理とは、一のファイル内のある項目、すなわちデータキーとして同じ値が連続して記載されているような場合にその範囲を特定し、範囲内の数値データを合計したりする際に行う処理である。前出の給与ファイルの例では、従業員番号ごとに各種手当金が複数行にわたり記載されているファイルcから、同じ従業員番号について記載された行の範囲をブレーク処理で特定することにより、範囲内に記載された手当金を合計し、従業員番号と手当金の合計とを対応付けた出力ファイルを生成できる。以下にこの処理を行うコードの例を示す。
While
If Filec_Lavel_a = Sv_Lavel_a Then
Put_c += Filec_Lavel_d
Else
Put_a = Filec_lavel_a
Put_b = Filec_lavel_b
(中略)
sv_Lavel_a = Filec_Lavel_a
(中略)
End While
上記のコードでは、「Filec_Lavel_a」が上述の例の従業員番号、「Filec_Lavel_d」が手当金にあたる。ある従業員番号がループ内でセーブされ、以後、同じ項目の値がセーブされた値と比較されている。その結果が同一であれば、その行の数値データ、すなわち手当金を加算していく。このような処理の場合、ブレーク処理のキー、すなわち「Filec_Lavel_a」をデータキーとして特定できる。
また、パターンマッチングができないなど何らかの理由によりプログラムの解析でデータキーが特定できない場合は、入力ファイルと出力ファイルを統計分析してデータキーを特定してもよい。例えばデータキーは、入力ファイルと出力ファイルで同じ値のデータ数が、nを自然数としたとき、1対1に対応するか、n対1に対応するか、1対nに対応するかのいずれかである場合が多い。この性質を利用して入力ファイルと出力ファイルの各カラムの値の個数を比較し、このような対応が見られるカラムを抽出することによってデータキーを特定する。またプログラムの解析でデータキーが特定できた場合でも、統計分析により再確認を行うことによりデータキー特定の精度を上げても良い。さらに、比較用ジョブ80において本番出力ファイルと仮想出力ファイルを比較する際、プログラムの解析によって特定したデータキーが上記対応をなしていない場合、データキーの特定に一旦処理を戻し、統計分析も含めてデータキーを特定し直したうえ、出力ファイルの比較を行う、というスパイラルな処理を行うようにしてもよい。このようにすることで、比較の精度が向上する。
処理内容特定部54は、解析対象のプログラムの入力ファイル、出力ファイルをハードディスク13より読み出し、ファイルのレイアウトに基づき、データキーごとに、それに対応づけられた、同じ項目の数値データと突き合わせを行うことにより、当該数値データの差分を取得する。例えば従業員番号に対応づけられたある項目の数値データが、入力ファイルでは「0」の値であったものが出力ファイルでは0以外の数値であった場合、それを差分として抽出する。これにより、対象プログラムは当該差分を発生させる処理を行っている、ということが特定できる。
差分の取得時、別のデータキー、例えば別の従業員に対応付けられた数値データと比較しても意味がないため、データ形式解析部52が特定するデータキーが必要となる。処理内容特定部54は、実運用においてハードディスク13に蓄積された、所定期間分の入出力ファイルのそれぞれから差分を抽出しておく。あるいは仮想処理74における入出力ファイルを処理対象としてもよい。
更新特性取得部56は、データキーの値と、それぞれに対応づけられた数値の更新内容、例えばどのプログラムによりいつどのように更新されたか、といった情報とを紐づけ、データ更新の特性によってデータキーの値を分類する。例えば出勤形態の異なる従業員の日給データのファイルの場合、従業員番号がデータキーであるから、従業員番号の具体的な値にそれぞれ対応付けられたデータの更新内容を取得することにより、上1桁が「9」の従業員番号に対応する数値データはプログラムXにより毎日更新され、上1桁が「1」の従業員番号に対応する数値データはプログラムYにより金曜日にのみ更新されている、というように分類できる。データキーが複数の項目からなる場合も同様に、単一の項目ごと、および当該複数の項目の値の組み合わせごとに更新特性の分類可否を解析する。
これには例えば、更新内容の各種情報をデータキーごとに順次取得していき、前に取得された更新内容のパターンと同様のパターンの更新内容を有するデータキーをまとめていくことによって実現できる。更新処理はデータ中に潜在的に混合する複数のグループの一部を更新していると仮定して解析し、プログラムが行う更新内容を順序立てて表現することが可能となる。それを出力部42より出力すると、ユーザがプログラムの仕様を把握し易くなる。
テストケース作成部58は更新特性取得部56が取得した結果に基づき、テストを実行すべき日程と、各日程においてテストを実行した際、確認すべき項目を決定する。例えば上記の例では、上1桁が「9」の従業員番号のデータに関しては任意の日付、上1桁が「1」の従業員番号のデータに関しては金曜日に、各データを入力ファイルとする仮想処理74を実行し、本番処理72の結果と比較する必要がある。このように実運用において発生しうる状況を網羅するようにテストを実行することにより、リリース後に問題が発生するのを防止できる。また、テストの実行を必要最小限に抑えることができ、無駄なテストによって実運用に用いるリソースを圧迫したり、運用オペレータの負担を増やすことがなくなる。
比較処理管理部60は、テストケース作成部58が決定した内容を出力部42から出力するとともに、ジョブ処理部28を制御し、テストを実行すべき日に仮想処理74を実行させる。実際には前述のジョブスケジューラに仮想処理74を行うように要求してもよい。同時に、テストの進捗度合いの情報を出力部42から出力する。
比較処理管理部60はさらに、比較用ジョブ80の比較結果を取得し、所定の基準によって本番出力ファイルと仮想出力ファイルとが不一致であることを検出すると、上述のデータキーの分類を利用して不一致の原因を予測してもよい。所定の基準とは全ての項目の値、あるいは所定の項目の値が一致している場合に、それを一致と判定するなど、あらかじめ処理内容に応じて設定しておく。一方、本番出力ファイルを統計処理してそれまでの各項目の値の傾向を算出し、不一致となった値が、それまでの傾向から著しく逸脱している場合に当該値を更新した処理を原因として導出する。ここで値の傾向は、不一致となった項目単独での発生確率、および、当該値と因果関係のある項目との複合条件による発生確率によって表す。
この際、上記データキーの更新特性による分類結果を利用する。具体的には、分類対象となったデータキーの値の範囲と範囲別の出現率、およびデータキーが各範囲にあるときの他の項目の値の範囲と範囲別の出現率を算出する。これにはベイジアンネットワークによる確率的な因果関係の解析手法と同様の手法を適用することができる。すなわち分類対象となったデータキーを親ノードとし、それ以外の項目を子ノードとしてリンクを張る。ここで子ノードの項目、すなわち分類対象となったデータキー以外の項目同士に因果関係が存在する場合はその項目同士もリンクを張る。そしてそれぞれの項目について値の範囲と出現率との組を算出しておく。
そして、不一致となった値を含む行について、親ノードから子ノードへリンクを辿ることにより、分類対象となったデータキーの範囲や因果関係のあるその他の項目の範囲を条件に含めた場合の、不一致となった項目の範囲別の確率を取得し、不一致となった値がどの程度の確率で発生し得るかを導出する。発生確率が低ければ当該項目の更新処理が不一致の原因である確率が高くなる。比較処理管理部60は例えば、発生確率が所定のしきい値以下である項目やその更新処理を行っているプログラムなどを、不一致の原因として出力部42を介してユーザに通知する。ただしユーザへの通知手法はこれに限らず、例えば発生確率を所定の換算式で原因確率に換算して出力するなどでもよい。
次にファイル解析部38の動作について説明する。図8はファイル解析部38が行うファイル解析およびテスト実行管理の処理手順を示すフローチャートである。まずハードディスク13の仮想ディレクトリ36に仮想ジョブ78のプログラムが格納された、といったことを検出することにより、ファイル解析部38はテストの開始を検知する(S28)。あるいは、ユーザがテスト対象のプログラムの登録をジョブ登録部22に対し行った際、ジョブ登録部22から通知するようにしてもよい。
するとデータ形式解析部52は、ハードディスク13の本番ディレクトリ34から本番ジョブ76のプログラムのソースコードを読み出し、入出力ファイルのファイルレイアウトおよびデータキーを取得する(S30)。S30の処理は、プログラムが登録される都度、実行し、得られた情報を前もってハードディスク13に格納しておくようにしてもよい。続いて処理内容特定部54は、本番ディレクトリ34から本番ジョブ76で実行されるプログラムが出力した所定期間の出力ファイルを読み出し、上述のように入力ファイルと出力ファイルの差分を取得することでプログラムの処理内容を特定する(S32、S34、S36)。本番ジョブ76が複数のプログラム処理を含み、それらのプログラムの入出力ファイルが得られる場合は、プログラムごとに処理内容を特定する。テスト対象のプログラムによっては、通常出力しないファイルをテストのために出力するようにしてもよい。
次に更新特性取得部56は、数値データの更新内容に基づきデータキーを分類する(S38)。この際、各データキーに対応する数値データを更新しているプログラムとも紐づけを行うことにより、どのプログラムがどのような処理特性を有するかを特定する。するとテストケース作成部58は、特定された処理特性に基づき、テストを実行すべき日程およびテスト結果において確認すべき項目を導出することによりテストケースを作成する(S40)。確認すべき項目は、その日程で更新される項目と考えることができる。それらの情報を受け取ると比較処理管理部60は、出力部42より当該情報を出力してユーザに開示するとともに、ジョブ処理部28を制御してテストを日程通りに実行させる。そして、テストの進捗度合いを管理し、出力部42より出力する、といったテストの実行管理を行う(S42)。
ユーザは、ジョブ処理部28の仮想ジョブ処理部32が出力部42を介して出力した、本番出力ファイルと仮想出力ファイルとの比較結果のうち、比較処理管理部60が出力した確認すべき項目を確認する。これによりリリースの可、不可を効率的に判断できる。また進捗度合いを確認することにより、リリースの見通しを立てることができる。あるいは前述の如く、比較処理管理部60が、本番出力ファイルと仮想出力ファイルとの比較結果からリリースの可、不可を自動で判断してもよい。例えば、テストケース作成部58が特定した、確認すべき項目の数値データが、本番出力ファイルと仮想出力ファイルとで差がなかった場合に、テスト対象のプログラムが問題ないと判断してもよい。また、別の判断基準をあらかじめ設定しておいてもよい。
さらに、上述のとおり本番出力ファイルと仮想出力ファイルとで不一致と判定したら、S38における分類結果を利用して不一致の原因である値、その項目、更新しているプログラムの記載などを特定し、ユーザに通知してもよい。
以下、ファイル解析部38の処理内容を具体例に沿って説明する。図9は以後の説明で想定する処理のフロー例と入出力ファイルの内容例を示している。処理のフロー例170では、「プログラムA」、「プログラムB」、「プログラムC」の3つのプログラムがこの順で処理される。これらのプログラムは実運用で実行されており、これらのプログラムに代わる3つのプログラムのテストに際し、ファイル解析部38が解析を行う場合について説明する。
処理のフロー例170では、「プログラムA」は「勘定科目残高」ファイルと「外国通貨残高」ファイルを入力ファイルとし、「勘定科目残高」ファイルを更新する処理を行う。「プログラムB」は「プログラムA」の出力ファイルである「勘定科目残高」ファイルと「外国債券残高」ファイルを入力ファイルとし、「勘定科目残高」ファイルを更新する処理を行う。「プログラムC」は「プログラムB」の出力ファイルである「勘定科目残高」ファイルと「外国為替レート」ファイルを入力ファイルとし、「勘定科目残高」ファイルを更新する処理を行う。すなわち「勘定科目残高」ファイルが3つのプログラムによって順次更新されていく。同図の例では、「プログラムA」が外国通貨を取り込む処理、「プログラムB」が外国債券を取り込む処理、「プログラムC」が月間累計を算出する処理を行うが、そのような処理内容を把握していなくても処理内容に係る必要な情報を以下のように取得できる。
同図では、各プログラムに入出力される際の「勘定科目残高」ファイルの内容例を、破線矢印で対応づけて示している。「勘定科目残高」は種別欄172a、基準日付欄172b、外国通貨欄172c、および外国債券欄172dからなるデータ構造を有する。まず、「プログラムA」に入力される際の「勘定科目残高」ファイルは、データ172のように、データの種別として「日別明細」が種別欄172aに、処理された日付として「2007/7/1」が基準日付欄172bに記載されている。外国通貨欄172c、および外国債券欄172dは書き込みがなされておらず初期値として「0」が記載されている。
次に「プログラムA」から出力され、「プログラムB」に入力される「勘定科目残高」ファイルは、データ174のように、データ172の外国通貨欄172cに値「111111.00」を書き込んだものである。次に「プログラムB」から出力され、「プログラムC」に入力される「勘定科目残高」ファイルは、データ176のように、データ174の外国債券欄172dに値「222222.22」を書き込んだものである。そして「プログラムC」から出力される「勘定科目残高」ファイルは、データ178のように、新たなデータの種別として「月間累計」が種別欄172aに、処理された日付として「2007/7/1」が基準日付欄172bに、値「111111.00」が外国通貨欄172cに、値「222222.22」が外国債券欄172dに記載された新たな行が追加されている。
このような状況において各プログラムに代わるプログラムのテストを行う際、まずデータ形式解析部52は、各プログラムのソースコードを解析することにより、種別欄172aおよび基準日付欄172bに記載された値がデータキーであり、それぞれの行の右2つの欄、すなわち外国通貨欄172cおよび外国債券欄172dに、データキーに対応する数値データが記載されることを特定する。すると処理内容特定部54は、データ172、データ174、データ176、データ178のような内容を有する「勘定科目残高」ファイルをハードディスク13より読み出す。
そして同日に処理された「勘定科目残高」ファイルの各段階の差分を取得する。図10はファイルの差分を、各項目に対し生成、読み出し、更新、削除のいずれがなされたかを示すCRUD(Create, Read, Update, Delete)として取得した場合の取得結果例を示している。同図のデータは図9に示した処理のフローを実行した際の「勘定科目残高」ファイルの差分を示している。差分データ180は、処理日欄182a、処理時刻欄182b、プログラム欄182c、種別欄182d、基準日付欄182e、外国通貨欄182f、および外国債券欄182gを含む。処理日欄182a、処理時刻欄182b、プログラム欄182cには、読み出されたファイルが各プログラムにより出力された日、時刻、および出力したプログラム名が記載される。ファイルとプログラムの紐付けは、ログを参照して取得してもよいし、ジョブが登録された際、入出力ファイル情報を抽出しておいてもよい。
そして種別欄182d、基準日付欄182e、外国通貨欄182f、および外国債券欄182gには、「勘定科目残高」ファイルに含まれる各項目のCRUDが記載される。種別欄182d、基準日付欄182e、外国通貨欄182f、および外国債券欄182gは当然、処理対象のファイルに含まれる項目名によって異なる名称となる。差分データ180の2行目は、図9の処理のフローを2007年7月1日に処理した結果、記録された、データ172とデータ174との差分を表している。すなわち、「2007/7/1」の「22:11:00」に「プログラムA」により、「外国通貨」の数値データが「U(更新)」されている。
同様に、3行目では「プログラムB]により、「外国債券」の数値データが「U(更新)」され、4行目では「プログラムC」により、「種別」、「基準日付」、「外国通貨」、「外国債券」の数値データが新たに「C(作成)」されていることが表されている。この差分データ180により、2007年7月1日において、各プログラムがどのような処理を行ったかが取得できる。差分データ180は出力部42から出力してユーザに開示するようにしてもよい。出力を表示装置に行い、差分データ180の特定の行をユーザが選択すると、元の「勘定科目残高」ファイルのサンプルデータが表示されるようにしてもよい。このようにすることで、ユーザは処理の内容をより具体的にイメージし易くなる。
このような差分データを例えば一ヶ月など所定の期間分、取得する。すると更新特性取得部56は、前述のとおりデータキーの値を処理特性に応じて分類する。図9の例ではデータキーが種別欄172aおよび基準日付欄172bに記載された値の2種類存在する。この場合は、分類する試行を繰り返すことにより、明確な分類が可能となる方を選択する。このようなルールはあらかじめ設定しておく。データキーが多数存在する場合でも、そのいくつかを無視して分類を行うことにより、一見、複雑な更新内容を系統立てて捉えることが可能となる。
上述の例では、例えば種別欄172aの値に着目して分類するとする。種別欄172aの値は、差分データ180における種別欄182dで「C」と記載されている際に新たに生成されているため、その処理に対応する「勘定科目残高」ファイルのデータ、すなわちデータ178などから特定することができる。図9に示した例では、種別欄172aの値として「日別明細」と「月間累計」が存在する。
そして所定期間分の差分データ180と各「勘定科目残高」ファイルから、「日別明細」の処理特性、「月間累計」の処理特性を取得し、分類する。この例では分類対象が2つの値のみであるため、処理特性が異なるか否かで分類結果が決定されるが、3つ以上の値を有するデータキーの場合は、上述の従業員番号のように、どの処理特性に当てはまるかを順次シミュレーションしていくことにより分類する。図11は、図9の例で更新特性取得部56が行った分類結果例を示している。分類データ190は、分類欄190a、種別欄190b、プログラム欄190c、処理日欄190d、対象欄190e、処理内容欄190fを含む。
この例では、「日別明細」と「月間累計」の処理特性が分類できる場合を示している。そのため、分類欄190aには、分類を識別する番号として「1」および「2」が記載され、種別欄190bにはそれぞれに対応して「日別明細」と「月間累計」が記載されている。なお種別欄190bは、分類対象となるデータキーによってその名称が異なる。続くプログラム欄190c、処理日欄190d、対象欄190e、および処理内容欄190fは、分類の根拠となる処理特性を表す。この例では、分類が「1」である「日別明細」は、「プログラムA」および「プログラムB」によって対応する数値データ、すなわち「勘定科目残高」ファイルの外国通貨欄172cの「外国通貨」の値および外国債券欄172dの「外国債券」の値がそれぞれ、「毎日」「U(更新)」される、という処理特性を有する。
一方、分類が「2」である「月間累計」は、「プログラムC」によって、対応する「外国通貨」と「外国債券」の値が、「月初」に「C(作成)」され、さらに「毎日」「U(更新)」される、という処理特性を有する。なお上述の例は、「処理日」と「処理内容」によって処理特性を定義した場合を示しているが、処理内容や目的に応じて別の要素を処理特性として定義してもよい。
図12は分類データ190等に基づきテストケース作成部58が作成するテストケースの例を示している。図11に示した分類データ190の場合、「プログラムA」による「日別明細」の「外国通貨」の数値データの更新、「プログラムB」による「日別明細」の「外国債券」の数値データの更新、「プログラムC」による「月間累計」の「外国通貨」と「外国債券」の作成および更新が全て正しく実行されていることが確認できれば、全ての状況を網羅したテストを行ったことになり、リリースを安全に行うことができる。ここで「プログラムC」による「外国通貨」と「外国債券」の作成は月初にのみ行われるため、「プログラムC」の当該動作を確認するテストは、月初に行う必要がある。
テストケース作成部58はこのような観点からテストケースを作成する。図12に示したテストケーステーブル192は、テストケース欄192a、プログラム欄192b、テスト日欄192c、確認項目欄192d、および確認動作欄192eを含む。テストケース欄192aに示されたテストケースの識別番号ごとに、テストを行うべきプログラムと日程、確認すべき項目と動作が、プログラム欄192b、テスト日欄192c、確認項目欄192d、および確認動作欄192eに記載される。例えばテストケース「1」は、「月初」に「プログラムC」を仮想ジョブ78として処理し、「外国通貨」と「外国債券」の「C(作成)」動作に異常がないかを確認するテストとなる。その他のテストケースも同様の情報を有する。この例では、「月初」および「月初翌営業日」の2回、仮想ジョブ78を実行することにより、全テスト日程が終了することがわかる。
プログラム欄192b、テスト日欄192cに記載された情報は、比較処理管理部60を介してジョブ処理部28の仮想ジョブ処理部32に通知され、仮想ジョブ処理部32は通知された日程で通知されたプログラムを含む仮想ジョブ78を実行する。一方、テストケーステーブル192は出力部42からユーザに開示され、ユーザはテストの内容を確認したり、比較用ジョブ80が出力した比較結果のうち確認すべき内容を把握したりできる。
さらに比較処理管理部60は、テストの進捗度合いを出力部42から出力する。図13はその際出力されるテストの進捗度合い情報の例を示している。進捗度合いテーブル194は、テストケース欄194a、確認予定日欄194b、確認有無欄194c、およびカバレッジ欄194dを含む。進捗度合いテーブル194は、例えばテストケーステーブル192と同一の画面内に表示することにより、テストケースごとに対応をとることができる。そのためテストケース欄194aには、テストケーステーブル192のテストケース欄192aに記載されたテストケースの識別番号が記載される。
そして確認予定日欄194bには、テストを実行する予定日が記載される。予定日は、テストケーステーブル192のテスト日欄192cに記載された情報と、予定を決定する日に基づき決定する。確認有無欄194cには、テストを実行した日付が記載される。図13の例では、テストケース「2」、「3」、「4」はテストを実行済みであるため、確認予定日欄194bは空欄であり、実行した日が確認有無欄194cに記載されている。一方、テストケース「1」は未実行であるため、確認予定日欄194bに実行予定日が記載され、確認有無欄194cは空欄である。
またカバレッジ欄194dには、テストケースのうち実行済みのテストケースの割合がカバレッジとして記載される。図13の例では、テストケース「1」のみ未実行で、テストケース「2」、「3」、「4」が実行済みであるため、カバレッジは「75%」となる。カバレッジの定義はテストケースの割合以外に、日程の割合などでもよい。ユーザは進捗度合いテーブル194を確認することにより、リリースまでの見通しを確認できる。
比較処理管理部60が本番出力ファイルと仮想出力ファイルとの比較結果からプログラムが正しく動作していることを自動で確認する場合は、上述の「実行済み」を「確認済み」と置き換えることができる。すなわち各テストを実行後、本番出力ファイルと仮想出力ファイルとで、テストケーステーブル192の確認項目欄192dに記載された項目に差がなかった場合に、テスト対象のプログラムに問題がなかったことを確認できたとして、確認有無欄194cに確認した日付を記載する。このような態様では、ユーザがテストを行いたいプログラムを登録するのみで、必要な日程でのテストの実行、結果の確認、リリース処理までを全て自動で行えるようになる。あるいは、ユーザが自ら確認を行った後、問題がなかった旨の入力をした際に、「確認済み」としてもよい。
図14は、本番出力ファイルと仮想出力ファイルに差が生じていた場合に、比較処理管理部60が原因を解析する際に生成する因果関係のリンク図を示している。リンク図196は「親ノード」と「子ノード」からなり、上述の例ではデータキーのうちデータの「種別」が分類されているため、「親ノード」は「種別」となる。そしてそれ以外の項目、すなわち「基準日付」と、「外国通貨」と、「外国債券」が「子ノード」となる。この例の場合、「子ノード」となる各項目には因果関係はないとし、「親ノード」と各「子ノード」にのみリンクが張られている。このような因果関係は、あらかじめユーザなどにより設定を行うか、データキーを元にして自動で作成してもよい。それを比較処理管理部60リンク図196の形式とすることで、各種確率を算出する。
上述の例では、「種別」の値は「日別明細」と「月間累計」のみであるため、それ以外の値が発生していれば、「種別」もしくはその値を生成した処理が不一致の原因であると推測する。「種別」は一致しているが、「外国通貨」の値が不一致である場合は、まず、「外国通貨」単独での範囲別発生確率を参照して、不一致となった値の発生確率を求める。発生確率が所定のしきい値より低ければ、当該項目もしくはその操作が不一致の原因であると予測する。また、「外国通貨」単独での発生確率が所定のしきい値以上であったら、親ノードである「種別」の値との複合条件での範囲別発生確率を参照して、不一致となった値の発生確率を求める。発生確率が所定のしきい値より低ければ、当該項目もしくはその操作が不一致の原因であると予測する。ただしこの場合は、「外国通貨」単独条件での発生確率に対する判断より原因である確率は小さいと考えられるため、その差を認識できるようにユーザに通知する。例えば原因確率を数値で表すことにより、その差を反映させるようにしてもよい。
以上述べた本実施の形態によれば、新たなプログラムやジョブのテストを行いたい場合、本番機であるシステムに仮想ディレクトリを設けてプログラムなどを格納し、テスト対象のプログラムを本番処理と並行して実行するようにスケジューリングする。そして仮想ディレクトリ内のデータは、テスト終了後に削除する。これにより、本番機におけるテスト実行を安全に遂行することが可能になる。情報処理技術が発展しシステムの処理能力が増強するほど、本番機でテストを行う本実施の形態の効果が発揮される。
本番機でテストを行うことにより、開発機に入力データをコピーすることにより生じる、セキュリティ上の問題を回避できると同時に、コピーのための工数を削減できる。また、入力データをマスクする必要がなく、利用するリソースも本番処理と同様にできるため、実際のデータ、リソースを用いた正確なテストを行うことができる。さらに、一のシステム内で本番処理とテスト処理を実行するため、本番処理で得られる出力ファイルとテスト処理で得られる出力ファイルとを比較するジョブを生成でき、出力ファイルの比較を容易に行うことができる。また、テストを行いたいプログラムのみ仮想ジョブとして実行すれば、前後のジョブは本番処理と兼用できるため、テスト自体の工数も削減できる。
仮想ディレクトリにデータを格納する際は、仮想リリースログを記録しておく。仮想ディレクトリは、ユーザがテストを行う旨の登録を行う都度、個別に設けられるため、所望の単位でテストおよびリリースが可能である。ここで仮想リリースログを記録しておくことにより、リリース時の本番環境へのプログラムの移行や、テスト終了後のデータの削除を抜けなく行うことができる。
また、更新対象のプログラムと、その入出力ファイルを解析することにより、プログラムの処理内容と処理特性を特定する。具体的には、ファイルレイアウトとデータキーをプログラムから導出し、データキーごとに入出力ファイルの数値データをつきあわせることにより、プログラムの処理内容を特定する。これにより、処理内容が不確かなプログラムでも、出力ファイルにいかに作用しているかを把握することができる。
そしてデータキーの値ごとに処理特性を分類する。これにより、各プログラムの処理内容の特徴を系統立てて表現することができ、ユーザがプログラムの処理内容を把握し易くなる。さらにテストを実行すべき日程と、実行時に確認すべき項目を取得することができ、テストの実行と結果の確認を効率的かつ正確に行うことができる。また結果の確認を自動化することもできる。
プログラムを解析する既存の手法であるレーベルサーチでは、実際の出力ファイル上のデータとプログラムとを個々に結びつけることができないため、データキーの値ごとに影響を予測することが困難である。本実施の形態では、実際の出力結果からプログラムの処理内容を導出するため、プログラムの出力ファイルへの影響を詳細かつ正確に取得することができる。例えば作成されてから長時間経過したプログラムなどの場合、レーベルサーチでは検出されるが実際は動作していない機能が存在する場合がある。過去に扱っていた商品や過去に導入された雇用形態などが現在では存在しない場合がそれにあたる。
このような場合、当該機能に着目したテストを行うことは非効率的である。一方、本実施の形態では、実際の出力結果から処理内容を同定するため、必要な期間の出力結果を用いれば、現在動作している機能のみに着目したテストを行うことができ、効率的である。なお、レーベルサーチの上記性質を利用して、本実施の形態の処理内容解析結果と比較することにより、現在動作していない、あるいは希にしか動作しない機能を洗い出すことが可能である。このような機能が検出された場合、元のプログラムから該当する記述を削除するなどの修正案を導出することができる。
また、ユーザがプログラムの処理内容などを把握していなくてもテストを実行し、テスト後の処理を確実に行うことができるため、システムに関する知識の少ないオペレータなどでも安全にテストを遂行することが可能である。またプログラムの処理内容に関わらず同様にテストを実行できる。結果として、人件費やシステムごとの開発コストを抑制することができる。
さらに、テスト時の出力ファイルの比較を行った結果、不一致が発生していた場合に、その原因を統計的手法により導出する。これによりテストプログラムなどにおいて修正すべき箇所に関する情報をユーザに与えることができ、開発作業の効率性向上を支援することができる。
以上、本発明を実施の形態をもとに説明した。この実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
例えば本実施の形態では、データベース17は参照されるのみであり、出力はハードディスク13への出力ファイルの格納のみであった。一方、テスト対象のプログラムの処理にデータベース17への書き込み処理が含まれていてもよい。この場合、本番処理で書き込まれる本番データベースと同様の構造を有する仮想データベースを用意し、仮想ジョブによる書き込みは当該仮想データベースに対して行うようにする。まずテスト実行前に、本番データベースを停止させてスナップショットを取得し、仮想データベースに本番データベースの内容を反映させる。以前に同様のテストを行っている場合は、その時点からの更新分のみをコピーする。
そして仮想データベースのその時点でのチェックポイントを取得してから、本番ジョブと仮想ジョブを並列に処理し、それぞれのデータベースに書き込まれた内容を比較する。テスト終了後、取得しておいたチェックポイントまで仮想データベースをロールバックすることにより、仮想ジョブによって書き込まれたデータを削除した状態とする。これにより本実施の形態における仮想出力ファイルと同様、データベースへの書き込み結果を比較したうえ、仮想データベースをテスト前の状態へ戻すことができる。
また本実施の形態では、ファイル解析部38におけるプログラムの処理内容や処理特性を特定する機能を、テストケースの作成やテスト結果の確認に用いた。一方、当該機能のみを有する解析装置を、プログラムの処理内容を取得する目的に用いてもよい。例えば刷新されずにファイルベースの処理のまま取り残されたレガシーシステムの中には、その処理仕様がブラックボックス化してしまったシステムも存在している。このような場合に同様の解析を行うことにより、処理内容や処理特性を特定でき、出力結果への影響や、新規プログラムとの比較などを行うことができる。
さらに、バッチ処理を行っている本番機に対する新規ジョブのテストでなく、単体のプログラムを実行する装置や開発機において修正プログラムをテストする際にファイル解析の機能を用いることもできる。このときも、本実施の形態と同様に、更新特性から想定すべき状況や確認すべき結果などを取得することにより、テストを効率的かつ正確に行うことができる。そして、テストの結果が問題ないことを自動で判定することができる。さらに、様々なシチュエーションを考慮した最適な入力データをテストケースとして作成することもできる。
10 ジョブ処理システム、12 第1サーバ、 13 ハードディスク、 14 第2サーバ、 17 データベース、 22 ジョブ登録部、 26 比較用ジョブ生成部、 28 ジョブ処理部、 30 本番ジョブ処理部、 32 仮想ジョブ処理部、 34 本番ディレクトリ、 36 仮想ディレクトリ、 38 ファイル解析部、 40 リリース処理部、 42 出力部、 52 データ形式解析部、 54 処理内容特定部、 56 更新特性取得部、 58 テストケース作成部、 60 比較処理管理部、 100 ファイル情報のテーブル。