"メソッドの集合を利用する利用プログラムによる前記メソッドの実行の検知に応じて該実行の履歴を記録し、前記履歴を、記憶部が記憶する、前記メソッドの集合に関する文脈上の規則情報と照合して、前記利用プログラムによる前記メソッドの実行に関して前記規則情報に対する違反を検出し、検出結果を前記記憶部に記録し、前記規則情報と前記検出結果との組み合わせに対応付けて前記記憶部が記憶するテストコードを実行させるテストプログラムを生成する処理をコンピュータが実行するテストプログラム生成方法。前記検出結果は、前記違反が検出された前記メソッドのメソッド名を含み、前記生成する処理は、前記メソッド名に係る前記メソッドの実行の検出に応じて前記テストプコードを実行させる前記テストプログラムを生成する請求項1記載のテストプログラム生成方法。前記規則情報に係る前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録プログラムを生成する処理と、前記履歴を前記規則情報と照合して前記利用プログラムによる前記メソッドの実行に関して前記規則情報に対する違反を検出する検出プログラムを生成する処理とを前記コンピュータが実行し、前記履歴プログラムは、前記履歴を記録する処理を前記コンピュータに実行させ、前記検出プログラムは、前記検出手順を前記コンピュータに実行させる請求項1又は2記載のテストプログラム生成方法。メソッドの集合を利用する利用プログラムによる前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録部と、前記履歴を、記憶部が記憶する、前記メソッドの集合に関する文脈上の規則情報と照合して、前記利用プログラムによる前記メソッドの実行に関して前記規則情報に対する違反を検出し、検出結果を前記記憶部に記録する検出部と、前記規則情報と前記検出結果との組み合わせに対応付けて前記記憶部が記憶するテストコードを実行させるテストプログラムを生成する生成部とを有するテストプログラム生成装置。メソッドの集合を利用する利用プログラムによる前記メソッドの実行の検知に応じて該実行の履歴を記録し、前記履歴を、記憶部が記憶する、前記メソッドの集合に関する文脈上の規則情報と照合して、前記利用プログラムによる前記メソッドの実行に関して前記規則情報に対する違反を検出し、検出結果を前記記憶部に記録し、前記規則情報と前記検出結果との組み合わせに対応付けて前記記憶部が記憶するテストコードを実行させるテストプログラムを生成する処理をコンピュータに実行させるテストプログラム生成プログラム。しかしながら、ブラックボックステストでは、以下の4つのケースにおいて、結果が同じであるケースAとケースB、又はケースCとケースDとを明確に区別できないという問題がある。A正しい実装で、かつ、結果もOKB誤った実装バグの可能性が有り、結果はOKC正しい実装であるにも拘わらず、結果はNGD誤った実装バグの可能性が有り、結果はNG以上を区別するためには、テストを詳細化する必要がある。詳細化に関して、従来のブラックボックステストでは、テスト対象のプログラムの全ての入力箇所に対してテストを追加したり、考えられる全ての入力値を入力したりする必要がある。その結果、多数の冗長なテスト項目が発生し、開発作業の効率性を低下させてしまう可能性があった。そこで、ブラックボックステストに関する作業効率を向上させることのできるテストプログラム生成方法、テストプログラム生成装置、及びテストプログラム生成プログラムの提供を目的とする。そこで上記課題を解決するため、テストプログラム生成方法は、メソッドの集合を利用する利用プログラムによる前記メソッドの実行の検知に応じて該実行の履歴を記録し、前記履歴を、記憶部が記憶する、前記メソッドの集合に関する文脈上の規則情報と照合して、前記利用プログラムによる前記メソッドの実行に関して前記規則情報に対する違反を検出し、検出結果を前記記憶部に記録し、前記規則情報と前記検出結果との組み合わせに対応付けて前記記憶部が記憶するテストコードを実行させるテストプログラムを生成する処理をコンピュータが実行する。ブラックボックステストに関する作業効率を向上させることができる。以下、図面に基づいて本発明の実施の形態を説明する。図1は、本発明の実施の形態におけるテストプログラム生成装置のハードウェア構成例を示す図である。同図のテストプログラム生成装置10は、それぞれバスBで相互に接続されているドライブ装置100と、補助記憶装置102と、メモリ装置103と、CPU104と、インタフェース装置105と、表示装置106と、入力装置107とを有する。テストプログラム生成装置10での処理を実現するプログラムは、CD-ROM等の記録媒体101によって提供される。プログラムを記録した記録媒体101がドライブ装置100にセットされると、プログラムが記録媒体101からドライブ装置100を介して補助記憶装置102にインストールされる。但し、プログラムのインストールは必ずしも記録媒体101より行う必要はなく、ネットワークを介して他のコンピュータよりダウンロードするようにしてもよい。補助記憶装置102は、インストールされたプログラムを格納すると共に、必要なファイルやデータ等を格納する。メモリ装置103は、プログラムの起動指示があった場合に、補助記憶装置102からプログラムを読み出して格納する。CPU104は、メモリ装置103に格納されたプログラムに従ってテストプログラム生成装置10に係る機能を実現する。インタフェース装置105は、ネットワークに接続するためのインタフェースとして用いられる。表示装置106はプログラムによるGUIGraphicalUserInterface等を表示する。入力装置107はキーボード及びマウス等であり、様々な操作指示を入力させるために用いられる。図2は、本発明の実施の形態におけるテストプログラム生成装置の機能構成例を示す図である。テストプログラム生成装置10は、例えば、或るライブラリを使用して開発されるアプリケーションに関して、当該ライブラリの文脈上のルール規則又は制約等以下、ルールで統一するに対する違反の有無を検出する。文脈上のルールとは、ライブラリに含まれる関数又はメソッドの呼び出しの有無や呼び出しの前後関係呼び出し順等に関するルールをいう。テストプログラム生成装置10は、更に、ルールの違反の有無の検出に基づいて、ブラックボックステストの範囲を限定し、当該範囲に関してブラックボックステストを行うプログラムテストプログラムTpを生成する。斯かる機能を実現するため、テストプログラム生成装置10は、ルール解析部12、プログラム生成部13、及びテストプログラム生成部15等を有する。これら各部は、テストプログラム生成装置10にインストールされたプログラムがCPU104に実行させる処理により実現される。テストプログラム生成装置10は、また、ルール記述記憶部11、雛形データ記憶部14、検出ログ記憶部16、テストポリシーリスト記憶部17、及びシナリオコード記憶部18等を有する。これら各記憶部は、補助記憶装置102、又はテストプログラム生成装置10とネットワークを介して接続される記憶装置等を用いて実現可能である。ルール記述記憶部11は、例えば、アプリケーションより利用されるライブラリについて、ルール記述を記憶する。ルール記述とは、ライブラリの利用に関する文脈上のルールが所定の形式又は文法によって記述されたテキストデータをいう。本実施の形態において、ルール記述は、ルール要素がオペレータによって接続された式形式によって記述される。ルール要素とは、ルールの最小要素をいう。ルール要素単体でも、一つのルール記述が成立しうる。オペレータは、ルール要素間の論理関係を示す記号をいう。図3は、ルール記述を構成するルール要素の例を示す図である。同図には、4つのルール要素と、それぞれのルール要素のルール記述内における記述形式が示されている。なお、同図の記述形式において、小文字のアルファベットa~jは、ライブラリに含まれる関数又はメソッド以下、メソッドで統一する。を示す。一つ目は、cメソッド内において、aメソッドがbメソッドの実行前の必須条件であることを示すルール要素である。すなわち、cメソッド内において、bメソッドが実行される場合は、bメソッドの実行前にaメソッドが必ず実行されなければならないことを示すルール要素である。当該ルール要素は、Beforea,b,cの形式でルール記述に記述される。以下、当該ルール要素をBeforeルール要素という。二つ目は、fメソッド内において、dメソッドがeメソッドの実行後の必須条件であることを示すルール要素である。すなわち、fメソッド内において、eメソッドが実行される場合は、eメソッドの実行後に必ずdメソッドが実行されなければならないことを示すルール要素である。当該ルール要素は、Afterd,e,cの形式でルール記述に記述される。以下、当該ルール要素をAfterルール要素という。三つ目は、hメソッド内におけるgメソッドの呼び出しが必須条件であることを示すルール要素である。すなわち、gメソッドが、hメソッド内において必ず呼び出されなければならないことを示すルール要素である。当該ルール要素は、Callg,hの形式でルール記述に記述される。以下、当該ルール要素をCallルール要素という。四つ目は、引数の型が指定されたメソッドの呼び出しの必須条件を示すルール要素である。すなわち、iメソッドについて、特定の型の引数が指定されたバージョンがjメソッド内において必ず呼び出されなければならないことを示すルール要素である。当該ルール要素は、Calli型,jの形式でルール記述に記述される。以下、当該ルール要素を型指定Callルール要素という。また、図4は、ルール記述を構成するオペレータの例を示す図である。同図には4つのオペレータと、それぞれのオペレータのルール記述内における記述形式が示されている。一つ目は、式kかつ式lの関係を示すためのオペレータである。すなわち、式k及び式lの双方が必ず満たされなければならないというルールを記述するためのオペレータである。当該オペレータは、によってルール記述に記述される。二つ目は、式m又は式nの関係を示すためのオペレータである。すなわち、式m又は式nのいずれか一方が満たされなければならないというルールを記述すためのオペレータである。当該オペレータは、||によってルール記述に記述される。三つ目は、式oならば式pの関係を示すためのオペレータである。すなわち、式oが満たされる場合は、式pが必ず満たされなければならないというルールを記述するためのオペレータである。当該オペレータは、->によってルール記述に記述される。四つ目は、式qの否定を示すためのオペレータである。すなわち、式qが満たされてはならないというルールを記述ためのオペレータである。当該オペレータは、によってルール記述に記述される。なお、ルールは、ライブラリごとに異なる。したがって、ルール記述は、例えば、ライブラリの開発者、又はライブラリの使用者の中でライブラリの仕様に精通している者等によってライブラリごとに作成されるとよい。ルール解析部12は、ルール記述記憶部11に記憶されているルール記述を解析し、ルール記述の内容を、プログラム生成部13にとって処理し易い形式に変換する。より詳しくは、ルール解析部12は、ルール記述よりその構成要素後述されるルール要素一覧及び式構造を抽出する。すなわち、ルール記述は、人によって記述されうるため、人に理解し易い形式を有する。一方、人に理解し易い形式は、コンピュータによるロジカルな処理には不向きである傾向がある。そこで、ルール解析部12は、人とコンピュータプログラム生成部13との間を仲介するための処理を実行する。プログラム生成部13は、ルール解析部12による解析結果ルール解析部12によって抽出されたルール記述の構成要素に基づいて、ルール違反の有無を検出するためのプログラムのソースコードを自動的に生成する。プログラム生成部13は、履歴記録プログラム生成部131及び検出プログラム生成部132等を含む。履歴記録プログラム生成部131は、ルール違反の有無を検出するためのプログラムの一部として履歴記録プログラムPrを生成する。検出プログラム生成部132は、ルール違反の有無を検出するためのプログラムの一部として検出プログラムPcを生成する。履歴記録プログラムPrは、開発対象のアプリケーションによるメソッドの呼び出しメソッドの実行を検知し、当該呼び出しの履歴を記録するプログラムである。検出プログラムPcは、履歴記録プログラムPrによって記録された履歴に基づいて、ルール違反の有無を検出するプログラムである。検出プログラムPcは、ルール違反の有無の検出結果を示すデータ以下、検出ログという。を、検出ログ記憶部16に記録する。すなわち、検出ログ記憶部16は、検出ログを記憶する。雛形データ記憶部14は、履歴記録プログラムPr又は検出プログラムPcのソースコードの雛形となるデータ雛形データを補助記憶装置102を用いて記憶する。テストプログラム生成部15は、検出ログに基づいてテスト範囲が限定されたブラックボックスを実行するテストプログラムTpを生成する。テスト範囲が限定されることで、テスト作業の効率化を期待することができる。テストプログラム生成部15は、テストプログラムTpの生成に際し、テストポリシーリスト記憶部17が記憶するテストポリシーを参照する。テストポリシーとは、各ルールルール記述に対する違反の有無の検出結果すなわち、検出ログの内容に応じて、実行すべきシナリオコードを示すデータをいう。テストポリシーリスト記憶部17は、斯かるテストポリシーの一覧テストポリシーリストを記憶する。シナリオコードとは、予め作成されている、ブラックボックステスト用のテストコードの雛形テンプレートである。シナリオコード記憶部18は、斯かるシナリオコード群を記憶する。したがって、テストプログラム生成部15は、検出ログに係るルールの違反の有無の検出結果に応じたシナリオコードをシナリオコード記憶部18より取得し、当該シナリオコードを使用してテストプログラムTpを生成する。なお、履歴記録プログラムPr、検出プログラムPc、及びテストプログラムTpは、アスペクト指向プログラミングに基づいて作成される。アスペクト指向プログラミングが有する特長の一つが、履歴記録プログラムPr、検出プログラムPc、及びテストプログラムTpに好適だからである。当該特長とは、テスト対象検査対象のプログラム本実施の形態におけるアプリケーションの外側から当該対象のプログラムに対して作用することができるという性質である。斯かる性質により、ライブラリやアプリケーション等に変更を加えずに、アプリケーションによるライブラリのメソッドの呼び出し実行を検知等することができる。本実施の形態では、アスペクト指向プログラミング言語として、AspectJを利用する。但し、他のプログラミング言語が用いられてもよい。以下、テストプログラム生成装置10の処理手順について説明する。図5は、ルール解析部が実行する処理手順の一例を説明するためのフローチャートである。同図の処理は、例えば、ユーザによって入力される、処理の開始指示に応じて開始される。当該指示において、解析対象のルール記述の識別情報が指定される。なお、ルール記述の識別情報を、以下ルール名という。ステップS101において、ルール解析部12は、指定されたルール名に係るルール記述をルール記述記憶部11よりメモリ装置103に読み込む。すなわち、ルール記述は、ルール名に関連付けられてルール記述記憶部11に記憶されている。図6は、第一のルール記述の一例を示す図である。同図に示されるルール記述rd1は、記述d11及び記述d12を含む。記述d11は、ルール記述rd1の対象となるメソッド名を示す。したがって、記述d11より、ルール記述rd1は、メソッドSSLSocketstartHandshakeに関するルール記述であることが分かる。なお、一つのルール記述内に、複数のメソッドに関するルールが記述されてもよい。また、対象となるメソッド名を示す記述は、必須ではない。記述d12は、ルールを示す式である。記述d12では、二つのBeforeルール要素が->オペレータによって接続されている。第一項のBeforeルール要素は、BeforeSSLSocketstartHandshakehttpServletdoPostであり、第二項のBeforeルール要素は、BeforeSSLSocketstartHandshakehttpServletdoPostである。したがって、記述d12に係る式は、httpServletdoPost内において、SSLSocketstartHandshakeより前にX509TrustManagercheckServerTrustedが実行される場合実行されるならば、httpServletdoPost内において、SSLSocketstartHandshakeより前にX509CertificatecheckValidityが実行されなければならない。というルールを示す。ルール記述rd12は、Java登録商標のSSLSecureSocketLayerクライアントとしてのアプリケーションの実装におけるSSLSocketライブラリの利用に関するルールを記述したものである。すなわち、SSL通信では、サーバ証明書が信頼できるものか否かを検証することが必要とされる。Java登録商標のSSLSocketライブラリは、startHandshakeを呼び出してハンドシェークを開始する場合、証明書の検証処理は自動的に行われるため通常は問題ない。但し、X509TrustManagerの実装クラスにおいてcheckServerTrustedがオーバーライドされた場合、上記証明書の検証処理は、オーバーライドされてしまう。したがって、この場合、上記証明書の検証処理は、アプリケーションの開発者が適切に実装しなければならない。したがて、SSLクライアントとしてのアプリケーションを実装する場合におけるSSLSocketライブラリの利用に関するルールは、以下のようになる。対象メソッド:javaxnetsslSSLSocketstartHandshakeルール:サーブレッドから呼び出された処理内において、javaxnetsslSSLSocketstartHandshakeよりも前に、X509TrustManagerのcheckServerTrustedが実行される場合、必ずX509CertificatecheckValidityも実行されなければならない当該ルールをルール要素及びオペレータを用いて表現したものが、ルール記述rd1である。なお、ここでは、サーブレットから呼び出されるWebアプリケーションが、検査対象のアプリケーションの例とされている。また、httpServletdoPostは、Webサーバにおいて、HTTPリクエストのPOSTコマンドが受信されたときに呼び出されるメソッドである。したがって、上記のサーブレットから呼び出された処理に対して、httpServletdoPostが当てはめられている。ルール記述は、その解析処理の便宜を考慮して、XML形式等の構造化文書形式によって記述されてもよい。図7は、XML形式による第一のルール記述の一例を示す図である。同図のルール記述rd2は、図6のルール記述rd1において定義されているルールと同じルールをXML形式によって記述したものである。ルート要素であるrule要素<rule>タグによって囲まれた要素のlibrary属性の値SSLSocketstartHandshakeは、対象となるメソッド名を示す。rule要素の子要素rd21のタグ名->は、当該子要素の値として含まれている二つのBeforeルール要素を接続するオペレータを示す。before要素rd22は、図6の記述d12における第一項のBeforeルール要素に対応する。before要素rd23は、図6の記述d12における第二項のBeforeルール要素に対応する。すなわち、各before要素において、proc属性、succ属性、within属性は、それぞれ、Before要素のaメソッド、bメソッド、cメソッド図3参照に対応する。XML形式のデータは、既存のXMLパーサによって解析が容易である。したがって、ルール解析部12の処理内容を簡便化することができる。続いて、ルール解析部12は、読み込んだルール記述の構造を解析するS102。具体的には、ルール記述内のルール要素とオペレータとが分解され、構造化される。すなわち、各ルール要素間の論理関係がルール解析部12によって認識される。なお、ルール記述が図7に示されるようにXML形式の場合、XMLパーサによってDOMDocumentObjectModel形式に読み込まれることが、ステップS102でいうところの解析に相当する。したがって、ルール記述が構造化文書形式によって記述されている場合、ステップS101及びS102は、実質的に一つのステップとなりうる。続いて、ルール解析部12は、必要に応じてルール記述の式を変形又は変換するS103。本実施の形態では、オペレータ->を含む式に関して、オペレータ及び||を用いて変形又は変換が行われる。具体的には、A->Bの構造を有する式は、A||Bに変形される。この場合、変形の前後においてAとBとの論理関係は同じであるところ、及び||のオペレータの方が、式の論理値真偽値の評価式が示すルールが満たされているか否かの評価をし易いからである。なお、ここでのA及びBは、一つのルール要素又は式を示す。ステップS103において、オペレータ->は、全て解決置換される。続いて、ルール解析部12は、ルール記述rd1の解析結果よりルール要素を抽出するS104。続いて、ルール解析部12は、抽出されたルール要素ごとに変数名を生成する割り当てるS105。変数名とは、ルール要素の論理値真偽値を記憶するための変数に対する識別名である。ルール要素間で一意性が保証されれば変数名の命名規則は所定のものに限定されない。続いて、ルール解析部12は、ルール要素と変数名との組の一覧を、ルール名に関連付けて補助記憶装置102に記憶出力するS106。当該一覧を、以下ルール要素一覧という。図8は、第一のルール要素一覧の例を示す図である。同図のルール要素一覧rL1は、図6に示したルール記述rd1に基づいて生成されるルール要素一覧である。同図では、第一項のBeforeルール要素に対して、変数名R1が割り当てられ生成され、第二項のBeforeルール要素に対して、変数名R2が割り当てられた生成された例が示されている。続いて、ルール解析部12は、ルール記述の式における各ルール要素を、当該ルール要素に対応する変数名によって置き換えたものを、式構造とするS107。なお、ステップS103において変形された式については、変形後の式が置換の対象とされる。図6のルール要素記述rd1及び図8のルール要素一覧rL1に基づく式構造は、以下の1のようになる。R1||R21なお、ルール記述rd1の各ルール要素について、単純に変数名への置換を行った結果は、R1->R2であるが、ステップS103における変形により、ルール記述rd1より抽出される式構造は、上記1の通りとなる。続いて、ルール解析部12は、式構造をルール名に関連付けて補助記憶装置102に記憶出力するS108。続いて、プログラム生成部13の処理手順について説明する。図9は、プログラム生成部が実行する処理手順の一例を説明するためのフローチャートである。同図の処理は、例えば、ユーザによって入力される、処理の開始指示に応じて開始される。当該指示において、ルール名が指定される。但し、図5の処理と同期的に図5の処理に続いて自動的に実行されてもよい。この場合、図5の処理の開始時に指定されたルール名が、図9の処理において使用されればよい。ステップS201において、プログラム生成部13は、アスペクトの雛形アスペクト雛形を雛形データ記憶部14よりメモリ装置103に読み込む。図10は、アスペクト雛形の一例を示す図である。同図に示されるように、アスペクト雛形は、アスペクト指向プログラミング言語AspectJにおけるアスペクトの定義の雛形である。同図のアスペクト雛形t1において、アスペクト名は、パラメタ化されている。すなわち、アスペクト名には具体的な値ではなく、<アスペクト名>が記述されている。また、アスペクト雛形t1には、一行のステップs11が記述されている。ステップs11では、MAP<MAP>型の変数varTableのメモリメモリ装置103への生成が定義されている。MAP<MAP>型とは、キー名とMAP型の変数とを関連付けて記憶することのできるデータ型をいう。本実施の形態では、斯かるMAP<MAP>型の変数varTableを用いて、検査対象のアプリケーションによるライブラリのメソッドの呼び出し履歴実行履歴を管理する。図11は、本実施の形態においてライブラリの呼び出し履歴を管理するためのデータ構造の一例を概念的に示す図である。同図には、変数varTableが、便宜上、テーブル形式によって表現されている。変数varTableは、キーとしてスレッドの識別子を記憶し、値として履歴テーブルを記憶する。スレッドの識別子とは、アプリケーションのテスト検査時において履歴記録プログラムPrが動作するスレッドの識別子である。マルチスレッド環境では、履歴記録プログラムPrは、複数のスレッド上で並列的に実行されうる。そして、ライブラリに関するルール記述文脈に関するルールは、スレッドごとに満たされる必要がある。そこで、変数varTableは、スレッドごとに履歴テーブルを対応付けて記憶する。なお、通信用のライブラリの場合は、変数varTableにおいて、セッションごとにセッションIDに対応付けて履歴テーブルが記憶されてもよい。また、スレッド又はセッション以外の単位で、ルール記述が満たされる必要が有る場合、当該単位ごとに、履歴テーブルが対応付けられればよい。一方、履歴テーブルとは、本実施の形態において生成される履歴記録プログラムPr内においてcurrentTableという変数名によって参照される、MAP<boolean>型の変数である。currentTable変数履歴テーブルは、キーとしてルール要素の変数名又はルール要素内のメソッドごとに割り当てられる変数名を記憶し、値として当該ルール要素が満たされているか否かを示す真偽値、又は当該メソッドが呼び出されたか実行されたか否かを示す真偽値を記憶する。続いて、プログラム生成部13は、アスペクト雛形t1の<アスペクト名>に対して、ユーザによって指定されたルール名を当てはめて<アスペクト名>をルール名によって置換して、当該ルール名に係るルール記述rd1に対応した具体的なアスペクトのソースコードアスペクトコードを生成するS202。図12は、第一のアスペクトコードの具体例を示す図である。同図におけるアスペクトコードac1では、図10の<アスペクト名>が、SSLSocketに置換されている。すなわち、本実施の形態において、ルール記述rd1に関するルール名は、SSLSocketであるとする。なお、ステップS202では、ルール名の当てはめだけでなく、ルール名が当てはめられたアスペクトコードac1を含むファイルが補助記憶装置102に生成される。続いて、履歴記録プログラム生成部131は、指定されたルール名に関連付けられているルール要素一覧rL1図8及び式構造を補助記憶装置102からメモリ装置103に読み込むS203。続いて、履歴記録プログラム生成部131は、読み込まれたルール要素一覧rL1の中で、未処理のルール要素を処理対象とするS204。未処理のルール要素とは、ステップS205の処理対象とされていないルール要素をいう。したがって、最初は、読み込まれたルール要素一覧rL1に含まれる全てのルール要素が未処理のルール要素である。続いて、履歴記録プログラム生成部131は、処理対象のルール要素以下、カレントルール要素という。について、履歴記録プログラムPrの生成処理を実行するS205。履歴記録プログラムPrの生成処理においては、カレントルール要素について、履歴記録プログラムPrとしてのソースコードが、ステップS202において生成されたアスペクトコードac1に追加される。ステップS205は、読み込まれたルール要素一覧rL1に含まれる全てのルール要素について順番に実行されるS206。続いて、検出プログラム生成部132は、検出プログラムPcの生成処理を実行するS207。検出プログラムPcの生成処理においては、指定されたルール名に対応するルール記述に対する検出プログラムPcとしてのソースコードが、ステップS202において生成されたアスペクトコードac1に追加される。したがって、履歴記録プログラムPrと検出プログラムPcとは、ファイル単位としてはソースコードの単位としては、一つのソースコードとして生成される。続いて、ステップS205の履歴記録プログラムPrの生成処理の詳細について説明する。履歴記録プログラムPrの生成処理は、カレントルール要素が、Beforeルール要素、Afterルール要素、Callルール要素、又は型指定Callルール要素のいずれのタイプであるかに応じて異なる。したがって、履歴記録プログラム生成部131は、カレントルール要素が、いずれのタイプであるかを判定し、処理を分岐させる。以下、分岐後の各処理手順について説明する。まず、Beforeルール要素Beforea,b,cに関する履歴記録プログラムPrの生成処理について説明する。当該生成処理では、要するに次のような処理を実行する履歴記録プログラムPrが生成される。以下の説明において、aメソッド、bメソッド、cメソッドとは、Beforea,b,cにおける、aメソッド、bメソッド、又はcメソッドをいう。1cメソッドの実行をフックし検知し、Beforeルール要素の評価値当該要素の要件が満たされているか否かを示す真偽値をtrueとする。また、aメソッドが実行されたか否かを示す真偽値をfalse実行されていないとする。2aメソッドの実行をフックし検知し、aメソッドが実行されたか否かを示す真偽値をtrue実行されたとする。3bメソッドの実行をフックし検知し、aメソッドが実行されたか否かを示す真偽値を、当該Beforeルール要素の評価値とする。したがって、bメソッドが実行されたにも拘わらず、bメソッドの実行前にaメソッドが実行されていない場合は、当該Beforeルール要素の評価値としてfalseを記録する履歴記録プログラムPrが生成される。以下、斯かる履歴記録プログラムPrの生成処理の詳細について説明する。図13は、Beforeルール要素に関する履歴記録プログラム生成処理の処理手順の一例を説明するためのフローチャートである。すなわち、同図は、カレントルール要素がBeforeルール要素である場合の履歴記録プログラムPrの生成処理の処理手順の一例である。ステップS301において、カレントルール要素のcメソッドの呼び出しをフックするためのポイントカット定義をアスペクトコードac1に追加生成する。具体的には、履歴記録プログラム生成部131は、雛形データ記憶部14よりポイントカット定義雛形を取得し、ポイントカット定義雛形にカレントルール要素のcメソッドを当てはめた結果をアスペクトコードac1に追加する。なお、ポイントカット定義とは、アスペクト指向プログラミング言語において、1以上のジョインポイントの集合の定義をいう。ジョインポイントとは、アスペクトをウィーブするコード上のポイントをいう。すなわち、ジョインポイントとは、対象のプログラムにおいて、フックされる位置をいう。図14は、ポイントカット定義雛形の一例を示す図である。同図のポイントカット定義雛形t2において、ポイントカット名と、ジョインポイントとされるメソッドのメソッド名とは、それぞれ、<ポイントカット名>又は<メソッド名>としてパラメタ化されている。なお、ポイントカット定義雛形t2のポイントカットタイプは、callである。したがって、ポイントカット定義雛形t2は、<メソッド名>に係るメソッドの呼び出しをジョインポイントとするポイントカット定義の雛形である。ステップS301において、履歴記録プログラム生成部131は、ポイントカット定義雛形t2の<ポイントカット名>を適当な値に置換し、<メソッド名>をカレントルール要素のcメソッドのメソッド名に置換して、当該cメソッドに対するポイントカット定義を生成する。図15は、履歴記録プログラムにおけるポイントカット定義の第一の具体例を示す図である。同図のポイントカット定義pc11は、図14のポイントカット定義雛形t2に対して、図8の1行目のルール要素以下、ルール要素R1という。のcメソッドが当てはめられた場合に生成されるポイントカット定義である。すなわち、現段階において、ルール要素R1がカレント要素であるとする。ポイントカット定義pc11において、ポイントカット定義雛形t2の<ポイントカット名>は、callR1-cに置換されている。また、ポイントカット定義雛形t2の<メソッド名>は、ルール要素R1におけるcメソッドのメソッド名httpServletdoPostに置換されている。なお、ポイントカット名は、各ポイントカット定義間で一意性が保証され、かつ、プログラミング言語の仕様の範囲内において、任意の文字列が指定されてよい。本実施の形態では、Beforeルール要素のcメソッドに対するポイントカット名は、call<カレントルール要素の変数名>-cという命名規則に従って生成される。<カレントルール要素の変数名>は、カレントルール要素に対する変数名によって置換される。ルール要素R1の変数名は、R1であるため、R1に置換される。続いて、履歴記録プログラム生成部131は、ポイントカット定義pc11に対するbeforeアドバイス定義ad11図34参照を、アスペクトコードac1に追加生成するS302。具体的には、履歴記録プログラム生成部131は、雛形データ記憶部14よりbeforeアドバイス定義雛形を取得し、beforeアドバイス定義雛形に基づいてbeforeアドバイス定義を生成する。アドバイスとは、アスペクト指向プログラミング言語において、ジョイントポイントに対して実行される処理をいう。アドバイスのうち、beforeアドバイスは、事前処理を意味する。すなわち、beforeアドバイスは、ジョイントポイントの実行前に織り込まれる組み込まれる処理である。図16は、beforeアドバイス定義雛形の一例を示す図である。同図のbeforeアドバイス定義t5において、ポイントカット名は、<ポイントカット名>としてパラメタ化されている。また、beforeアドバイス定義雛形t5は、3つの処理ステップを含む。3つの処理ステップを含む。ステップs51は、現在のスレッドの識別子を取得する。ステップs52は、変数varTable図11参照より、現在のスレッドに対応する履歴テーブルを取得し、変数currentTableに代入する。ステップs53は、現在のスレッドに対応する履歴テーブルがまだ生成されていない場合は生成し、生成された履歴テーブルを変数currentTableに代入する。ステップS302において、履歴記録プログラム生成部131は、beforeアドバイス定義雛形t5の<ポイントカット名>を、ステップS301において生成したポイントカット名callR1-cに置換することによりbeforeアドバイス定義を生成する。続いて、履歴記録プログラム生成部131は、カレントルール要素の要件が満たされたことを暫定的に履歴テーブル変数currentTableへ記録するためのステップをbeforeアドバイス定義に対して追加するS303。具体的には、履歴記録プログラム生成部131は、履歴記録雛形を雛形データ記憶部14より取得し、履歴記録雛形に基づいて、履歴テーブルへの記録処理に関するステップを追加する。図17は、履歴記録雛形の一例を示す図である。同図の履歴記録雛形t4において、履歴テーブル変数currentTableに記録設定されるキー名と値とは、それぞれ<キー名>、<値>としてパラメタ化されている。ステップS303において、履歴記録プログラム生成部131は、<キー名>を、カレントルール要素ルール要素R1のcメソッドに対する変数名R1によって置換し、<値>をtrueによって置換した結果をbeforeアドバイス定義に追加する。なお、ステップs41及びs42の詳細については後述する。続いて、履歴記録プログラム生成部131は、aメソッドは実行されていないことを履歴テーブル変数currentTableへ記録するためのステップをbeforeアドバイス定義に対して追加するS304。具体的には、履歴記録プログラム生成部131は、履歴記録雛形t4の<キー名>を、カレントルール要素ルール要素R1のaメソッドに対する変数名によって置換し、<値>をfalseによって置換した結果をbeforeアドバイス定義に追加する。当該aメソッドに対する変数名は、本実施の形態において、<カレントルール要素の変数名>-predという命名規則に従って生成される。したがって、ルール要素R1のaメソッドに関して、<キー名>は、R1-predという値によって置換される。ステップS304の実行により、ステップS301において生成されたポイントカット定義に対する具体的なbeforeアドバイス定義は完成する。図18は、具体的なbeforeアドバイス定義の第一の例を示す図である。同図のbeforeアドバイス定義ad11に含まれる各ステップについて、図16又は図17と同じステップには、同一ステップ番号を付している。ステップs51~s53については、図16において説明した通りである。ステップs41-1は、カレントルール要素の変数名R1のキー名に対して、trueを履歴テーブルに記録する。すなわち、cメソッドの実行前に、ルール要素R1の要件が満たされたことが、暫定的に当該履歴テーブルに記録される。同図のbeforeアドバイス定義ad11は、ポイントカット定義pc11の作用により、当該cメソッドの実行前に実行されるからである。ステップs42-1は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数varTableに格納する。その結果、現在のスレッドにおいて、ルール要素R1の要件が満たされたことが暫定的に変数varTableに記録されたことになる。ステップs41-2は、履歴テーブルcurrentTableに、カレントルール要素のaメソッドに対する変数名R1-predに対してfalseを記録する。すなわち、当該aメソッドは実行されていないことが当該履歴テーブルに記録される。ステップs42-2は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数varTableに格納する。その結果、現在のスレッドにおいて、当該aメソッドは実行されていないことが変数varTableに記録されたことになる。続いて、履歴記録プログラム生成部131は、カレントルール要素のaメソッドの呼び出しをフックするためのポイントカット定義をアスペクトコードac1に追加生成するS305。具体的には、履歴記録プログラム生成部131は、ポイントカット定義雛形t2図14の<ポイントカット名>を適当な値に置換し、<メソッド名>をカレントルール要素のaメソッドのメソッド名に置換して、当該aメソッドに対するポイントカット定義を生成する。図19は、履歴記録プログラムにおけるポイントカット定義の第二の具体例を示す図である。同図のポイントカット定義pc12は、図14のポイントカット定義雛形t2に対して、ルール要素R1図8のaメソッドが当てはめられた場合に生成されるポイントカット定義である。ポイントカット定義pc12において、ポイントカット定義雛形t2の<ポイントカット名>は、callR1-predに置換されている。また、ポイントカット定義雛形t2の<メソッド名>は、ルール要素R1におけるaメソッドのメソッド名X509TrustManagercheckServerTrustedに置換されている。なお、Beforeルール要素のaメソッドに対するポイントカット名は、call<カレントルール要素の変数名>-predという命名規則に従って生成される。続いて、履歴記録プログラム生成部131は、ステップS305において生成したポイントカット定義に対するafterアドバイス定義をアスペクトコードac1に追加生成するS306。具体的には、履歴記録プログラム生成部131は、雛形データ記憶部14よりafterアドバイス定義雛形を取得し、afterアドバイス定義雛形に基づいてafterアドバイス定義を生成する。afterアドバイスは、事後処理を意味する。すなわち、afterアドバイスは、ジョイントポイントの実行後に織り込まれる組み込まれる処理である。図20は、afterアドバイス定義雛形の一例を示す図である。同図のafterアドバイス定義雛形t3において、ポイントカット名は、<ポイントカット名>としてパラメタ化されている。また、afterアドバイス定義雛形t3は、3つの処理ステップを含む。ステップs31は、現在のスレッドの識別子を取得する。ステップs32は、変数varTable図11参照より、現在のスレッドに対応する履歴テーブルを取得し、変数currentTableに代入する。ステップs33は、現在のスレッドに対応する履歴テーブルがまだ生成されていない場合は生成し、生成された履歴テーブルを変数currentTableに代入する。ステップS306において、履歴記録プログラム生成部131は、afterアドバイス定義雛形t3の<ポイントカット名>を、ステップS305において生成したポイントカット名callR1-predに置換することによりafterアドバイス定義を生成する。続いて、履歴記録プログラム生成部131は、aメソッドが呼び出されたことを履歴テーブル変数currentTableへ記録するためのステップを、ステップS306において生成されたafterアドバイス定義に対して追加するS307。具体的には、履歴記録プログラム生成部131は、履歴記録雛形t4図17を雛形データ記憶部14より取得し、履歴記録雛形t4に基づいて、履歴テーブルへの記録処理に関するステップを追加する。すなわち、履歴記録プログラム生成部131は、履歴記録雛形t4の<キー名>を、カレントルール要素ルール要素R1のaメソッドに対する変数名R1-predによって置換し、<値>をtrueによって置換した結果をafterアドバイス定義に追加する。ステップS307の実行により、ステップS305において生成されたポイントカット定義に対する具体的なafterアドバイス定義は完成する。図21は、具体的なafterアドバイス定義の第一の例を示す図である。同図のafterアドバイス定義ad12に含まれる各ステップについて、図17又は図20と同じステップには、同一ステップ番号を付している。ステップs31~s33については、図20において説明した通りである。ステップs41は、変数varTableより取得されたs32、又は新に生成されたs33履歴テーブルcurrentTableに、カレントルール要素のaメソッド対する変数名R1-predに対してtrueを記録する。すなわち、aメソッドが呼び出されたことが、当該履歴テーブルに記録される。ステップs42は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数varTableに格納する。その結果、現在のスレッドにおいて、aメソッドが呼び出されたことが変数varTableに記録されたことになる。続いて、履歴記録プログラム生成部131は、カレントルール要素のbメソッドの呼び出しをフックするためのポイントカット定義をアスペクトコードac1に追加生成するS308。具体的には、履歴記録プログラム生成部131は、雛形データ記憶部14よりポイントカット定義雛形t2図14を取得し、ポイントカット定義雛形t2にカレントルール要素のbメソッドを当てはめた結果をアスペクトコードac1に追加する。その結果、図22に示されるポイントカット定義がアスペクトコードac1に追加される。図22は、履歴記録プログラムにおけるポイントカット定義の第三の具体例を示す図である。同図のポイントカット定義pc13は、図14のポイントカット定義雛形t2に対して、ルール要素R1のbメソッドが当てはめられた場合に生成されるポイントカット定義である。ポイントカット定義pc13において、ポイントカット定義雛形t2の<ポイントカット名>は、callR1-succに置換されている。また、ポイントカット定義雛形t2の<メソッド名>は、ルール要素R1におけるbメソッドのメソッド名SSLSocketstartHandshakeに置換されている。なお、本実施の形態では、Beforeルール要素のbメソッドに対するポイントカット名は、call<カレントルール要素の変数名>-succという命名規則に従って生成される。続いて、履歴記録プログラム生成部131は、ステップS308において生成したポイントカット定義に対するafterアドバイス定義をアスペクトコードac1に追加生成するS309。具体的には、履歴記録プログラム生成部131は、afterアドバイス定義雛形t3の<ポイントカット名>を、ステップS308において生成したポイントカット名callR1-succに置換することによりafterアドバイス定義を生成する。続いて、プログラム生成部13は、bメソッドより前に呼ばれているべきaメソッドに関する呼び出し履歴実行履歴を参照するためのステップを、ステップS309において生成されたafterアドバイス定義に追加するS310。当該ステップは、雛形データ記憶部14より取得される履歴参照雛形に基づいて生成される。図23は、履歴参照雛形の一例を示す図である。同図の履歴参照雛形t6において、履歴テーブル変数currentTableより値を取得するキー名と、取得された値を格納する変数参照用変数の変数名とは、それぞれ<キー名>、<参照用変数名>としてパラメタ化されている。ステップS310において、履歴記録プログラム生成部131は、<参照用変数名>を適当な値によって置換し、<キー名>をaメソッドに対する変数名ここでは、R1-predによって置換した結果をafterアドバイス定義に追加する。本実施の形態において、aメソッドの変数名に対応する値を参照するための変数名は、r1とされる。したがって、<参照用変数名>は、r1に置換される。なお、ステップs61及びs62の詳細については後述する。続いて、プログラム生成部13は、履歴記録雛形t4図17を用いて、カレントルール要素の評価値を変数varTableに記録するためのステップを、ステップS309において生成されたafterアドバイス定義に追加するS311。具体的には、履歴記録雛形t4の<キー名>がカレントルール要素の変数名R1によって置換され、<値>が、履歴記録雛形t4図23の<参照用変数名>の置換先と同じ変数名r1に置換された結果が、当該afterアドバイスに追加される。ステップS311の実行により、ステップS308において生成されたポイントカット定義に対する具体的なafterアドバイス定義は完成する。図24は、具体的なafterアドバイス定義の第二の例を示す図である。同図のafterアドバイス定義ad13に含まれる各ステップについて、図16、図23、又は図17と同じステップには、同一ステップ番号を付している。ステップs31~s33については、図20において説明した通りである。ステップs61は、現在のスレッドに対応する履歴テーブル変数currentTableにおいて、キー名R1-predに対して記録されている値を取得し、変数r1に代入する。すなわち、カレントルール要素のaメソッドが実行されたか否かを示す真偽値が変数r1に代入される。ステップs62は、変数r1の値がnull空である場合すなわち、beforeアドバイス定義ad11及びafterアドバイス定義ad12が実行されていない場合、変数r1にfalseを代入する。したがって、aメソッドが実行された後にアドバイス定義ad13が実行されている場合は、変数r1はtrueが代入された状態となる。それ以外の場合は、変数r1はfalseが代入された状態となる。なお、afterアドバイス定義ad13は、bメソッドの実行後に実行される処理である。したがって、aメソッドが実行された後にアドバイス定義ad13が実行されている場合とは、aメソッドの実行後にbメソッドが実行されている場合に相当する。これは、Before要素であるカレントルール要素の要件が満たされていることを意味する。ステップs41は、カレントルール要素の変数名R1のキー名に対して、変数r1の値を履歴テーブルに記録する。すなわち、変数r1の値が、カレントルール要素の評価値として履歴テーブルに記録される。上記したように、変数r1の値は、カレントルール要素の要件が満たされているか否かを示すからである。ステップs42は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数varTableに格納する。その結果、現在のスレッドにおいて、カレントルール要素の要件が満たされているか否かがが変数varTableに記録されたことになる。以上で、カレントルール要素がBeforeルール要素である場合の処理手順は終了する。図8に示されるように、本実施の形態の場合、図8のルール要素一覧rL1において2番目のルール要素ルール要素R2もBeforeルール要素である。したがって、続けて、ルール要素R2に関しても図13に示される処理手順が実行される。その結果、ルール要素R2において、メソッドa、b、又はcに対応する各メソッドに関して、上述したようなソースコードが生成される。続いて、図8のルール要素一覧rL1に基づいて、図9のステップS207の検出プログラムPc生成処理について説明する。なお、カレント要素がAfterルール要素、Callルール要素、又は型指定Callルール要素である場合の履歴記録プログラムPrの生成処理の処理手順の説明は、便宜上、後回しにする。図25は、検出プログラム生成処理の処理手順の一例を説明するためのフローチャートである。ステップS401において、検出プログラム生成部132は、ルール要素一覧rL1において、各ルール要素の最後の引数として指定されているメソッド以下、呼出元メソッドという。をフックするためのポイントカット定義を、アスペクトコードac1に追加する。Beforeルール要素についてはcメソッド、Afterルール要素についてはfメソッド、Callルール要素についてはhメソッド、型指定Callルール要素についてはjメソッドが、呼出元メソッドに相当する。なお、本実施の形態において、一つのルールルール記述内の各ルール要素の呼出元メソッドは共通である必要がある。ルール違反の有無の検出は、当該呼出元メソッドの実行後の一箇所において行われる必要があるからである。ステップS401におけるポイントカット定義の生成には、ポイントカット定義雛形t2図14が用いられる。図26は、検出プログラムにおけるポイントカット定義の具体例を示す図である。同図のポイントカット定義pc17において、図14のポイントカット定義雛形t2の<ポイントカット名>は、callLibに置換されている。また、<メソッド名>は、ルール記述rd1の対象メソッドすなわち、ルール記述rd1の各ルール要素の呼出元メソッドのメソッド名httpServletdoPostによって置換されている。なお、対象メソッドに対するポイントカット定義におけるポイントカット名は、本実施の形態では固定的にcallLibに置換される。但し、当該ポイントカット名は、プログラミング言語の仕様の範囲内において任意に決定されてよい。続いて、検出プログラム生成部132は、afterアドバイス定義雛形t3を用いて、ステップS401において生成したポイントカット定義に対するafterアドバイス定義をアスペクトコードac1に追加生成するS402。具体的には、afterアドバイス定義雛形t3の<ポイントカット名>が、ステップS401において置換先とされたポイントカット名callLibに置換された結果が、アスペクトコードac1に追加される。続いて、検出プログラム生成部132は、ルール記述rd1の式構造R1||R2内に含まれる変数名ごとに、当該変数名に対する値を参照するためのステップを、アスペクトコードac1に追加するS403。具体的には、検出プログラム生成部132は、雛形データ記憶部14より履歴参照雛形t6図23を取得し、履歴参照雛形t6に当該変数名を当てはめた結果を当該変数名ごとにアスペクトコードac1に追加する。式構造R1||R2には、変数名R1及び変数名R2が含まれている。したがって、履歴参照雛形t6の<参照変数名>がr1に置換され、<キー名>がR1に置換された結果が追加される。更に、履歴参照雛形t6の<参照変数名>がr2に置換され、<キー名>がR2に置換された結果が追加される。続いて、検出プログラム生成部132は、ルール違反の有無の検出結果検出ログを記録するためのステップをアスペクトコードac1に追加するS404。当該ステップは、雛形データ記憶部14より取得される検出ログ記録雛形を用いて生成される。図27は、検出ログ記録雛形の一例を示す図である。同図の検出ログ記録雛形t7において、<式>は、式構造の各変数名が、当該変数名に対する値が代入された参照用変数の変数名によって置換された式によって置換される。ステップs71~s74の詳細については後述する。ステップS404の実行により、ステップS402において生成されたafterアドバイス定義は、図28に示されるように完成する。図28は、検出プログラムにおけるafterアドバイス定義の具体例を示す図である。同図のafterアドバイス定義ad17に含まれる各ステップについて、図20、図23、又は図27と同じステップには、同一ステップ番号を付している。ステップs31~s33については、図20において説明した通りであり、ステップS402において生成される。ステップs61-1~s62-2は、ステップS403において生成される。ステップs61-1は、現在のスレッドに対応する履歴テーブル変数currentTableにおいて、キー名R1に対して記録されている値を取得し、参照用変数r1に代入する。すなわち、ルール要素R1の評価値を示す真偽値が変数r1に代入される。ステップs62-1は、参照用変数r1の値がnull空である場合、参照用変数r1にfalseを代入する。したがって、ルール要素R1の要件が満たされている場合、参照用変数r1にはtrueが代入され、ルール要素R1の要件が満たされていない場合、参照用変数r1にはfalseが代入された状態となる。ステップs61-2は、現在のスレッドに対応する履歴テーブル変数currentTableにおいて、キー名R2に対して記録されている値を取得し、参照用変数r2に代入する。すなわち、ルール要素R2の評価値を示す真偽値が参照用変数r2に代入される。ステップs62-2は、参照用変数r2の値がnull空である場合、参照用変数r2にfalseを代入する。したがって、ルール要素R2の要件が満たされている場合、参照用変数r2にはtrueが代入され、ルール要素R2の要件が満たされていない場合、参照用変数r2にはfalseが代入された状態となる。ステップs71~s74は、1行分1レコード分の検出ログを検出ログ記憶部16に記録するための処理であり、ステップS404において生成される。本実施の形態において、一行分の検出ログは、図29に示されるような構成を有する。図29は、一行分の検出ログの構成例を示す図である。同図に示されるように、本実施の形態において、検出ログは、ルール名、検出箇所、及び検出結果等の項目を有する。ルール名は、ルール違反の有無の検出に使用されたルールのルール名である。検出箇所は、違反の有無が検出された箇所である。本実施の形態では、呼出元メソッドのメソッド名によって検出箇所が示される。ルール違反の有無は、呼出元メソッドごとに検出されるからである。検出結果は、ルール違反の有無の検出結果であり、positive又はnegativeが記録される。positiveは、ルール違反に対して陽性であること、すなあち、ルール違反の可能性が検出されたことを示す。negativeは、ルール違反に対して陰性であること、すなわち、ルール違反の可能性は検出されなかったことを示す。図28に戻る。ステップs71は、記録対象の1行分の検出ログのルール名を記録する。すなわち、ステップs71にけるlog_ruleは、検出ログの構成要素であるルール名を記録する関数である。また、log_ruleの引数に指定されているrule_nameは、図5又は図9の開始時に指定されたルール名が記憶されている変数である。ステップs72は、記録対象の1行分の検出ログの検出箇所として、ルール記述rd1の各ルール要素に共通の呼出元メソッドのメソッド名を記録する。すなわち、ステップs72にけるlog_pointは、検出ログの構成要素である検出箇所を記録する関数である。また、log_pointの引数に指定されているthisJoinPointは、当該呼出元メソッドのメソッド名が記憶されている変数である。ステップs73は、r1||r2の真偽値を判定し、r1||r2の値が真trueである場合、すなわち、ルールが満たされない場合に、記録対象の1行分の検出ログの構成要素である検出結果に、positiveを記録する。ステップs74は、r1||r2の値が偽falseである場合、すなわち、ルールが満たされた場合に、記録対象の1行分の検出ログの構成要素である検出結果に、negativeを記録する。すなわち、ステップs73及びs74におけるlog_resultは、引数に指定された値を、検出ログの構成要素である検出結果に記録する関数である。以上で、ルール記述rd1に対する履歴記録プログラムPr及び検出プログラムPcのソースコードアスペクトコードac1の生成は完了する。その結果、アスペクトコードac1は、図30及び図31に示されるようになる。図30及び図31は、本実施の形態の第一のルール記述に関して生成される履歴記録プログラム及び検出プログラムのアスペクトコードの具体例を示す図である。図30及び図31は、一つのアスペクトコードac1を、便宜上、二つの図面に分割して示したものである。図30において、図15、図18、図19、図21、図22、又は図24と同一のポイントカット定義又はアドバイス定義には、同一符号を付している。すなわち、図30には、ルール記述rd1より抽出されたルール要素R1に関するポイントカット定義又はアドバイス定義が示されている。図31において、図26又は図28と同一のポイントカット定義又はアドバイス定義には、同一符号を付している。また、図31において、ポイントカット定義pc14及びafterアドバイス定義ad14は、ルール要素R2に関して図13のステップS301~S304が実行されることにより生成されるポイントカット定義又はアドバイス定義である。ポイントカット定義pc15及びafterアドバイス定義ad15は、ルール要素R2に関して図13のステップS305~S307が実行されることにより生成されるポイントカット定義又はアドバイス定義である。ポイントカット定義pc16及びafterアドバイス定義ad16は、ルール要素R2に関して図13のステップS308~S311が実行されることにより生成されるポイントカット定義又はアドバイス定義である。続いて、図5のステップS205の履歴記録プログラムPrの生成処理に関して、便宜上、説明を後回しにした、カレントルール要素がAfterルール要素である場合について説明する。ここでは、図5のステップS101において、ルール解析部12によって、図32に示されるルール記述が読み込まれたこととする。図32は、第二のルール記述の一例を示す図である。同図に示されるルール記述rd2に記述された式では、二つのAfterルール要素が||オペレータによって接続されている。第一項のAfterルール要素は、AfterjavaioFilecreateTempFilehttpServletdoPostであり、第二項のAfterルール要素は、AfterjavaioFilecreateTempFilehttpServletdoPostである。したがって、ルール記述rd2に係る式は、httpServletdoPost内でjavaioFilecreateTempFileが呼び出された場合は、javaioFilecreateTempFileの呼び出し後にjavaioFiledeleteが呼び出されなければならない。又は、httpServletdoPost内で、javaioFilecreateTempFileが呼び出された場合は、javaioFilecreateTempFileの呼び出し後に、javaioFiledeleteOnExitが呼び出されなければならない。というルールを示す。アプリケーション内においてファイルが一時的に生成された場合、当該ファイルはアプリケーションの終了時に削除されないと、情報漏洩の虞がある。ファイルが適切に削除されるためには、JavaioFilecreateTempFileの実行後には、delete又はdeleteOnExitが実行される必要があるというルールが規定されればよい。当該ルールをルール要素及びオペレータを用いて表現したものが、ルール記述rd2である。ルール記述rd2について、図5のステップS102~S106が実行された結果、図33に示されるルール要素一覧が補助記憶装置102に記録出力される。図33は、第二のルール要素一覧の例を示す図である。同図では、第一項のAfterルール要素に対して、変数名R3が割り当てられ生成され、第二項のAfterルール要素に対して、変数名R4が割り当てられた生成された例が示されている。以下、第一項のAfterルール要素をルール要素R3といい、第二項のAfterルール要素をルール要素R4という。続いてステップS107では、以下の式構造2が生成される。R3||R42続いて、ルール記述rd2に関してプログラム生成部13によって図9において説明した処理が実行される。ステップS202では、ルール記述rd2に関するアスペクトコードの一部が生成される。図34及び図35は、本実施の形態の第二のルール記述に関して生成される履歴記録プログラム及び検出プログラムのアスペクトコードの具体例を示す図である。同図には、ルール記述rd2に関して生成されるアスペクトコードac2の完成形が示されているが、ステップS202において生成される部分は、アスペクトの定義とステップs11である。すなわち、図12に示されるアスペクトコードac1と同様の内容である。なお、ステップs11は、図12のアスペクトコードac1におけるステップs11と同じである。すなわち、履歴を記録するためのデータ構造図11参照は、ルール要素のタイプに拘わらず同じである。続いて、図9のステップS205について説明する。ルール要素一覧rL2図33に含まれているルール要素は、いずれもAfterルール要素である。したがって、履歴記録プログラム生成部131は、履歴記録プログラムPrの生成処理として、Afterルール要素に関する履歴記録プログラムPrを生成するための処理を実行する。当該生成処理では、要するに次のような処理を実行する履歴記録プログラムPrが生成される。以下の説明において、dメソッド、eメソッド、fメソッドとは、Afterd,e,fにおける、dメソッド、eメソッド、又はfメソッドをいう。1fメソッドの実行をフックし、当該Afterルール要素の評価値をtrueとする。2eメソッドの実行をフックし、当該評価値をfalseとする。3dメソッドの実行をフックし、当該評価値をtrueとする。以上により、eメソッドが実行された場合、その後にdメソッドが実行されなければ、当該Afterルール要素の評価値をfalseとする履歴記録プログラムPrが生成される。以下、斯かる履歴記録プログラムPrの生成処理の詳細について説明する。図36は、Afterルール要素に関する履歴記録プログラム生成処理の処理手順の一例を説明するためのフローチャートである。以下の説明において、ルール記述rd2に関して、図9のステップS202において生成されているアスペクトコードを、アスペクトコードac2という。図36の開始時点におけるアスペクトコードac2の状態は、図12に示されるアスペクトコードac1と同じである。ステップS501において、履歴記録プログラム生成部131は、ポイントカット定義雛形t2図14を用いて、カレントルール要素ルール要素R3のfメソッドの呼び出しをフックするためのポイントカット定義pc21をアスペクトコードac2に追加生成する。具体的には、履歴記録プログラム生成部131は、ポイントカット定義雛形t2の<ポイントカット名>をcallR3-fに置換し、<メソッド名>をカレントルール要素のfメソッドのメソッド名httpServletdoPostに置換して、当該fメソッドに対するポイントカット定義pc21図34参照を生成する。なお、本実施の形態では、Afterルール要素のfメソッドに対するポイントカット名は、call<カレントルール要素の変数名>-fという命名規則に従って生成される。続いて、履歴記録プログラム生成部131は、ポイントカット定義pc21に対するbeforeアドバイス定義ad21図34参照を、beforeアドバイス定義雛形t5図16を用いて生成し、アスペクトコードac2に追加するS502。ステップS502では、beforeアドバイス定義ad21のうち、ステップs51~s53が生成される。当該ステップ番号は、図16に対応する。続いて、履歴記録プログラム生成部131は、カレントルール要素の要件が満たされたことを、暫定的に履歴テーブル変数currentTableへ記録するためのステップをbeforeアドバイス定義ad21に対して追加するS503。当該ステップの追加には、履歴記録雛形t4図17が使用される。追加されたステップは、アドバイス定義ad21内図34におけるs41及び42に相当する。アドバイス定義ad21内のステップs41は、変数varTableより取得されたs52、又は新に生成されたs53履歴テーブルcurrentTableに、カレントルール要素ルール要素R3の変数名R3に対してtrueを記録する。すなわち、fメソッドの実行前に、ルール要素R3の要件が満たされたことが、暫定的に当該履歴テーブルに記録される。ステップs42は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数varTableに格納する。その結果、現在のスレッドにおいて、ルール要素R3の要件が満たされたことが暫定的に変数varTableに記録されたことになる。続いて、履歴記録プログラム生成部131は、ポイントカット定義雛形t2図14を用いて、カレントルール要素ルール要素R3のeメソッドの呼び出しをフックするためのポイントカット定義pc22をアスペクトコードac2に追加生成するS504。具体的には、履歴記録プログラム生成部131は、ポイントカット定義雛形t2の<ポイントカット名>をR3-predに置換し、<メソッド名>をカレントルール要素のeメソッドのメソッド名javaioFilecreateTempFileに置換して、当該eメソッドに対するポイントカット定義pc22図34参照を生成する。なお、本実施の形態で、Afterルール要素のeメソッドに対するポイントカット名は、call<カレントルール要素の変数名>-predという命名規則に従って生成される。続いて、履歴記録プログラム生成部131は、ポイントカット定義pc22に対するafterアドバイス定義ad22図34参照を、afterアドバイス定義雛形t3図20を用いて生成し、アスペクトコードac2に追加するS505。ステップS505では、afterアドバイス定義ad22のうち、ステップs31~s33が生成される。当該ステップ番号は、図20に対応する。続いて、履歴記録プログラム生成部131は、カレントルール要素は満たされていないことを、暫定的に履歴テーブル変数currentTableへ記録するためのステップをafterアドバイス定義ad22に対して追加するS506。当該ステップの追加には、履歴記録雛形t4図17が使用される。追加されたステップは、アドバイス定義ad22内図34におけるs41及びs42に相当する。アドバイス定義ad22内のステップs41は、変数varTableより取得されたs32、又は新に生成されたs33履歴テーブルcurrentTableに、ルール要素R3の変数名R3に対してfalseを記録する。すなわち、eメソッドの実行後に、ルール要素R3の要件が満たされていないことが、暫定的に当該履歴テーブルに記録される。ステップs42は、現在のスレッドの識別子に対応付けて当該履歴テーブルを変数varTableに格納する。その結果、現在のスレッドにおいて、ルール要素R3の要件が満たされていないことが暫定的に変数varTableに記録されたことになる。続くステップS507及びS508において、履歴記録プログラム生成部131は、dメソッドに関して、ステップS504及びS505において説明した処理を実行する。その結果、ポイントカット定義pc23及びafterアドバイス定義ad23のs31~s33までが生成される。なお、本実施の形態では、Afterルール要素のdメソッドに対するポイントカット名は、call<カレントルール要素の変数名>-succという命名規則に従って生成される。続いて、履歴記録プログラム生成部131は、カレントルール要素は満たされていることを履歴テーブル変数currentTableへ記録するためのステップをafterアドバイス定義ad23に対して追加するS509。当該ステップの追加には、履歴記録雛形t4図17が使用される。追加されたステップは、アドバイス定義ad23内図34におけるs41及びs42に相当する。以上で、カレントルール要素がAfterルール要素である場合の処理手順は終了する。図33に示されるように、本実施の形態の場合、図8のルール要素一覧rL2において2番目のルール要素ルール要素R4もAfterルール要素である。したがって、続けて、ルール要素R4に関しても図36に示される処理手順が実行される。その結果、ルール要素R4において、メソッドd、e、又はfに対応する各メソッドに関して、上述したようなソースコードが生成される。なお、当該処理手順の内容の説明は、上記より自明であるため省略する。続いて、図5のステップS205の履歴記録プログラムPrの生成処理に関して、カレントルール要素がCallルール要素である場合について説明する。図37は、Callルール要素に関する履歴記録プログラム生成処理の処理手順の一例を説明するためのフローチャートである。以下の説明において、gメソッド、hメソッドとは、Callg,hにおけるgメソッド又はhメソッドをいう。ステップS601において、履歴記録プログラム生成部131は、ポイントカット定義雛形t2図14を用いて、カレントルール要素のhメソッドの呼び出しをフックするためのポイントカット定義を作成中のアスペクトコードに追加生成する。続いて、履歴記録プログラム生成部131は、ポイントカット定義に対するbeforeアドバイス定義を、beforeアドバイス定義雛形t5図16を用いて生成し、アスペクトコードに追加するS602。続いて、履歴記録プログラム生成部131は、カレントルール要素の要件が満たされていないこと示す評価値を、暫定的に履歴テーブル変数currentTableへ記録するためのステップをbeforeアドバイス定義に対して追加するS603。続いて、履歴記録プログラム生成部131は、ポイントカット定義雛形t2図14を用いて、カレントルール要素ルール要素R3のgメソッドの呼び出しをフックするためのポイントカット定義をアスペクトコードに追加生成するS604。続いて、履歴記録プログラム生成部131は、ポイントカット定義に対するafterアドバイス定義を、afterアドバイス定義雛形t3図20を用いて生成し、アスペクトコードに追加するS605。続いて、履歴記録プログラム生成部131は、カレントルール要素は満たされたことを示す評価値を履歴テーブル変数currentTableへ記録するためのステップをafterアドバイス定義に対して追加するS606。当該ステップの追加には、履歴記録雛形t4図17が使用される。このように、Callルール要素については、hメソッドの実行の検知に応じて評価値がfalseとされ、gメソッドの実行の検知に応じて評価値がtrueとされる。したがって、当該評価値は、gメソッドが呼ばれたときに限ってtrueとなる。なお、型指定Callルール要素に関する履歴記録プログラムPrの生成処理は、例えば、図37のhメソッドがjメソッドに置換され、gメソッドがiメソッドに置換された処理が実行されたものであればよい。続いて、履歴記録プログラムPr及び検出プログラムPc、具体的には、アスペクトコードac1図30及び図31又はアスペクトコードac2図35及び図36等の実行時の処理手順について説明する。図38は、履歴記録プログラム及び検出プログラムの実行時の処理手順の一例を説明するためのフローチャートである。同図の処理手順の実行前に、アスペクトコードac1又はac2等は、コンパイルされる。コンパイル後のプログラムは、履歴記録プログラムPr及び検出プログラムPcとして機能するプログラムである。ステップS701において、履歴記録プログラムPr及び検出プログラムPcすなわち、アスペクトコードがアプリケーションに適用された状態で起動される。なお、同図では、便宜上、アプリケーションは、テストプログラム生成装置10において起動されることとする。但し、他のコンピュータにおいて図38の処理が実行されてもよい。また、アスペクトコードの適用に関しては公知技術であるため、その説明は省略する。起動されたアプリケーションの処理の進行に応じて、ライブラリのメソッドが実行される呼び出される。メソッドの実行に応じ、履歴記録プログラムPrは、メソッドの実行履歴の記録をCPU104に実行させるS702。具体的には、履歴記録プログラムPrにおけるポイントカット定義により、アプリケーションによるライブラリのメソッドの呼び出しがフックされる。当該呼び出しのフックに応じ、履歴記録プログラムPrにおけるアドバイス定義が実行され、当該呼び出しに関する履歴が変数varTableに記録される。続いて、アプリケーションによる呼出元メソッドの実行が終了すると、検出プログラムPcは、ステップS702において記録された履歴に基づくルール違反の有無の検出及び検出結果検出ログ図29の検出ログ記憶部16への記録をCPU104に実行させるS703。具体的には、当該呼出元メソッドの実行後に、検出プログラムPcにおけるアドバイス定義が実行され、ルール記述rd1又はrd2等の要件の充足の有無が検出される。検出結果は、検出ログ図29の形式で検出ログ記憶部16に記録される。続いて、ブラックボックステスト用のテストプログラムTpの生成処理について説明する。図39は、ブラックボックステスト用のテストプログラムの生成処理の処理手順の一例を説明するためのフローチャートである。同図の処理が実行される前に、履歴記録プログラムPr及びルール検証プログラムPcの実行検査対象のアプリケーションへの適用により、少なくとも一つ一行の検出ログが、検出ログ記憶部16に記憶されていることとする。ステップS801において、テストプログラム生成部15は、検出ログ記憶部16からの未処理の一つ一行分の検出ログの取得読み込みを試みる。未処理とは、ステップS803以降に関して処理対象とされていないことをいう。取得読み込みに成功した場合S802でYes、テストプログラム生成部15は、取得された検出ログ以下、対象ログという。のルール名及び検出結果に対応するテストポリシーを、テストポリシーリスト記憶部17より抽出検索するS803。図40は、テストポリシーリスト記憶部の構成例を示す図である。同図において、テストポリシーリスト記憶部17は、テストポリシーの一覧テストポリシーリストを記憶する。一つのテストポリシーは、ルール名、検出結果、及びテストシナリオ名等の情報を含む。ルール名は及び検出結果は、当該テストポリシーが対応するルール名及び検出結果である。すなわち、当該ルール名に係るルールに関して、当該検出結果が検出された場合に、当該テストポリシーが有効である適用されることを示す。したがって、テストポリシーにおけるルール名及び検出結果は、当該テストポリシーの適用条件であるといえる。テストシナリオ名は、テストポリシーが適用される場合に、テストプログラムTpの生成に使用すべきシナリオコードの識別名である。例えば、同図において、一つ目のテストポリシーでは、ルール名がSQL-injであるルールルール記述に関して、検出結果がpositiveであった場合に、checkSQLinj1という名前のシナリオコードを使用すべきことが示されている。また、二つ目のテストポリシーでは、ルール名がSQL-injであるルールルール記述に関して、検出結果がpositiveであった場合、checkSQLinj2という名前のシナリオコードを使用すべきことが示されている。ここで、一つ名のテストポリシーと二つ目のテストポリシーとのルール名及び検出結果は一致する。このように、同一の適用条件に対して複数のテストシナリオ名すなわち、シナリオコードが関連付けられてもよい。また、同一のテストシナリオ名すなわち、シナリオコードが複数の適用条件ルール名及び検出結果に関連付けられてもよい。ステップS803では、対象ログとルール名及び検出結果が一致するテストポリシーが抽出される。続いて、テストプログラム生成部15は、抽出されたテストポリシーにおいて指定されているテストシナリオ名に係るシナリオコードのコピー複製を、シナリオコード記憶部18より取得するS804。複数のテストポリシーが抽出されている場合は、複数のシナリオコードのコピーが取得される。なお、ここで、コピーが取得されるのは、後述されるようにシナリオコードは書き換えが行われるところ、シナリオコードのオリジナル版が書き換えの対象とされないようにするためである。したがって、以下のステップでは、シナリオコードのコピーが処理対象とされるが、単に、シナリオコードという。図41は、シナリオコードの第一の例を示す図である。また、図42は、シナリオコードの第二の例を示す図である。図41のシナリオコードsc1は、テストシナリオ名がcheckSQLinj1であるシナリオコードである。また、図42のシナリオコードsc2は、テストシナリオ名がcheckSQLinj2であるシナリオコードである。各シナリオコードは、それぞれ単独で、アスペクト指向プログラミング言語AspectJにおける一つのアスペクトを構成し、基本的に、ポイントカット定義とアドバイス定義とを含む。例えば、シナリオコードsc1は、ポイントカット定義pc31とaroundアドバイス定義ad31とを含む。また、シナリオコードsc2は、ポイントカット定義pc32とaroundアドバイス定義ad32とを含む。aroundアドバイスとは、本来実行されるはずの処理の代わりに、当該aroundアドバイスに定義された処理を実行させるアドバイスである。なお、アドバイスは、必ずしもaroundアドバイスでなくてもよい。各シナリオコードの、ポイントカット定義において、ジョインポイントとされるメソッド名は、空欄ブランク又はパラメタ化されており、同図では、<検出箇所>として表現されている。<検出箇所>は、検出ログの検出箇所に係るメソッド名によって置換されることを意味する。すなわち、シナリオコードは、検出ログにおける検出箇所をフックして、当該検出箇所に関してアドバイス定義において定義された処理を実行させるといった内容になっている。アドバイス定義には、ルール名及び検出結果に応じた、ブラックボックステスト用の処理テストシナリオが定義される。したがって、シナリオコードには、特定の箇所メソッドにおいて、特定のルールに関して違反又は準拠が検出された場合に有効であると考えられるテストシナリオが実装される。なお、本実施の形態では、各シナリオコードのアスペクト名が、当該シナリオコードのテストシナリオ名として用いられている。但し、各シナリオコードのファイル名等、他の識別情報が、テストシナリオ名として用いられてもよい。続いて、テストプログラム生成部15は、取得された各シナリオコードの空欄部分<検出箇所>の部分に、対象ログの検出箇所の値メソッド名を書き込むS805。又は、取得されたシナリオコードの空欄部分が、対象ログの検出箇所の値メソッド名によって置換される。続いて、テストプログラム生成部15は、メソッド名が書き込まれた各シナリオコードを、テストプログラムTpとして出力例えば、補助記憶装置102に保存するS806。複数のシナリオコードが取得されている場合、複数のテストプログラムTpが出力される。以降、テストプログラム生成部15は、検出ログ記憶部16における全ての検出ログに関してステップS803~S806を実行した後S802でNo、図39の処理を終了させる。以上のように生成されたテストプログラムTpは、コンパイルされ、ライブラリを使用するアプリケーションに適用されることにより、ブラックボックステストを実行する。続いて、図43に示される具体的なルール記述の例に基づいて、ブラックボックステスト用のテストプログラムTpの生成、及びブラックボックステストの実行に関して説明する。図43は、第三のルール記述の一例を示す図である。同図に示されるルール記述rd3に記述された式では、一つのCallルール要素と二つのAfterルール要素がオペレータによって接続されている。第一項のCallルール要素は、AdminLoginServletlogin内で、PreparedStatementsetの呼出が必須であることを示す図3参照。なお、setにおけるアスタリスクは、正規表現である。したがって、PreparedStatementsetは、PreparedStatementsetという正規表現に合致するいずれかのメソッドを示す。第二項のAfterルール要素は、AdminLoginServletlogin内で、PreparedStatementsetの実行がConnectionprepareStatementの実行後に必須であることを示す図3参照。第三項のAfterルール要素は、AdminLoginServletlogin内で、PreparedStatementsetexecuteQueryの実行がPreparedStatementsetの実行後に必須であることを示す図3参照。したがって、ルール記述rd3は、AdminLoginServletlogin内において、以下のa、b、cの順で、各メソッドが呼び出される必要があるというルールを規定する。aConnectionprepareStatementbPreparedStatementsetcPreparedStatementsetexecuteQuery当該ルールは、SQLインジェクション対策の文脈上のルールである。SQLインジェクションを防ぐためには、a、b、cの順で、各メソッドが呼び出される必要があるからである。便宜上、以下において、各メソッドを、メソッドa、メソッドb、又はメソッドcという。また、ルール記述rd3に係るルール名は、SQL-injであるとする。ルール記述rd3について、図5のステップS102~S106が実行された結果、図44に示されるルール要素一覧が補助記憶装置102に記録出力される。図33は、第三のルール要素一覧の例を示す図である。同図では、第一項のCallルール要素に対して、変数名R5が割り当てられ生成され、第二項のAfterルール要素に対して、変数名R6が割り当てられ生成され、第三項のAfterルール要素に対して、変数名R7が割り当てられた生成された例が示されている。以下、第一項のCallルール要素をルール要素R5といい、第二項のAfterルール要素をルール要素R6といい、第三項のAfterルール要素をルール要素R7という。続いてステップS107では、以下の式構造3が生成される。R5R6R73続いて、図43に示されるルール一覧及び式構造3等に関して、図9等を用いて説明した処理が実行され、ルール記述rd3に関する履歴記録プログラムPr及び検出プログラムPcが生成される。当該履歴記録プログラムPr及び当該検出プログラムPcの生成処理、及び当該生成処理によって生成されるアスペクトコードの内容は、ルール記述rd1及びルール記述rd2に関する説明より自明であるため、省略する。ルール記述rd3に関する履歴記録プログラムPr及び検出プログラムPcが、図45に示される実装を有するアプリケーションに適用された場合を考える。図45は、検査対象のアプリケーションの実装例を示す図である。同図の実装例ソースコードは、アプリケーションap1におけるAdminServlet.loginメソッドの実装例を示す。当該loginメソッド内では、aに示される部分においてメソッドaが呼び出されている。また、cに示される部分においてメソッドcが呼び出されている。図45に示されるアプリケーションap1に対して、ルール記述rd3に基づく履歴記録プログラムPr及び検出プログラムPcが適用されると、例えば、図46に示されるような検出ログが検出ログ記憶部16に記録される。図46は、検出ログの具体例を示す図である。同図の検出ログL1では、SQL-injというルール名のルールルール記述rd3に関して、AdminLoginServletloginメソッド内において、ルール違反positiveが検出されたことが示されている。アプリケーションap1では、メソッドbが呼び出されていないことが検出プログラムPcによって検出されるからである。この時点で、アプリケーションap1は、以下の4つのケースのうち、ケースB又はケースDに該当することが分かる。A正しい実装で、かつ、結果もOKB誤った実装の可能性が有り、結果はOKC正しい実装であるにも拘わらず、結果はNGD誤った実装の可能性が有り、結果はNG検出ログL1及び図40に示したテストポリシーリストに基づいて、図39の処理が実行されると、図40の1行目及び2行目のテストポリシーが抽出される。したがって、図41に示したシナリオコードsc1、及び図42に示したシナリオコードsc2のそれぞれに対して、検出ログL1における検出箇所AdminLoginServletloginが書き込まれる。その結果、図47及び図48に示されるようなテストプログラムTpが生成される。図47は、テストプログラムの第一の例を示す図である。また、図48は、テストプログラムの第二の例を示す図である。図47及び図48において、図41又は図42と同一又は対応する部分には同一符号を付している。図47のテストプログラムTp1及び図48のテストプログラムTp2では、それぞれ空欄部分図中における<検出箇所>が、AdminLoginServletloginによって置換されている。したがって、テストプログラムTp1及びTp2は、それぞれ、アプリケーションによるAdminLoginServletloginメソッドの呼び出し実行をフックし、aroundアドバイスad31又はad32を実行するプログラムである。図47のaroundアドバイスad31において、ステップs81は、AdminLoginServletloginメソッドの第一引数であるidに対して文字列dummyを代入する。ステップs82aは、AdminLoginServletloginメソッドの第二引数であるpassに対して文字列orA=Aを代入する。ステップs83は、本来実行すべき処理図45のAdminLoginServletloginメソッドを実行し、その戻り値をresultに格納する。したがって、ステップs83では、第一引数及び第二引数に関して、ステップs81及びs82aにおいて強制的に代入された値に基づいて、AdminLoginServletloginメソッドが実行される。なお、AdminLoginServletloginメソッドは、認証に成功した場合trueを返却し、認証に失敗した場合falseを返却する。したがって、ステップs83のresultには、認証結果が格納される。ステップs84aは、認証結果を出力する。一方、図48のaroundアドバイスad32において、図47のaroundアドバイスad31と同一ステップには同一ステップ番号を付している。ここでは、ステップ番号が異なる部分について説明する。ステップs82bは、AdminLoginServletloginメソッドの第二引数であるpassに対して文字列’or’A’=’Aを代入する。当該文字列は、図47のステップs82aの文字列orA=Aの二重引用符が、一重引用符’に置き換えられたものである。また、ステップs83bは、AdminLoginServletloginメソッドの戻り値すなわち、認証結果を出力する。ステップs83bは、認証結果とともに出力される文字列SQL-inj_single_quotresult=が、図47のステップs83aにおける文字列SQL-inj_double_quotresult=と異なる。図47のテストプログラムTp1の実行結果と、図48のテストプログラムTp2の実行結果とを識別可能とするためである。なお、テストプログラムTp1及びテストプログラムTp2は、いずれも、SQLインジェクションを試みるためのテストプログラムTpである。すなわち、本来であれば、テストプログラムTp1及びテストプログラムTp2の双方のケースにおいて、認証は失敗しなければならない。テストプログラムTp1及びテストプログラムTp2において指定される、id及びpassは、正当なid又はpassでないからである。しかし、アプリケーションap1では、メソッドbが呼び出されていない、したがって、テストプログラムTp1がアプリケーションap1に適用された場合は、認証は失敗するが、テストプログラムTp2がアプリケーションap1に適用された場合は、認証は成功してしまう。すなわち、テストプログラムTp2のケースでは、SQLインジェクションに成功してしまう。その結果、テストプログラムTp2によって、アプリケーションap1に関して、セキュリティの脆弱性を検出することができる。すなわち、以下の二つのケースのうち、アプリケーションap1は、ケースDに該当することが分かる。B誤った実装の可能性が有り、結果はOKD誤った実装の可能性が有り、結果はNGしたがって、テスト実施者は、メソッドbを呼び出すように、アプリケーションap1の修正が必要であることを認識することができる。なお、仮に、履歴記録プログラムPr及び検出プログラムPcによる検出ログによる検出ログに基づくテストプログラムTpによるブラックボックステストではなく、一般的なブラックボックステストのみが実行された場合を考える。この場合、たまたまテストプログラムTp1に相当するブラックボックステストが実行されれば、アプリケーションap1に関してAdminLoginServletloginメソッドにおける認証は失敗する。したがって、テスト実施者は、以下のケースA又はケースBのいずれかに該当することまでは認識することはできる。A正しい実装で、かつ、結果もOKB誤った実装の可能性が有り、結果はOKしかし、ケースAとケースBとのいずれに該当するのかに関して、即座に区別するのは困難である。また、たまたまテストプログラムTp2に相当するブラックボックステストが実行されれば、アプリケーションap1に関してAdminLoginServletloginメソッドにおける認証は成功する。したがって、テスト実施者は、以下のケースC又はケースDのいずれかに該当することまでは認識することはできる。C正しい実装であるにも拘わらず、結果はNGD誤った実装の可能性が有り、結果はNGしかし、ケースCとケースBとのいずれに該当するのかに関して、即座に区別するのは困難である。上述したように、本実施の形態によれば、まず、文脈上のルール違反の有無の検出が行われ、検出結果に基づいて、ブラックボックステストを実施する箇所が絞り込まれる。また、当該検出結果に基づいて、ブラックボックステスト用のテストプログラムTpが自動生成される。したがって、絞り込まれた箇所に関して、ブラックボックステストを詳細に実施することができる。その結果、当初からブラックボックステストのみを実施する場合に比べて、バグの検出精度を向上させることができる。また、ブラックボックステストを詳細に実施する箇所は絞り込まれているため、テスト作業の効率化を期待することができる。なお、上記ケースA~Dのうち、ケースA及びケースCと、ケースB及びケースDとについては、ブラックボックスの実施以前に、ルールに基づく検出ログによって判別することができる。また、ケースAとケースCとの判別、及びケースBとケースDとについては、検出ログ、テストポリシー、及びシナリオコードに基づいて自動生成されるテストプログラムTpによるブラックボックスに基づいて、判別することができる。また、検査対象のプログラムが様々な処理フローを含んでいる場合、ブラックボックステストが本来想定している処理フローのカバレッジ網羅性を満たしているか否かを、ブラックボックステストの結果と検出ログとを合わせて閲覧することで、検証することができる。その結果、テストの網羅性の向上を期待できる。また、ルール違反の有無の検出結果とシナリオコードとは、テストポリシーによって関連付けることができる。テストポリシーは、テスト実施者が有するブラックボックステストに関する方針又は意図等に基づいて作成することができる。したがって、テスト実施者の方針又は意図等に応じて、当該検出結果とシナリオコードとを自由に関連付けることができる。また、テストポリシーは、ルール名とルール違反の有無の検出箇所との組み合わせに応じてシナリオコードを関連付ける。換言すれば、検出箇所に応じて異なるシナリオコードを関連付けることができる。その結果、検出箇所に適したシナリオコードに基づくテストプログラムTpを生成することができる。また、本実施の形態によれば、ルール記述を作成することにより、当該ルール記述に基づいて、履歴記録プログラムPr及び検出プログラムPcが自動生成される。当該履歴記録プログラムPr及び検出プログラムPcを、ライブラリを利用するアプリケーションに適用することにより、当該アプリケーションによる当該ライブラリの利用の適否を検査することができる。したがって、テストプログラム生成装置10は、ライブラリの文脈上のルールに対する違反の検出を適切に支援することができる。より詳しくは、履歴記録プログラムPrは、ライブラリのメソッドの呼び出し履歴を採取し、記録しておく。検出プログラムPcは、履歴の内容が、ライブラリの文脈上のルールに適合しているか否かを判定する。したがって、デバッガのようにコールスタックだけではない、呼出の有無又は前後関係に関するルール違反の検出が可能になる。また、本実施の形態では、メソッドの呼び出しに対して動的なフック機構が採用されて、アプリケーションによるライブラリの呼出が検知される。したがって、ライブラリ又はアプリケーションのソースコード等に修正を加える必要はない。その結果、例えば、ライブラリの作成後に、後付けでルールを作成し、ライブラリと一体化して提供することもできる。そうすることにより、検査ツールを別途提供されなくても、アプリケーションのテストの過程で、文脈上のルール違反を自動的に検出することができる。なお、本実施の形態において、履歴記録プログラムPrは、履歴記録部の一例である。検出プログラムPcは、検出部の一例である。テストプログラム生成部15は、生成部の一例である。以上、本発明の実施例について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形変更が可能である。以上の説明に関し、更に以下の項を開示する。付記1メソッドの集合を利用する利用プログラムによる前記メソッドの実行の検知に応じて該実行の履歴を記録し、前記履歴を、記憶部が記憶する、前記メソッドの集合に関する文脈上の規則情報と照合して、前記利用プログラムによる前記メソッドの実行に関して前記規則情報に対する違反を検出し、検出結果を前記記憶部に記録し、前記規則情報と前記検出結果との組み合わせに対応付けて前記記憶部が記憶するテストコードを実行させるテストプログラムを生成する処理をコンピュータが実行するテストプログラム生成方法。付記2前記検出結果は、前記違反が検出された前記メソッドのメソッド名を含み、前記生成する処理は、前記メソッド名に係る前記メソッドの実行の検出に応じて前記テストプコードを実行させる前記テストプログラムを生成する付記1記載のテストプログラム生成方法。付記3前記規則情報に係る前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録プログラムを生成する処理と、前記履歴を前記規則情報と照合して前記利用プログラムによる前記メソッドの実行に関して前記規則情報に対する違反を検出する検出プログラムを生成する処理とを前記コンピュータが実行し、前記履歴プログラムは、前記履歴を記録する処理を前記コンピュータに実行させ、前記検出プログラムは、前記検出手順を前記コンピュータに実行させる付記1又は2記載のテストプログラム生成方法。付記4前記規則情報は、cメソッド内において、bメソッドが実行される場合はbメソッドの実行前にaメソッドが実行されなければならないことを規定し、前記履歴を記録する処理は、cメソッドの実行の検知に応じ、aメソッドが呼び出されていないことを記録し、aメソッドの実行の検知に応じ、aメソッドが実行されたことを記録し、bメソッドの実行の検知に応じ、aメソッドが実行されたか否かに基づいて当該規則情報に規定された要件が満たされたか否かを検出する付記1乃至3いずれか一項記載のテストプログラム生成方法。付記5前記規則情報は、fメソッド内において、eメソッドが実行される場合はeメソッドの実行後にdメソッドが実行されなければならないことを規定し、前記履歴を記録する処理は、fメソッドの実行の検知に応じ、当該規則情報に規定された要件が満たされていることを記録し、eメソッドの実行の検知に応じ、当該要件が満たされていないことを記録し、dメソッドの実行の検知に応じ、当該要件が満たされていることを検出する付記1乃至4いずれか一項記載のテストプログラム生成方法。付記6前記規則情報は、hメソッド内において、gメソッドが実行されなければならないことを規定し、前記履歴を記録する処理は、hメソッドの実行の検知に応じ、当該規則情報に規定された要件が満たされていないことを記録し、gメソッドの実行の検知に応じ、当該要件が満たされていることを検出する付記1乃至5いずれか一項記載のテストプログラム生成方法。付記7メソッドの集合を利用する利用プログラムによる前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録部と、前記履歴を、記憶部が記憶する、前記メソッドの集合に関する文脈上の規則情報と照合して、前記利用プログラムによる前記メソッドの実行に関して前記規則情報に対する違反を検出し、検出結果を前記記憶部に記録する検出部と、前記規則情報と前記検出結果との組み合わせに対応付けて前記記憶部が記憶するテストコードを実行させるテストプログラムを生成する生成部とを有するテストプログラム生成装置。付記8前記検出結果は、前記違反が検出された前記メソッドのメソッド名を含み、前記生成部は、前記メソッド名に係る前記メソッドの実行の検出に応じて前記テストプコードを実行させる前記テストプログラムを生成する付記7記載のテストプログラム生成装置。付記9前記規則情報に係る前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録プログラムを生成する履歴記録プログラム生成部と、前記履歴を前記規則情報と照合して前記利用プログラムによる前記メソッドの実行に関して前記規則情報に対する違反を検出する検出プログラムを生成する検出プログラム生成部とを有し、前記履歴プログラムは、前記履歴記録部として前記テストプログラム生成装置を機能させ、前記検出プログラムは、前記検出部として前記テストプログラム生成装置を機能させる付記7又は8記載のテストプログラム生成装置。付記10前記規則情報は、cメソッド内において、bメソッドが実行される場合はbメソッドの実行前にaメソッドが実行されなければならないことを規定し、前記履歴記録部は、cメソッドの実行の検知に応じ、aメソッドが呼び出されていないことを記録し、aメソッドの実行の検知に応じ、aメソッドが実行されたことを記録し、bメソッドの実行の検知に応じ、aメソッドが実行されたか否かに基づいて当該規則情報に規定された要件が満たされたか否かを検出する付記7乃至9いずれか一項記載のテストプログラム生成装置。付記11前記規則情報は、fメソッド内において、eメソッドが実行される場合はeメソッドの実行後にdメソッドが実行されなければならないことを規定し、前記履歴記録部は、fメソッドの実行の検知に応じ、当該規則情報に規定された要件が満たされていることを記録し、eメソッドの実行の検知に応じ、当該要件が満たされていないことを記録し、dメソッドの実行の検知に応じ、当該要件が満たされていることを検出する付記7乃至10いずれか一項記載のテストプログラム生成装置。付記12前記規則情報は、hメソッド内において、gメソッドが実行されなければならないことを規定し、前記履歴記録部は、hメソッドの実行の検知に応じ、当該規則情報に規定された要件が満たされていないことを記録し、gメソッドの実行の検知に応じ、当該要件が満たされていることを検出する付記7乃至11いずれか一項記載のテストプログラム生成装置。付記13メソッドの集合を利用する利用プログラムによる前記メソッドの実行の検知に応じて該実行の履歴を記録し、前記履歴を、記憶部が記憶する、前記メソッドの集合に関する文脈上の規則情報と照合して、前記利用プログラムによる前記メソッドの実行に関して前記規則情報に対する違反を検出し、検出結果を前記記憶部に記録し、前記規則情報と前記検出結果との組み合わせに対応付けて前記記憶部が記憶するテストコードを実行させるテストプログラムを生成する処理をコンピュータに実行させるテストプログラム生成プログラム。付記14前記検出結果は、前記違反が検出された前記メソッドのメソッド名を含み、前記生成する処理は、前記メソッド名に係る前記メソッドの実行の検出に応じて前記テストプコードを実行させる前記テストプログラムを生成する付記13記載のテストプログラム生成プログラム。付記15記規則情報に係る前記メソッドの実行の検知に応じて該実行の履歴を記録する履歴記録プログラムを生成する履歴記録プログラム生成する処理と、前記履歴を前記規則情報と照合して前記利用プログラムによる前記メソッドの実行に関して前記規則情報に対する違反を検出する検出プログラムを生成する検出プログラム生成する処理とを前記コンピュータに実行させ、前記履歴プログラムは、前記履歴を記録する処理を前記コンピュータに実行させ、前記検出プログラムは、前記検出手順を前記コンピュータに実行させる付記13又は14記載のテストプログラム生成プログラム。付記16前記規則情報は、cメソッド内において、bメソッドが実行される場合はbメソッドの実行前にaメソッドが実行されなければならないことを規定し、前記履歴を記録する処理は、cメソッドの実行の検知に応じ、aメソッドが呼び出されていないことを記録し、aメソッドの実行の検知に応じ、aメソッドが実行されたことを記録し、bメソッドの実行の検知に応じ、aメソッドが実行されたか否かに基づいて当該規則情報に規定された要件が満たされたか否かを検出する付記13乃至15いずれか一項記載のテストプログラム生成プログラム。付記17前記規則情報は、fメソッド内において、eメソッドが実行される場合はeメソッドの実行後にdメソッドが実行されなければならないことを規定し、前記履歴を記録する処理は、fメソッドの実行の検知に応じ、当該規則情報に規定された要件が満たされていることを記録し、eメソッドの実行の検知に応じ、当該要件が満たされていないことを記録し、dメソッドの実行の検知に応じ、当該要件が満たされていることを検出する付記13乃至16いずれか一項記載のテストプログラム生成プログラム。付記18前記規則情報は、hメソッド内において、gメソッドが実行されなければならないことを規定し、前記履歴を記録する処理は、hメソッドの実行の検知に応じ、当該規則情報に規定された要件が満たされていないことを記録し、gメソッドの実行の検知に応じ、当該要件が満たされていることを検出する付記13乃至17いずれか一項記載のテストプログラム生成プログラム。"