(57)【要約】【課題】コンピュータプログラムに対する効率的な試験を実現する。【解決手段】実施の一形態である試験支援装置３００は試験電文設定部３０２を備える。試験電文設定部３０２は、アプリケーションのソースコードを取得する手段と、ソースコードから、アプリケーションの機能を呼び出すための要素の名称を抽出する手段と、ソースコードの作成者によるアプリケーションの試験において用いられた第１の試験電文を取得する手段と、上記要素の名称にしたがって、第１の試験電文においてアプリケーションの機能を呼び出すための要素が設定されたフィールドを特定する手段と、特定されたフィールドに対して予め定められた要素の値を設定することにより、アプリケーションに対する新たな試験において使用すべき第２の試験電文を設定する手段とを含む。【選択図】図１４
2010267266.tif 000002
【特許請求の範囲】
【請求項１】
アプリケーションのソースコードを取得するソースコード取得部と、
前記ソースコードから、前記アプリケーションの機能を呼び出すための要素の名称を抽出する要素名抽出部と、
前記ソースコードの作成者による前記アプリケーションの試験において前記アプリケーションに対して送信された第１の試験電文を取得する試験電文取得部と、
前記要素名抽出部により抽出された要素の名称にしたがって、前記第１の試験電文において前記アプリケーションの機能を呼び出すための要素が設定されたフィールドを特定する試験電文解析部と、
特定されたフィールドに対して予め定められた要素の値を設定することにより、前記アプリケーションに対する新たな試験において前記アプリケーションに対して送信すべき第２の試験電文を設定する試験電文設定部と、
を備えることを特徴とする試験支援装置。
【請求項２】
前記試験電文設定部は、ペネトレーションテストのための試験文字列を前記要素の値として前記特定されたフィールドへ設定することにより、ペネトレーションテストのための第２の試験電文を設定することを特徴とする請求項１に記載の試験支援装置。
【請求項３】
前記試験電文設定部は、前記要素名抽出部により抽出された要素の名称のうち前記試験電文解析部により特定されたフィールドに未設定のものについて、その未設定の要素を設定した試験電文も前記第２の試験電文として設定することを特徴とする請求項１または２に記載の試験支援装置。
【請求項４】
前記試験電文設定部は、前記要素名抽出部により抽出された関数名のうち前記試験電文解析部により特定されたフィールドに未設定の関数名がある場合、その関数を呼び出すための試験電文も前記第２の試験電文として設定することを特徴とする請求項３に記載の試験支援装置。
【請求項５】
前記ソースコードが準拠するプログラミング言語の文法規則にしたがって、前記ソースコードの各要素をノードとする構文木を生成する構文木生成部と、
前記構文木において、前記アプリケーションの実行フローを制御する制御命令のノードに対して、当該制御命令により実行フローが制御されたことを示すメッセージを出力するロギング命令のノードを対応づけて設定する構文木改変部と、
前記第１の試験電文が発行された際の前記アプリケーションの実行フローについて、その実行フローに含まれる前記アプリケーションの機能を呼び出すための要素を確認可能にするためのプログラムであって、制御命令に対応づけてロギング命令が設定された試験用プログラムを、前記構文木を参照して出力するプログラム出力部と、
をさらに備えることを特徴とする請求項１から４のいずれかに記載の試験支援装置。
【請求項６】
本装置もしくは外部装置において管理された複数のソースコードのうち少なくとも一部のソースコードが変更された旨を検出する変更検出部と、
変更されたソースコードに関するアプリケーションの実行フローを参照して、その実行フローに含まれる前記アプリケーションの機能を呼び出すための要素が設定された第２の試験電文を、ソースコードの変更に伴う試験において発行すべき試験電文として選択する試験電文選択部と、
をさらに備えることを特徴とする請求項５に記載の試験支援装置。
【請求項７】
アプリケーションのソースコードを取得するステップと、
前記ソースコードから、前記アプリケーションの機能を呼び出すための要素の名称を抽出するステップと、
前記ソースコードの作成者による前記アプリケーションの試験において前記アプリケーションに対して送信された第１の試験電文を取得するステップと、
前記抽出するステップにおいて抽出された要素の名称にしたがって、前記第１の試験電文において前記アプリケーションの機能を呼び出すための要素が設定されたフィールドを特定するステップと、
特定されたフィールドに対して予め定められた要素の値を設定することにより、前記アプリケーションに対する新たな試験において前記アプリケーションに対して送信すべき第２の試験電文を設定するステップと、
をコンピュータに実行させることを特徴とする試験支援方法。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、データ処理技術に関し、特に、コンピュータプログラムに対する試験を支援する技術に関する。
【背景技術】
【０００２】
アプリケーションにおけるセキュリティの脆弱性を検出するためのペネトレーションテストが知られている。ペネトレーションテストでは、例えば、既知の攻撃パターンが設定された試験電文を試験対象のアプリケーションへ発行し、そのアプリケーションからの出力データを検証することにより、脆弱性の有無が判断されることがある。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２００５−２２８１７７号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
アプリケーション開発の一連の工程において、アプリケーションのソースコードのプログラマは、自身で作成したアプリケーションの単体試験用の試験電文を作成することがある。その一方で、結合試験工程においてペネトレーションテストが実施される場合は、ペネトレーションテスト用の試験電文を試験担当者が一から作成する必要があり、試験コストの増大要因となっていたと本発明者は考えた。
【０００５】
本発明は、本発明者の上記課題認識に基づいて完成された発明であり、その主たる目的は、コンピュータプログラムに対する効率的な試験の実現を支援する技術を提供することである。
【課題を解決するための手段】
【０００６】
上記課題を解決するために、本発明のある態様の試験支援装置は、アプリケーションのソースコードを取得するソースコード取得部と、ソースコードから、アプリケーションの機能を呼び出すための要素の名称を抽出する要素名抽出部と、ソースコードの作成者によるアプリケーションの試験においてアプリケーションに対して送信された第１の試験電文を取得する試験電文取得部と、要素名抽出部により抽出された要素の名称にしたがって、第１の試験電文においてアプリケーションの機能を呼び出すための要素が設定されたフィールドを特定する試験電文解析部と、特定されたフィールドに対して予め定められた要素の値を設定することにより、アプリケーションに対する新たな試験においてアプリケーションに対して送信すべき第２の試験電文を設定する試験電文設定部と、を備える。
【０００７】
本発明の別の態様は、試験支援方法である。この方法は、アプリケーションのソースコードを取得するステップと、ソースコードから、アプリケーションの機能を呼び出すための要素の名称を抽出するステップと、ソースコードの作成者によるアプリケーションの試験においてアプリケーションに対して送信された第１の試験電文を取得するステップと、抽出するステップにおいて抽出された要素の名称にしたがって、第１の試験電文においてアプリケーションの機能を呼び出すための要素が設定されたフィールドを特定するステップと、特定されたフィールドに対して予め定められた要素の値を設定することにより、アプリケーションに対する新たな試験においてアプリケーションに対して送信すべき第２の試験電文を設定するステップと、をコンピュータに実行させる。
【０００８】
なお、以上の構成要素の任意の組合せ、本発明の表現を装置、方法、システム、プログラム、プログラムを格納した記録媒体などの間で変換したものもまた、本発明の態様として有効である。
【発明の効果】
【０００９】
本発明によれば、コンピュータプログラムに対する効率的な試験の実現を支援できる。
【図面の簡単な説明】
【００１０】
【図１】第１実施形態における試験支援装置の機能構成を示すブロック図である。
【図２】制御命令ノードの定義情報の構造を示す図である。
【図３（ａ）】ロギング命令一覧情報の構造を示す図である。
【図３（ｂ）】ロギング命令一覧情報の構造を示す図である。
【図４】試験支援装置の動作を示すフローチャートである。
【図５（ａ）】原本プログラムのプログラムコードの例を示す図である。
【図５（ｂ）】原本プログラムのプログラムコードの例を示す図である。
【図６（ａ）】図５（ａ）の原本プログラムから生成された原本構文木の一例を示す図である。
【図６（ｂ）】図５（ｂ）の原本プログラムから生成された原本構文木の一例を示す図である。
【図７（ａ）】図６（ａ）の原本構文木が改変された改変構文木を示す図である。
【図７（ｂ）】図６（ｂ）の原本構文木が改変された改変構文木を示す図である。
【図８（ａ）】試験用プログラムのプログラムコードの例を示す図である。
【図８（ｂ）】試験用プログラムのプログラムコードの例を示す図である。
【図９】第１実施形態の試験支援装置の動作を示すフローチャートである。
【図１０】ＨＴＭＬファイルに出力された試験用プログラムの出力データを示す図である。
【図１１】ＨＴＭＬファイルに出力された試験用プログラムの出力データを示す図である。
【図１２】第１実施形態の試験支援装置の動作を示すフローチャートである。
【図１３】網羅状況表示部による網羅状況の表示イメージを示す図である。
【図１４】第２実施形態の企業システムの構成を示す図である。
【図１５】図１４の試験電文設定部の詳細構成を示すブロック図である。
【図１６（ａ）】ソースファイルの一例を示す図である。
【図１６（ｂ）】ソースファイルの一例を示す図である。
【図１７】ソースファイルから抽出されたコール要素の例を示す図である。
【図１８（ａ）】ＵＴ用試験電文の例を示す図である。
【図１８（ｂ）】ＵＴ用試験電文の例を示す図である。
【図１９（ａ）】ＩＴ用試験電文の例を示す図である。
【図１９（ｂ）】ＩＴ用試験電文の例を示す図である。
【図１９（ｃ）】ＩＴ用試験電文の例を示す図である。
【図２０】第２実施形態の試験支援装置の動作を示すフローチャートである。
【図２１】変形例における試験部の機能ブロックを示すブロック図である。
【発明を実施するための形態】
【００１１】
実施の形態においては、まず、ペネトレーションテストにおけるプログラムコードの実行フローを可視化する技術を第１の実施の形態（以下、「第１実施形態」と呼ぶ。）として説明する。次に、ペネトレーションテストのための試験電文を自動設定する技術を第２の実施の形態（以下、「第２実施形態」と呼ぶ。）として説明する。
【００１２】
（第１実施形態）
ペネトレーションテストは、コンピュータプログラムの内部構造は考慮せずに、そのコンピュータプログラムからの出力データに着目するブラックボックステストである。したがって、試験対象のコンピュータプログラムにセキュリティ上の脆弱性が存在することは検出できるものの、内部構造はブラックボックスであるため、そのコンピュータプログラムに存在する問題の解決には時間を要することがあった。
【００１３】
第１実施形態として、ペネトレーションテストの対象となるオリジナルのプログラム（以下、適宜「原本プログラム」とも呼ぶ。）について、ペネトレーションテストにおけるプログラムコードの実行フローを可視化する試験支援装置を提案する。この試験支援装置は、原本プログラムにおけるプログラムコードに記述された命令のうち、原本プログラムの実行フローを制御する制御命令の実行に伴って、その実行フローをユーザに通知するためのメッセージを出力させるよう原本プログラムを改変する。このメッセージを、以下、「実行フローメッセージ」と呼ぶこととする。
【００１４】
具体的には、第１実施形態の試験支援装置は、原本プログラムに記述されたプログラムコードの各要素をノードとする抽象構文木を生成する。そして、抽象構文木において、制御命令を示すノード（以下、適宜「制御命令ノード」とも呼ぶ。）に対して、その制御命令を特定可能な実行フローメッセージを出力するロギング命令を示すノード（以下、適宜「ロギング命令ノード」とも呼ぶ。）を対応づけて設定する。そして、試験支援装置は、ロギング命令ノードを追加した抽象構文木から、原本プログラムが改変されたプログラム（以下、適宜「試験用プログラム」とも呼ぶ。）を生成する。この試験用プログラムでは、制御命令にロギング命令が対応づけられることになる。
【００１５】
第１実施形態の試験支援装置のように、原本プログラムの改変のために、そのプログラムコードそのものを解析するのではなく、原本プログラムに対応する抽象構文木を解析することにより、制御命令に対応づけてロギング命令を設定することが容易になる。例えば、同じ条件分岐処理であっても、以下の３例のように、プログラムコードとしては様々な記述パターンが存在する。
第１の記述パターン：
Ｉｆ（ｓｔａｔｕｓ）ｏｐｅｒａｔｉｏｎ；
第２の記述パターン：
Ｉｆ（ｓｔａｔｕｓ）｛
ｏｐｅｒａｔｉｏｎ；
｝
第３の記述パターン：
Ｉｆ（ｓｔａｔｕｓ）
｛
ｏｐｅｒａｔｉｏｎ；
｝
【００１６】
プログラムコードそのものを解析する場合には、上記３例それぞれのパターンに対応する解析処理が必要である。これに対し、抽象構文木においてはプログラムコードの書式レベルの差異は吸収されて同じノード構成となるため、制御命令ノードに対してロギング命令ノードを追加する処理を共通化できる。言い換えれば、プログラムコードの記述パターンに依存しない共通ロジックでの処理が可能となる。その結果、試験支援装置を実現するためのプログラムコードについて、そのコード量を低減できるとともに容易なメンテナンスを実現できる。
【００１７】
さらに、第１実施形態の試験支援装置は、生成した試験用プログラムに対してペネトレーションテストを実行する。そして、このペネトレーションテストにおいて実行されたロギング命令により、実行フローを制御した制御命令を特定可能な実行フローメッセージを出力させる。第１実施形態の試験支援装置によれば、原本プログラムに対するペネトレーションテスト実行時の実行フローが可視化され、原本プログラムに存在する問題箇所の特定が容易になり、問題の迅速な解決を支援できる。
【００１８】
図１は、第１実施形態における試験支援装置１００の機能構成を示すブロック図である。試験支援装置１００は、記憶部１０と、ＵＩ部３０と、データ処理部４０とを備える。記憶部１０は、各種データを保持するための記憶領域である。ＵＩ部３０は、プログラムの開発者や試験担当者等、ユーザに対するユーザインタフェース処理を担当する。データ処理部４０は、記憶部１０に保持されたデータや、ＵＩ部３０において取得されたデータに基づいて各種のデータ処理を実行する。データ処理部４０は、記憶部１０とＵＩ部３０との間のインタフェースの役割も果たす。
【００１９】
本明細書のブロック図において示される各ブロックは、ハードウェア的には、コンピュータのＣＰＵをはじめとする素子や機械装置で実現でき、ソフトウェア的にはコンピュータプログラム等によって実現されるが、ここでは、それらの連携によって実現される機能ブロックを描いている。したがって、これらの機能ブロックはハードウェア、ソフトウェアの組合せによっていろいろなかたちで実現できることは、当業者には理解されるところである。例えば、メモリや補助記憶装置は、記憶部１０の処理を実行してもよい。また、ＣＰＵは、ＵＩ部３０やデータ処理部４０それぞれの処理内容が実装されたプログラムモジュールをメモリに読み込み、それぞれのプログラムモジュールにしたがって、ＵＩ部３０やデータ処理部４０の各種処理を実行してもよい。
【００２０】
記憶部１０：
記憶部１０は、原本プログラム保持部１２と、ノード定義保持部１４と、ロギング命令保持部１６と、試験用プログラム保持部１８と、入力データ保持部２０と、出力データ保持部２２とを有する。原本プログラム保持部１２は、原本プログラムのソースコードを保持する。原本プログラムを記述するプログラミング言語には制限はなく、例えばＰＨＰ・ＪＡＶＡ（登録商標）等であってもよい。
【００２１】
ノード定義保持部１４は、制御命令ノードの定義情報を保持する。具体的には、ＰＨＰやＪＡＶＡ等、互いに異なる複数のプログラミング言語のそれぞれで記述された原本プログラムから生成される抽象構造木について、各抽象構文木において存在しうる制御命令ノードの定義情報を保持する。この定義情報の具体例は、図２において後述する。
【００２２】
ロギング命令保持部１６は、試験用プログラムにおいて、複数の制御命令のそれぞれに対応づけて設定される複数のロギング命令について、各ロギング命令の属性情報をロギング命令一覧情報として保持する。ロギング命令一覧情報の具体例は、図３において後述する。試験用プログラム保持部１８は、原本プログラムが改変された試験用プログラムを保持する。
【００２３】
入力データ保持部２０は、原本プログラムに対してペネトレーションテストを実行するための試験データを保持する。この試験データは、典型的には、プログラムの脆弱性の有無を確認するための既知の攻撃パターンが設定されたデータである。例えば、クロスサイトスクリプティングに対する脆弱性の有無を検証するための、スクリプト言語で記述されたプログラムコードを含む試験データでもよい。また、ＳＱＬ（Structured Query Language）インジェクションに対する脆弱性の有無を検証するための文字列を含む試験データでもよい。出力データ保持部２２は、ペネトレーションテストにおいて試験用プログラムから出力された出力データを保持する。
【００２４】
ＵＩ部３０：
ＵＩ部３０は、指示受付部３２と、実行フロー表示部３４と、網羅状況表示部３６とを有する。指示受付部３２は、各種入力装置を介して、ユーザにより入力された各種指示を受け付ける。実行フロー表示部３４は、ペネトレーションテストにおける試験用プログラムからの出力データをディスプレイに表示させる。
【００２５】
網羅状況表示部３６は、原本プログラムのプログラムコード全体に占める、ペネトレーションテストにおいて原本プログラムのプログラムコードが実行された割合（以下、適宜「網羅率」と呼ぶ。）をディスプレイに表示させる。また網羅状況表示部３６は、試験用プログラムに設定されたロギング命令の一覧を表示する。その際に、ペネトレーションテストにおいて未実行のロギング命令については、実行済のロギング命令よりもユーザから視認されやすい態様でディスプレイ上に表示する。例えば、未実行のロギング命令を、実行済のロギング命令よりも大きな文字サイズや、より視認させやすい表示色等で表示させてもよい。
【００２６】
データ処理部４０：
データ処理部４０は、原本プログラムを試験用プログラムへと改変する改変部５０と、試験用プログラムに対してペネトレーションテストを実行する試験部６０とを有する。改変部５０は、原本プログラム取得部５２と、構文木生成部５４と、構文木改変部５６と、試験用プログラム出力部５８とを含む。また試験部６０は、試験用プログラム取得部６２と、試験実行部６４と、網羅状況特定部６６とを含む。
【００２７】
原本プログラム取得部５２は、原本プログラム保持部１２から原本プログラムのデータをメモリに読み込む。構文木生成部５４は、原本プログラムに記述されたプログラムコードに対して、使用されているプログラミング言語の文法規則にしたがってあらかじめ定められた方法により字句解析および構文解析を実行する。そして、原本プログラムに基づく抽象構文木（以下、適宜「原本構文木」と呼ぶ。）のデータをメモリに生成する。
【００２８】
構文木生成部５４は、ＬＲ構文解析法等の既知の手法により原本構文木を作成してもよく、公知の構文解析関数を呼び出すことにより原本構文木を作成してもよい。後者の例として、Ｅｃｌｉｐｓｅ（登録商標）が提供するＪＤＴ（Java Development Tools）のライブラリ関数に対して、ＪＡＶＡで記述された原本プログラムのデータを渡すことにより、その原本プログラムに対応する抽象構文木を生成してもよい。同様に、Ｅｃｌｉｐｓｅが提供するＰＤＴ（PHP Development Tools）のライブラリ関数を呼び出すことにより、ＰＨＰで記述された原本プログラムに対応する抽象構文木を生成してもよい。
【００２９】
構文木改変部５６は、ノード定義保持部１４に記憶された制御命令ノードの定義情報を参照して、原本構文木のノードのうち原本プログラムのプログラミング言語に対応した制御命令ノードを識別する。この制御命令ノードには、例えば、メソッド宣言、メソッド呼び出し命令、ｉｆ・ｅｌｓｅ・ｓｗｉｔｃｈ等の条件分岐命令、ｆｏｒ・ｗｈｉｌｅ等の繰り返し命令、ｔｒｙ・ｃａｔｃｈ等の例外処理命令を示すノードが含まれる。
【００３０】
構文木改変部５６は、制御命令ノードに対応づけて、典型的には原本構文木における制御命令ノード直下のノードとして、ロギング命令ノードを設定することにより、原本構文木を改変した抽象構文木（以下、適宜「改変構文木」と呼ぶ。）のデータを設定する。構文木改変部５６は、改変構文木を設定する際に、原本構文木における制御命令ノードの識別情報と、改変構文木におけるロギング命令ノードの識別情報とを対応づけてロギング命令保持部１６に記憶させる。
【００３１】
なお構文木生成部５４は、原本構文木のデータとして、原本構文木の各ノードをルートノード配下の子ノードとして有するＤＯＭ（Document Object Model）ツリーのオブジェクトをメモリ上に生成してもよい。このとき、それぞれの子ノードはその属性（例えばクラス型等）として制御命令の種類を示す情報を有してもよい。構文木改変部５６は、原本構文木を示すＤＯＭツリーをトラバースして制御命令ノードを検出し、検出した制御命令ノードに対応づけるべきロギング命令ノードを新たな子ノードとしてこのＤＯＭツリーに設定してもよい。この場合、ロギング命令ノードが付加されたＤＯＭツリーが改変構文木のデータとなる。
【００３２】
試験用プログラム出力部５８は、改変構文木のデータおよびロギング命令保持部１６に記憶されたロギング命令一覧情報にしたがって、試験用プログラムを生成して試験用プログラム保持部１８に記憶させる。この試験用プログラムは、原本プログラムにおける複数の制御命令それぞれに対応づけてロギング命令が設定されたソースコードであってもよく、そのソースコードに対応する実行可能形式のバイナリコードであってもよい。
【００３３】
ここで試験用プログラム出力部５８における試験用プログラムの設定処理を具体的に説明する。まず、試験用プログラム出力部５８は、ロギング命令一覧情報として記憶された制御命令ノードとロギング命令ノードとの対応関係にしたがって、ロギング命令で出力させるべき実行フローメッセージを決定する。具体的には、実行フローメッセージとして、ロギング命令が対応する制御命令の識別情報、例えば原本プログラムにおける制御命令の識別名称や位置情報等を設定する。
【００３４】
次に、試験用プログラム出力部５８は、その実行フローメッセージを所定の変換関数に入力することで、その実行フローメッセージとは異なり、その実行フローメッセージを一意に特定するための変換後データ（以下、適宜「メッセージ識別データ」とも呼ぶ。）を取得する。例えば、実行フローメッセージを所定のハッシュ関数に入力して、その実行フローメッセージから一意に生成されるハッシュ値をメッセージ識別データとして取得してもよい。試験用プログラム出力部５８は、実行フローメッセージと、その実行フローメッセージに対応するメッセージ識別データとを対応づけて、ロギング命令保持部１６にさらに記憶させる。
【００３５】
次に、試験用プログラム出力部５８は、原本プログラムのプログラミング言語に対応したロギング命令を決定する。このロギング命令は、標準出力や所定のログファイルに引数データを出力する命令であってもよく、所定のデータベースに引数データを記録する命令であってもよい。例えば、原本プログラムがＰＨＰで記述されている場合には「ｅｃｈｏ」命令をロギング命令としてもよい。試験用プログラム出力部５８は、実行コード通知メッセージそのものではなく、実行フローメッセージに対応するメッセージ識別データをロギング命令により出力させるために、ロギング命令の引数としてメッセージ識別データを設定する。
【００３６】
最後に、試験用プログラム出力部５８は、改変構文木を参照して、原本プログラムのプログラムコードに対してロギング命令が適宜挿入された試験用プログラムを生成する。試験用プログラムのソースコードを生成する場合には、改変構文木の各ノードに対応する所定のプログラムコードを逐次設定することにより、改変構文木に対応するソースコードを生成してもよい。また、構文木生成部５４と同様に、既知のライブラリ関数を呼び出すことで、抽象構文木のデータからソースコードを生成してもよい。実行形式のバイナリコードを生成する場合には、通常のコンパイル処理と同様に、改変構文木に対して意味解析やリンク処理等を順次実行してバイナリコードを出力すればよい。
【００３７】
試験用プログラム取得部６２は、試験用プログラム保持部１８から試験用プログラムのデータをメモリに読み込む。試験実行部６４は、試験用プログラムに対するペネトレーションテストを実行する。具体的には、入力データ保持部２０に記憶された試験データを取得して試験用プログラムに入力することで試験用プログラムを動作させ、試験用プログラムからの出力データを出力データ保持部２２に記憶させる。この出力データには、試験用プログラムによる試験データの処理結果や、制御命令に対応づけて設定されたロギング命令からのメッセージ識別データが含まれる。
【００３８】
網羅状況特定部６６は、ロギング命令保持部１６に記録されたロギング命令一覧情報と、出力データ保持部２２に記録されたメッセージ識別データとを参照して、ペネトレーションテストにおいて実行されたロギング命令を特定する。網羅状況特定部６６は、ロギング命令一覧情報におけるロギング命令の総数に占める、出力されたメッセージ識別データ数の割合を、原本プログラムに対するペネトレーションテストの網羅率として算出する。なお、出力されたメッセージ識別データ数を算出する際、同一のメッセージ識別データについては、複数回出力されている場合にも１とカウントする。
【００３９】
図２は、制御命令ノードの定義情報の構造を示す。言語欄には、プログラミング言語の種類が記録される。制御命令欄には、各プログラミング言語の抽象構文木に存在しうる複数種類のノードのうち制御命令ノードの識別情報が記録される。すなわち、構文木改変部５６は、原本プログラムのプログラミング言語に対応する制御命令欄を参照し、その制御命令欄に記録された制御命令ノードを原本構文木において検出すると、その制御命令ノードの直後に所定のロギング命令ノードを挿入する。
【００４０】
図３（ａ）および図３（ｂ）は、ロギング命令一覧情報の構造を示す。ロギング命令ＩＤ欄には、試験用プログラムに挿入したロギング命令を一意に特定するための識別情報が記録される。ロギング命令ノード欄には、改変構文木におけるロギング命令ノードの識別情報が記録される。同図においては、「ロギング命令ノードの識別名  ：  試験用プログラムでの行番号」の形式で記録されている。制御命令ノード欄には、改変構文木においてロギング命令ノードが設定された制御命令ノードの、原本構文木における識別情報が記録される。同図においては、「制御命令ノードの識別名  ：  原本プログラムでの行番号」の形式で記録されている。また、実行フローメッセージ欄には実行フローメッセージが記録され、メッセージ識別データ欄にはメッセージ識別データが記録される。
【００４１】
以上の構成による動作を以下説明する。
図４は、試験支援装置１００の動作を示すフローチャートである。指示受付部３２が試験用プログラムの作成指示をユーザから受け付けると、原本プログラム取得部５２は原本プログラムのデータを原本プログラム保持部１２から取得する（Ｓ１０）。図５（ａ）および図５（ｂ）は、原本プログラムのプログラムコードの例を示す。図５（ａ）は、ＪＡＶＡで記述された原本プログラムを示し、制御命令１０２ａ〜１０２ｇを含む。また図５（ｂ）は、ＰＨＰで記述された原本プログラムを示し、制御命令１０２ｈ〜１０２ｋを含む。図４に戻る。
【００４２】
構文木生成部５４は、原本プログラムに対応する原本構文木のデータをメモリ内に生成する（Ｓ１２）。図６（ａ）は、図５（ａ）の原本プログラムから生成された原本構文木の一例を示す。図６（ａ）における制御命令ノード１０４ａ〜１０４ｇは、図５（ａ）における制御命令１０２ａ〜１０２ｇに対応する。同図では、制御命令ノードのそれぞれを、「制御ノードの識別名  ：  原本プログラムでの行番号」の形式で示している。以降の抽象構文木における各ノードについても同様の形式で示すこととする。図６（ｂ）は、図５（ｂ）の原本プログラムから生成された原本構文木の一例を示す。図６（ｂ）における制御命令ノード１０４ｈ〜１０４ｋは、図５（ｂ）における制御命令１０２ｈ〜１０２ｋに対応する。図４に戻る。
【００４３】
構文木改変部５６は、原本構文木に存在する制御命令ノードを検出して、その制御命令ノードにロギング命令ノードを対応づけて設定することにより、原本構文木が改変された改変構文木を設定する（Ｓ１４）。そして、構文木改変部５６は、原本構文木における制御命令ノードの識別情報と、改変構文木においてその制御命令ノードに対し設定したロギング命令ノードの識別情報とを対応づけてロギング命令保持部１６に記憶させる（Ｓ１６）。ここでは、ロギング命令一覧情報のロギング命令ＩＤ欄と、ロギング命令ノード欄と、制御命令ノード欄とを設定する。
【００４４】
図７（ａ）は、図６（ａ）の原本構文木が改変された改変構文木を示す。同図の改変構文木においては、図６（ａ）における制御命令ノード１０４ａ〜１０４ｇのそれぞれに対して、ロギング命令ノード１０６ａ〜１０６ｇのそれぞれが対応づけられている。また、図３（ａ）におけるロギング命令ＩＤ「００１」のロギング命令ノード欄、制御命令ノード欄は、制御命令ノード１０４ａに対応づけてロギング命令ノード１０６ａを設定する際に記録されたデータを示している。すなわち、そのロギング命令ノード欄は改変構文木におけるロギング命令ノード１０６ａの識別情報を示し、制御命令ノード欄は原本構文木における制御命令ノード１０４ａの識別情報を示している。同様に、図３（ａ）におけるロギング命令ＩＤ「００２」〜「００７」の各レコードは、制御命令ノード１０４ｂ〜１０４ｇのそれぞれに対応づけてロギング命令ノード１０６ｂ〜１０６ｇのそれぞれを設定する際に記録されたデータを示している。
【００４５】
図７（ｂ）は、図６（ｂ）の原本構文木が改変された改変構文木を示す。同図の改変構文木においては、図６（ｂ）における制御命令ノード１０４ｈ〜１０４ｋのそれぞれに対して、ロギング命令ノード１０６ｈ〜１０６ｋのそれぞれが対応づけられている。また、図３（ｂ）におけるロギング命令ＩＤ「００１」のロギング命令ノード欄、制御命令ノード欄は、制御命令ノード１０４ｈに対応づけてロギング命令ノード１０６ｈを設定する際に記録されたデータを示している。すなわち、そのロギング命令ノード欄は改変構文木におけるロギング命令ノード１０６ｈの識別情報を示し、制御命令ノード欄は原本構文木における制御命令ノード１０４ｈの識別情報を示している。同様に、図３（ｂ）におけるロギング命令ＩＤ「００２」〜「００４」の各レコードは、制御命令ノード１０４ｉ〜１０４ｋのそれぞれに対応づけてロギング命令ノード１０６ｉ〜１０６ｋのそれぞれを設定する際に記録されたデータを示している。図４に戻る。
【００４６】
試験用プログラム出力部５８は、ロギング命令一覧情報の各レコードを参照して、ロギング命令にて出力させる実行フローメッセージを決定し、その実行フローメッセージに対応するメッセージ識別データを決定する。そして、実行フローメッセージおよびメッセージ識別データをロギング命令一覧情報の各レコードに追加して記録する（Ｓ１８）。試験用プログラム出力部５８は、改変構文木とロギング命令一覧情報とにしたがって、メッセージ識別データを出力するロギング命令が追加され、原本プログラムが改変された試験用プログラムを試験用プログラム保持部１８に記憶させる（Ｓ２０）。
【００４７】
図３（ａ）および図３（ｂ）における実行フローメッセージ欄は、「テストログの固定文字列  ｜  ロギング命令ＩＤ  ｜  原本プログラムファイル名  ｜  制御命令の識別名  ｜  原本プログラムにおける制御命令の行番号」の形式の実行フローメッセージを示している。このうち「制御命令の識別名  ｜  原本プログラムにおける制御命令の行番号」には、制御命令ノード欄の記録データが設定される。また、図３（ａ）および図３（ｂ）におけるメッセージ識別データ欄は、実行フローメッセージを所定のハッシュ関数に入力して得られたハッシュ値を示している。
【００４８】
図８（ａ）は、図３（ａ）の原本プログラムに対応する試験用プログラムの例を示す。同図は、図７（ａ）の改変構文木および図３（ａ）のロギング命令一覧情報にしたがって生成されたプログラムコードを示している。同図では、原本プログラムに記述された制御命令１０２ａ〜１０２ｇのそれぞれに対応づけてロギング命令１０８ａ〜１０８ｇのそれぞれが設定されている。図８（ｂ）は、図３（ｂ）の原本プログラムに対応する試験用プログラムの例を示す。同図は、図７（ｂ）の改変構文木および図３（ｂ）のロギング命令一覧情報にしたがって生成されたプログラムコードを示している。同図では、原本プログラムに記述された制御命令１０２ｈ〜１０２ｋのそれぞれに対応づけてロギング命令１０８ｈ〜１０８ｋのそれぞれが設定されている。
【００４９】
試験用プログラム出力部５８は、ロギング命令一覧情報に設定されたロギング命令ノードを改変構文木にて検出すると、そのメッセージ識別データを所定のロギング命令の引数として設定することで、試験用プログラムを生成する。図８（ａ）および図８（ｂ）におけるロギング命令「ｉｎｓｅｒｔ」は、ユーザにより定義された関数であり、所定のファイルやデータベースに対して、引数で指定された文字列データを出力する。
【００５０】
第１実施形態のロギング命令は、原本プログラムにおける処理結果の出力先に、引数で指定された文字列データを出力する命令である。これにより、原本プログラムの当初記載のプログラムコードにより出力された処理結果と並列して、メッセージ識別データが出力され、処理結果と実行フローとの対応づけが容易になる。また、第１実施形態のロギング命令は、引数で指定されたメッセージ識別データを、原本プログラムにおける処理結果を閲覧するソフトウェアにおいて通常非表示とされる態様で出力する命令である。例えば、原本プログラムにおける処理結果の出力先がＨＴＭＬファイルやＸＭＬファイル等の構造化文書である場合、引数で指定された文字列データをその構造化文書におけるコメント文として出力する。
【００５１】
図９は、第１実施形態の試験支援装置１００の動作を示すフローチャートである。指示受付部３２は、試験用プログラムに対するペネトレーションテストの開始指示をユーザから受け付け、試験用プログラム取得部６２は、試験用プログラムのデータを試験用プログラム保持部１８から読み込む（Ｓ３０）。試験実行部６４は、入力データ保持部２０に記憶された試験データを読み込み、試験用プログラムに試験データを入力することにより試験用プログラムを動作させてペネトレーションテストを実行する（Ｓ３２）。なお、試験用プログラムの実行に際し、試験用プログラムがソースコードである場合には、必要に応じて適宜実行可能形式のバイナリコードに変換する。
【００５２】
続いて、試験実行部６４は、試験用プログラムの動作に伴う試験用プログラムからの出力データを出力データ保持部２２に記憶させる（Ｓ３４）。この出力データには、ロギング命令により出力されたメッセージ識別データが含まれる。試験実行部６４は、試験用プログラムからの出力データを、構造化文書のファイル内の文字データとして記憶させてもよく、データベースにおける所定テーブルのレコードとして記憶させてもよい。
【００５３】
指示受付部３２は、試験用プログラムからの出力データの表示要求をユーザから受け付ける（Ｓ３６）。実行フローメッセージの参照権限がないユーザからの表示要求であれば（Ｓ３８のＮ）、実行フロー表示部３４は、試験用プログラムからの出力データをそのまま表示させる。図１０は、ＨＴＭＬファイルに出力された試験用プログラムの出力データを示す。同図は、ペネトレーションテストにおいて、図８（ｂ）の制御命令１０２ｈが示す「theMethod」メソッドが呼び出されたときの出力データを示している。同図では、メッセージ識別データがそのまま表示されているため、ペネトレーションテストにおける原本プログラムの実行フローを把握することは困難である。図９に戻る。
【００５４】
実行フローメッセージの参照権限を有するユーザからの表示要求であれば（Ｓ３８のＹ）、実行フロー表示部３４は、ロギング命令保持部１６のロギング命令一覧情報を参照して、試験用プログラムからの出力データであるメッセージ識別データを、そのメッセージ識別データに対応づけられた実行フローメッセージに変換して表示させる（Ｓ４０）。図１１は、ＨＴＭＬファイルに出力された試験用プログラムの出力データを示す。同図では、図１０のメッセージ識別データが、対応する実行フローメッセージに変換されているため、ペネトレーションテストにおける原本プログラムの実行フローを容易に確認できる。なお、ユーザが参照権限を有するか否かは公知のユーザ認証方法により判定されてよく、例えばユーザ端末のＩＤやログイン時のユーザ入力データにより判定してもよい。
【００５５】
図１２は、第１実施形態の試験支援装置１００の動作を示すフローチャートである。同図のＳ３０〜Ｓ３４は、図９のＳ３０〜Ｓ３４と同様であるため説明を省略する。指示受付部３２は、原本プログラムに対するテストの網羅状況の表示要求をユーザから受け付ける。網羅状況特定部６６は、出力データ保持部２２に記憶されたメッセージ識別データを参照して、テストにより実行済のロギング命令を特定する（Ｓ５０）。すなわち、出力データ保持部２２に記憶されたメッセージ識別データに対応するロギング命令は、テストにより実行されたロギング命令であると特定できる。網羅状況特定部６６は、ロギング命令保持部１６のロギング命令一覧情報を参照して、ロギング命令の総数に占める実行済のロギング命令数を網羅率として算出する（Ｓ５２）。網羅状況表示部３６は、網羅状況特定部６６において算出された網羅率をディスプレイに表示させる（Ｓ５４）。また網羅状況表示部３６は、ロギング命令を一覧表示させる際、テストにおいて未実行のロギング命令については実行済のロギング命令よりも強調表示させる（Ｓ５６）。
【００５６】
図１３は、網羅状況表示部３６による網羅状況の表示イメージを示す。なお、同図の網羅状況は、図５（ａ）の原本プログラムに対するテストの網羅状況を示している。この例では、ロギング命令の総数が７、実行済のロギング命令数が５であるため、コード網羅率が７１％と表示されている。また、実行フローメッセージの一覧表示においては、未実行のロギング命令において出力されるメッセージが、ボールド書体かつ他のメッセージよりも大きな文字サイズで強調表示されている。この結果を確認したユーザは、網羅率を向上させるために、図５（ａ）の原本プログラムにおける１５行目の条件判定がｔｒｕｅとなるように、試験データ等を調整すべきことを認識できる。
【００５７】
第１実施形態の試験支援装置１００によれば、原本プログラムに対するペネトレーションテストを実行すべき際に、制御命令に対応づけてロギング命令を設定した試験用プログラムに対してペネトレーションテストが実行される。これにより、ペネトレーションテスト実行時の原本プログラムの実行フローをユーザが確認可能になる。ペネトレーションテストにおいて問題が検出された場合には、原本プログラムの実行フロー該当箇所を参照することで問題箇所を迅速に特定できる。また、ロギング命令では、試験用プログラムにおける制御命令の記述位置ではなく、原本プログラムにおける制御命令の記述位置が出力される。これにより、原本プログラムに存在する問題箇所を容易に特定しやすくなる。ユーザによる改修対象となるのは原本プログラムであるため、ユーザによる改修作業を一層支援できることになる。また、原本プログラムに記載されたプログラムコードそのものではなく、原本プログラムに対応する抽象構文木が改変されて試験用プログラムが生成される。これにより、原本プログラムの記述スタイルに依存することなく、制御命令を容易かつ正確に検出可能となり、ロギング命令の設定を容易かつ正確に実現できる。
【００５８】
また試験支援装置１００によれば、複数のプログラミング言語のそれぞれについて制御命令ノードの定義を記録したテーブルを参照して、その定義に合致する制御命令ノードが検出される。原本プログラムを記述したプログラミング言語に応じた定義を参照することにより、プログラミング言語に依存しない共通のロジックにて制御命令ノードを検出でき、その制御命令ノードに対応づけてロギング命令ノードを設定できる。
【００５９】
さらに試験支援装置１００によれば、ペネトレーションテストにおける試験用プログラムの処理結果は構造化文書のデータとして出力され、ロギング命令による出力データはその構造化文書におけるコメント文として出力される。言い換えれば、構造化文書の閲覧用プログラムにおいて、通常非表示とされる態様で出力される。これにより、ロギング命令による出力データによって、試験用プログラムの処理結果の閲覧が困難になることを回避できる。例えば、試験用プログラムの処理結果がＨＴＭＬファイルのデータとして出力される場合、ロギング命令による出力データをそのまま表示させると、ウェブブラウザでの表示上問題になる場合がある。しかし、コメント文として出力されるため、ウェブブラウザでは試験用プログラムの処理結果を問題なく表示させることができる。かつ、ＨＴＭＬファイルのソースデータを参照すればロギング命令によるメッセージも参照でき、実行フローを容易に特定できる。
【００６０】
さらにまた試験支援装置１００によれば、ロギング命令による出力データとして、実行フローメッセージそのものに代えてメッセージ識別データが出力される。そして、ロギング命令による出力データを権限のあるユーザが参照する際には、メッセージ識別データが実行フローメッセージに変換されて表示される。これにより、権限のないユーザからは実行フローメッセージを隠蔽することができ、原本プログラムの内部構造等の情報漏洩を防止できる。
【００６１】
さらにまた試験支援装置１００によれば、ペネトレーションテストにおけるプログラムコードの実行割合を示す網羅率をユーザに提供できる。試験支援装置１００では、抽象構文木を介して、複数の制御命令のそれぞれに対応づけてロギング命令が設定されるため、原本プログラムの規模や、原本プログラムの書式に依存することなく、高い精度の網羅率を容易に算出できる。
【００６２】
以上、本発明を第１の実施の形態をもとに説明した。この実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【００６３】
上述した第１実施形態では、１つの試験支援装置１００において、改変部５０および試験部６０の両方が備えられた。変形例においては、改変部５０と試験部６０とは、互いに異なる複数の装置に分散して備えられてもよい。言い換えれば、第１の装置において生成された試験用プログラムのデータを第１の装置とは異なる第２の装置が読み込んで、第２の装置においてペネトレーションテスト、およびテスト結果の表示等が行われてもよい。
【００６４】
また、試験支援装置１００の各機能ブロックを実現するプログラムモジュールは、ＩＤＥ（Integrated Development Environment）等、他のソフトウェアプログラムに対するプラグインとして実装されてもよい。例えば、Ｅｃｌｉｐｓｅに対するプラグインとして実装され、ユーザはこのプラグインをＥｃｌｉｐｓｅにアドオンすることで、試験用プログラムの生成およびペネトレーションテストを実行してもよい。これにより、ユーザはＥｃｌｉｐｓｅにおいてプログラムコードをコーディングした後、そのプログラムコードに対するペネトレーションテストをシームレスに実行できる。
【００６５】
上述した第１実施形態では、本発明の技術思想をペネトレーションテストに適用した例を示した。しかし、本発明の技術思想はペネトレーションテストのみならずコンピュータプログラムのテスト全般に適用可能であり、その場合にも、第１実施形態に記載した各効果を奏することは当業者には理解されるところである。
【００６６】
上述した第１実施形態では特に言及しなかったが、試験用プログラムにおいて実行フローメッセージを出力するロギング命令が実行された場合、その実行フローメッセージは一旦バッファリングされてもよい。そして、試験用プログラムの実行終了後に、処理結果の出力先へ遅延出力されてもよい。試験実行部６４は、そのための機能ブロックであるメッセージ出力部を含んでもよい。このメッセージ出力部は、試験用プログラムの実行においてロギング命令が実行されると、そのロギング命令の出力内容であるメッセージ識別データを所定のバッファ領域に一旦格納する。そして、試験用プログラムの実行終了後、バッファ領域に格納されたメッセージ識別データを、処理結果の出力先であるファイル内の、当該ファイルの構造を破壊しないフィールドへ追加する。
【００６７】
例えば、メッセージ出力部は、処理結果の出力先が構造化文書である場合、その文書が整形式であることや、その文書が妥当性を有することに影響を与えないフィールドへメッセージ識別データを追加する。より具体的に処理結果の出力先がＨＴＭＬファイルである場合、メッセージ出力部は、そのＨＴＭＬファイルにおける＜／ｂｏｄｙ＞タグの位置を検出し、＜／ｂｏｄｙ＞タグの後にメッセージ識別データを出力してもよい。この場合、図１０のメッセージ識別データおよび図１１の実行フローメッセージは、それぞれ＜／ｂｏｄｙ＞タグと＜／ｈｔｍｌ＞タグの間に出力されることになる。この変形例によれば、実行フローメッセージ（メッセージ識別データ）の出力により、実行フローメッセージの出力先文書の構造を破壊してしまうことを確実に回避できる。
【００６８】
また、試験実行部６４は、ウェブブラウザ等の所定のウェブクライアントからＨＴＴＰリクエストを受け付けて試験用プログラムを実行し、その結果を示すＨＴＭＬ文書を含むＨＴＴＰレスポンスをウェブクライアントへ送信してもよい。この場合、メッセージ出力部は、上記ＨＴＴＰレスポンスのレスポンスヘッダ内に所定のヘッダを設け、その値としてメッセージ識別データを設定してもよい。ウェブクライアントは、レスポンスヘッダにおいて上記所定のヘッダを検出した場合、その値であるメッセージ識別データを所定のログファイルに出力してもよい。また、ウェブクライアントは実行フロー表示部３４と連携し、メッセージ識別データを実行フローメッセージに変換させた上で、その実行フローメッセージをログ出力してもよく、画面表示させてもよい。なお、メッセージ出力部は、ＨＴＴＰレスポンスのレスポンスボディ内に、ＨＴＭＬ文書のデータとは別個にメッセージ識別データを設定してもよい。ウェブクライアントの動作は、レスポンスヘッダ内にメッセージ識別データが設定される場合と同様である。
【００６９】
（第２実施形態）
まず第２実施形態の概要を説明する。企業におけるウェブアプリケーション（以下、「ウェブＡＰ」とも呼ぶ。）の開発工程では、ウェブＡＰのソースコードを作成したプログラマは、自身で作成したウェブＡＰをローカル端末内のウェブサーバへデプロイして単体試験を行うことがある。その際に、プログラマは単体試験のための試験電文（以下、「ＵＴ用試験電文」とも呼ぶ。）をウェブサーバへ送信することで、ウェブＡＰの機能を呼び出してデバッグ作業を行う。例えば、ウェブＡＰの機能を呼び出すためのＵＲＬをウェブブラウザへ入力することで、ウェブブラウザからウェブサーバへＨＴＴＰリクエストが送信され、ウェブサーバにおいてウェブＡＰが実行される。
【００７０】
ウェブＡＰの結合試験工程では、試験サーバ内のウェブサーバへデプロイされたウェブＡＰに対して、試験担当者がペネトレーションテストを行うことがある。その際、試験担当者は、ペネトレーションテストのための試験電文（以下、「ＩＴ用試験電文」とも呼ぶ。）、例えばウェブＡＰの脆弱性を確認するための入力変数値（引数）が設定された試験電文を一から作成する必要があり、試験コストの増大要因となっていた。
【００７１】
本発明者は、ウェブＡＰに対する試験電文には、ウェブサーバのアドレス等の試験環境に応じて変化するフィールド（以下、「環境依存フィールド」）と、試験環境には非依存であるもののウェブＡＰの構成に応じて変化するフィールド（以下、「ＡＰ依存フィールド」）とが存在することに着目した。例えば、ＵＴ用試験電文のＵＲＬが「http://localhost:8080/test/login.php?user=user1&pass=pass1」である場合、「http://localhost:8080/test/」の部分は環境依存フィールドであり、「login.php?user=user1&pass=pass1」の部分はＡＰ依存フィールドとなる。そして、ＵＴ用試験電文に基づいてＩＴ用試験電文を自動設定する仕組みに想到した。
【００７２】
具体的には、試験支援装置において、ＵＴ用試験電文における環境依存フィールドとＡＰ依存フィールドとを識別する。そして、環境依存フィールドには試験サーバの環境情報を設定する一方で、ＡＰ依存フィールドにはペネトレーションテスト用の予め定められたパラメータ値（以下、「ＩＴ用パラメータ値」とも呼ぶ）を設定する。これにより、ＵＴ用試験電文からＩＴ用試験電文の自動生成を実現でき、試験担当者の負担を低減できる。言い換えれば、ウェブＡＰに対する効率的な試験を実現し、試験コストを低減させることができる。以下、第２実施形態の構成を説明する。
【００７３】
図１４は、第２実施形態の企業システムの構成を示す。企業システム１０００は、顧客にサービスを提供するためのアプリケーションの開発から運用の間に介在する複数の情報処理装置を含む。これらの情報処理装置は、ＬＡＮ・ＷＡＮ・インターネット等、公知の通信手段を介して接続される。
【００７４】
開発用ＰＣ２００で総称される開発用ＰＣ２００ａ、開発用ＰＣ２００ｂ、開発用ＰＣ２００ｃは、ウェブＡＰのソースコードを作成する複数のプログラマのそれぞれにより操作されるＰＣ端末である。ウェブＡＰに対するプログラマによる単体試験のために、開発用ＰＣ２００のそれぞれにはウェブアプリケーションサーバソフトウェア（以下、「ウェブＡＰサーバ」と呼ぶ。）がインストールされている。また開発用ＰＣ２００には、ウェブＡＰの単体試験においてローカルのウェブＡＰサーバへ送信されたＵＴ用試験電文を随時取得し、試験支援装置３００へ通知するキャプチャツールがインストールされている。
【００７５】
ＳＣＭ（Source Code Management）装置２０２は、開発用ＰＣ２００のそれぞれにおいて作成されたウェブＡＰのソースファイルについて、その変更履歴を所定のリポジトリにより一元管理する。言い換えれば、バージョン管理装置でもある。例えば、開発用ＰＣ２００からのソースファイルのチェックインや、開発用ＰＣ２００へのソースファイルのチェックアウトを制御する。試験サーバ２０４は、ウェブＡＰサーバがインストールされており、ウェブＡＰに対するペネトレーションテストの試験環境を提供する。運用サーバ２０６は、ウェブＡＰサーバがインストールされており、インターネットを介して、ウェブＡＰによるサービスを顧客ＰＣ２０８へ提供する。
【００７６】
試験支援装置３００は、ウェブＡＰに対するペネトレーションテストの実施を支援する情報処理装置である。試験支援装置３００は、試験電文設定部３０２と、試験電文保持部３０４と、実行フロー可視化部３０６とを備える。
【００７７】
試験電文設定部３０２は、ＳＣＭ装置２０２から取得したウェブＡＰのソースコードと、開発用ＰＣ２００から取得したＵＴ用試験電文とに基づいて、ＩＴ用試験電文を自動設定する。試験電文設定部３０２の詳細な構成は後述する。試験電文保持部３０４は、試験電文設定部３０２により設定されたＩＴ用試験電文が格納される記憶領域である。実行フロー可視化部３０６は、試験電文保持部３０４に格納されたＩＴ用試験電文を使用してウェブＡＰに対するペネトレーションテストを実行する。その際に、ウェブＡＰの実行フローを可視化するために、第１実施形態の技術によりウェブＡＰのソースコードを改変する。実行フロー可視化部３０６は、図１に記載した各種機能ブロックを含む。
【００７８】
図１５は、図１４の試験電文設定部３０２の詳細構成を示すブロック図である。試験電文設定部３０２は、各種データを保持するための記憶領域である記憶部３１０と、各種データ処理を実行するデータ処理部３２０とを備える。記憶部３１０は、環境情報保持部３１２と、パラメータ保持部３１４とを含む。データ処理部３２０は、ソースコード取得部３２２と、ソースコード解析部３２４と、ＵＴ用試験電文取得部３２６と、試験電文解析部３２８と、ＩＴ用試験電文設定部３３０とを含む。
【００７９】
環境情報保持部３１２は、ペネトレーションテストの試験環境に関する情報を保持する。この情報には、試験サーバ２０４のウェブＡＰサーバにデプロイされたウェブＡＰへアクセスするためのウェブＡＰサーバの設定値が含まれる。第２実施形態の環境情報保持部３１２は、試験サーバ２０４のＩＰアドレス「192.168.1.100」と、試験サーバ２０４におけるウェブＡＰサーバのポート番号「3000」と、ウェブＡＰにアクセスするためのディレクトリパス「/it/」を対応づけて保持する。
【００８０】
パラメータ保持部３１４は、ペネトレーションテストのためにＩＴ用試験電文に設定すべきＩＴ用パラメータ値を保持する。このパラメータ値は、ウェブＡＰの脆弱性を検出するためのデータ列であり、既知のセキュリティ脅威に対するウェブＡＰの動作を確認するための文字列であってもよい。例えば、ウェブＡＰに対してクロスサイトスクリプティングやＳＱＬインジェクションを試行するための不正な入力データであってもよい。後者の例として、ユーザＩＤ等のログイン情報が不正であっても、そのログイン情報を正しいと判定させるように構成された文字列であってもよい。
【００８１】
ソースコード取得部３２２は、ＳＣＭ装置２０２を定期的に監視し、ＳＣＭ装置２０２に対してチェックインされたソースファイルをＳＣＭ装置２０２から取得する。ソースコード解析部３２４は、ソースコード取得部３２２により取得されたソースファイルに記述されたウェブＡＰについて、その機能（ウェブＡＰの関数）を呼び出すための要素（以下、「コール要素」とも呼ぶ。）をソースコードから抽出する。例えば、ソースコードの記述言語がＰＨＰである場合、ソースコード解析部３２４は、ＰＨＰソースファイル名をアプリケーション名として抽出し、ＧＥＴメソッドやＰＯＳＴメソッドの引数を参照するための所定文字列を検出して入力変数名を抽出する。以下具体例を示す。
【００８２】
図１６（ａ）および図１６（ｂ）は、ソースファイルの一例を示す。図１６（ａ）は、ファイル名が「login.php」であり、コード行４００においてＧＥＴメソッドの引数「user」と「pass」とを参照している。図１６（ｂ）は、ファイル名が「rcvform.php」であり、コード行４０２においてＰＯＳＴメソッドの引数「text1」を参照している。
【００８３】
図１７は、ソースファイルから抽出されたコール要素の例を示す。同図のＩＤはソースファイルを一意に特定する識別情報であり、ＩＤ「001」は図１６（ａ）のソースファイル、ＩＤ「002」は図１６（ｂ）のソースファイルに対応する。ソースコード解析部３２４は、図１６（ａ）のソースファイルについて、そのファイル名をアプリケーション名として抽出し、キーワード「$_GET」の直後に設定された文字列「user」および「pass」を入力変数名として抽出する。同様に図１６（ｂ）のソースファイルについて、そのファイル名をアプリケーション名として抽出し、キーワード「$_POST」の直後に設定された文字列「text1」を入力変数名として抽出する。
【００８４】
なお、キーワード「$_GET」や「$_POST」の直後には変数（例えば「$param」）が指定され、その変数が示す内容（例えば上記文字列「user」等）は同じソースファイルの別の場所や、「require」および「include」により参照される別のソースファイルで別途指定される場合がある。そのため、ソースコード解析部３２４は、キーワードの直後が変数であった場合、その中身を特定するためのエイリアス解析を実行する。このエイリアス解析は、Ｃ言語で記述されたソースコードにおけるポインタ解析と同様の処理である。具体的には、キーワード直後の変数（「ターゲット変数」とも呼ぶ。）に対する代入文、および、ターゲット変数に代入された別の変数に対する代入文を、ソースファイル内および参照する別ソースファイル内で順次検索し、最終的にターゲット変数が示すスカラー値（例えば「$」指定のない文字列等の定数値・リテラル値）を入力変数名として特定してもよい。
【００８５】
また、ソースコードの記述言語がＲｕｂｙｏｎＲａｉｌｓである場合、ソースコード解析部３２４は、コントローラ名、アクション名、入力変数名をソースコードから抽出する。例えば、「class」や「ApplicationController」等のキーワードによりコントローラ名の設定フィールドを特定してコントローラ名を取得してもよい。また「def」等のキーワードによりアクション名および入力変数名の設定フィールドを特定して、それぞれのコール要素を抽出してもよい。図１７のＩＤ「003」のレコードは、ＲｕｂｙＯｎＲａｉｌｓのソースコードから抽出されたコール要素を示している。
【００８６】
図１５に戻り、ＵＴ用試験電文取得部３２６は、開発用ＰＣ２００においてウェブＡＰに対して発行されたＵＴ用試験電文を開発用ＰＣ２００から取得する。図１８（ａ）および図１８（ｂ）は、ＵＴ用試験電文の例を示す。なお、ＵＴ用試験電文はＵＲＬ形式で取得されてもよい。例えば、図１８（ａ）に対応するＵＲＬは、「http://localhost:8080/ut/001/login.php?user=user1&pass=pass1」となり、図１８（ｂ）に対応するＵＲＬは、「http://localhost:8080/rcvform.php」となる。ＵＴ用試験電文取得部３２６は、リクエストボディが存在する場合（ＰＯＳＴの場合）、リクエストボディの内容も取得する。
【００８７】
試験電文解析部３２８は、ソースコード解析部３２４により抽出されたウェブＡＰのコール要素と、そのコール要素が設定されたＵＴ用試験電文とを対応づける。例えば、図１８（ａ）のＵＴ用試験電文には図１７のＩＤ「001」のコール要素が設定されているため、これらを対応づける。同様に、図１８（ｂ）のＵＴ用試験電文と、図１７のＩＤ「002」のコール要素とを対応づける。
【００８８】
試験電文解析部３２８は、コール要素のアプリケーション名（またはコントローラ名＋アクション名）にしたがって、ＵＴ用試験電文における環境依存フィールドとＡＰ依存フィールドとを特定する。具体的には、ＵＴ用試験電文においてアプリケーション名の前までのデータフィールドを環境依存フィールドとして特定し、アプリケーション名以降のデータフィールドをＡＰ依存フィールドとして特定する。
【００８９】
例えば、図１８の（ａ）のＵＴ用試験電文については、スキーマ・ホスト名・ポート番号・ディレクトリパスのうち「/ut/001/」を環境依存フィールドとして特定する。ＵＲＬ形式の場合は「http://localhost:8080/ut/001/」を環境依存フィールドとして特定する。その一方で、ディレクトリパスのうち「login.php」・クエリ文字列をＡＰ依存フィールドとして特定する。ＵＲＬ形式の場合は「login.php?user=user1&pass=pass1」をＡＰ依存フィールドとして特定する。
【００９０】
また図１８の（ｂ）のＵＴ用試験電文については、スキーマ・ホスト名・ポート番号・ディレクトリパスのうち「/」を環境依存フィールドとして特定する。ＵＲＬ形式の場合は「http://localhost:8080/」を環境依存フィールドとして特定する。その一方で、ディレクトリパスのうち「rcvform.php」・コンテンツ長・リクエストボディをＡＰ依存フィールドとして特定する。
【００９１】
ＩＴ用試験電文設定部３３０は、ＵＴ用試験電文の環境依存フィールドとＡＰ依存フィールドとのそれぞれを変換することにより、ＵＴ用試験電文からＩＴ用試験電文を生成する。具体的には、ＵＴ用試験電文の環境依存フィールドに対して、環境情報保持部３１２に保持された試験環境を示す情報を設定する。それとともに、ＡＰ依存フィールドのクエリ文字列もしくはリクエストボディに設定された入力変数の値として、パラメータ保持部３１４に保持されたＩＴ用パラメータ値を設定する。ＩＴ用試験電文設定部３３０は、作成したＩＴ用試験電文のデータを試験電文保持部３０４へ格納する。
【００９２】
図１９（ａ）および図１９（ｂ）は、ＩＴ用試験電文の例を示す。図１９（ａ）のＩＴ用試験電文は図１８（ａ）のＵＴ用試験電文が改変されたものであり、図１９（ｂ）のＩＴ用試験電文は図１８（ｂ）のＵＴ用試験電文が改変されたものである。それぞれのホスト名・ポート番号・ディレクトリパスには、試験サーバ２０４の環境情報が設定されている。また、図１９（ａ）のクエリ文字列および図１９（ｂ）のリクエストボディには、ペネトレーションテスト用の文字列、例えばＳＱＬインジェクションに対する脆弱性を検出するための文字列が設定される。図１９（ｂ）のコンテンツ長欄には、リクエストボディの新たなデータ長が設定される。なお図１９（ａ）のＩＴ用試験電文について、ＵＲＬ形式で作成する場合は、「http://192.168.1.100:3000/it/login.php?user=任意の文字列' OR 1=1--&pass=任意の文字列」を設定する。クエリ文字列として、実際には、ＵＲＬエンコードした結果の文字列を設定してもよいことはもちろんである。
【００９３】
ＩＴ用試験電文設定部３３０は、ソースコードから抽出されたコール要素のうち、対応するＵＴ用試験電文が検出されないコール要素が存在する場合、そのコール要素を設定したＩＴ用試験電文をさらに作成して試験電文保持部３０４へ格納する。この場合、試験サーバ２０４の環境情報が設定された環境依存フィールドと、アプリケーション名（コントローラ名およびアクション名）と、ＩＴ用パラメータ値が設定された入力変数とが連結されることにより、ＩＴ用試験電文が作成されればよい。図１９（ｃ）もＩＴ用試験電文の例を示す。同図は、対応するＵＴ用試験電文が検出されない場合に、図１７のＩＤ「003」のコール要素が設定されたＩＴ用試験電文を示している。
【００９４】
以上の構成による動作を以下説明する。
図２０は、第２実施形態の試験支援装置３００の動作を示すフローチャートである。ウェブＡＰのプログラマは、開発用ＰＣ２００においてウェブＡＰのソースコードを作成して、ウェブＡＰの単体試験を実施する。そして、単体試験が完了したウェブＡＰのソースコードをＳＣＭ装置２０２へチェックインする。試験支援装置３００のＵＴ用試験電文取得部３２６は、開発用ＰＣ２００においてウェブＡＰの単体試験が実行された際（Ｓ１００のＹ）、その単体試験で使用されたＵＴ用試験電文を取得して所定の記憶領域に格納する（Ｓ１０２）。開発用ＰＣ２００においてウェブＡＰの単体試験が未実行であれば（Ｓ１００のＮ）、Ｓ１０２はスキップされる。
【００９５】
ウェブＡＰのソースコードが更新された場合、第２実施形態ではＳＣＭ装置２０２へ新たなソースコードがチェックインされた際（Ｓ１０４のＹ）、試験支援装置３００のソースコード取得部３２２は、その新たなソースコードを取得する（Ｓ１０６）。ソースコード解析部３２４は、ウェブＡＰのソースコードからウェブＡＰの機能（関数）を呼び出すためのコール要素（関数名や引数名）を抽出して所定の記憶領域に格納する（Ｓ１０８）。ウェブＡＰのソースコードが更新されなければ（Ｓ１０４のＮ）、Ｓ１０６およびＳ１０８はスキップされる。
【００９６】
試験支援装置３００の試験電文解析部３２８は、ＩＴ用試験電文を作成すべき所定のトリガを検出すると（Ｓ１１０のＹ）、所定の記憶領域に格納されたＵＴ用試験電文と、ウェブＡＰのコール要素とを対応づける（Ｓ１１２）。このトリガは、ユーザからＩＴ用試験電文の作成指示を受け付けたことでもよく、所定の日時への到達を検出したことでもよい。試験電文解析部３２８は、コール要素の名称に基づき、ＵＴ用試験電文における環境依存フィールドとＡＰ依存フィールドとを特定する（Ｓ１１４）。
【００９７】
ＩＴ用試験電文設定部３３０は、ペネトレーションテストの試験環境を示す予め定められた情報を、ＵＴ用試験電文における環境依存フィールドへ設定する。それとともに、ペネトレーションテスト用に予め定められたパラメータ値を、ＵＴ用試験電文におけるＡＰ依存フィールドへ設定することにより、ＵＴ用試験電文からＩＴ用試験電文を生成する（Ｓ１１６）。Ｓ１１２からＳ１１６の処理はＵＴ用試験電文ごとに繰り返し実行される。ＵＴ用試験電文と未対応のコール要素が残存する場合（Ｓ１１８のＹ）、ＩＴ用試験電文設定部３３０はそのコール要素に応じたＩＴ用試験電文をさらに設定する（Ｓ１２０）。これにより、全てのコール要素に応じたＩＴ用試験電文が設定される。ＩＴ用試験電文設定部３３０は、生成したＩＴ用試験電文を試験電文保持部３０４へ格納する。ＵＴ用試験電文と未対応のコール要素がなければ（Ｓ１１８のＮ）、Ｓ１２０はスキップされる。ＩＴ用試験電文の作成トリガが未検出であれば（Ｓ１１０のＮ）、Ｓ１１２以降はスキップされて本図のフローを終了する。
【００９８】
試験支援装置３００の実行フロー可視化部３０６における原本プログラム取得部５２は、試験電文設定部３０２のソースコード取得部３２２と同様に、ウェブＡＰのソースコードを原本プログラムとして取得する。以降、第１実施形態に記載の方法により、ペネトレーションテストにおける実行フローを可視化するための試験用プログラムが設定される。試験用プログラム取得部６２は、その試験用プログラムを試験サーバ２０４へデプロイする。試験実行部６４は、試験電文保持部３０４に格納されたＩＴ用試験電文を使用して、試験用プログラムに対するペネトレーションテストを実行する。例えば、ＩＴ用試験電文からペネトレーションテストのためのＨＴＴＰリクエストを設定し、そのデータを試験サーバ２０４のウェブＡＰサーバへ送信する。これにより、ウェブＡＰのペネトレーションテストにおける実行フローを示すメッセージを所定のログファイルへ出力させる。試験支援装置３００は、ペネトレーションテストが完了したウェブＡＰのプログラム、典型的にはペネトレーションテストで問題がなかった（もしくはバグが修正された）プログラムを運用サーバ２０６へデプロイすることにより実運用を開始させる。
【００９９】
第２実施形態の試験支援装置３００によれば、試験サーバ２０４において実施されるべきウェブＡＰの結合試験（実施の形態ではペネトレーションテスト）用の試験電文を、プログラマ個別の開発用ＰＣ２００におけるウェブＡＰの単体試験で用いられた試験電文に基づいて自動設定できる。これにより、ペネトレーションテストのための試験電文を一から作成することが不要になる。また、開発用ＰＣ２００におけるウェブＡＰの単体試験後、そのウェブＡＰが運用サーバ２０６へデプロイされるまでが全自動化される。このように試験支援装置３００によれば、アプリケーションに対する効率的な試験を実現し、その試験に要する時間や人件費等のコストを低減できる。
【０１００】
また一般的に、結合試験はウェブＡＰの仕様に基づくブラックボックステストである一方で、単体試験はソースコードの記述内容に基づくホワイトボックステストである。ペネトレーションテストは、ウェブＡＰの脆弱性を検出するためのものであるため可及的に細粒度の試験が実施されることが望ましい。試験支援装置３００によれば、ＩＴ用試験電文はＵＴ用試験電文の粒度で作成されるため、ウェブＡＰの脆弱性の検出精度を高めることができる。
【０１０１】
また、試験支援装置３００によれば、ＵＴ用試験電文に対応しないウェブＡＰのコール要素が存在する場合、そのコール要素を設定したＩＴ用試験電文が追加的に作成される。単体試験で用いられたＵＴ用試験電文はソースコードに実装されたコール要素の部分集合であり、単体試験が未実施のコール要素に対応する機能には脆弱性が潜む可能性がある。試験支援装置３００によれば、単体試験が未実施であっても、ソースコードから検出された全コール要素に対してＩＴ用試験電文が設定されるため、ペネトレーションテストの網羅性を向上させ、またウェブＡＰにおける脆弱性を漏れなく検出できる。
【０１０２】
以上、本発明を第２の実施の形態をもとに説明した。この実施の形態は例示であり、それらの各構成要素や各処理プロセスの組合せにいろいろな変形例が可能なこと、またそうした変形例も本発明の範囲にあることは当業者に理解されるところである。
【０１０３】
上記第２実施形態では、試験支援装置３００の実行フロー可視化部３０６は、試験サーバ２０４におけるペネトレーションテスト時の実行フローを可視化させるための処理を実行することとした。変形例では、実行フロー可視化部３０６は、開発用ＰＣ２００におけるウェブＡＰの単体試験の際に、そのウェブＡＰのソースコードを改変することにより、ＵＴ用試験電文を用いた単体試験におけるウェブＡＰの実行フローを可視化させてもよい。具体的には、実行フロー可視化部３０６の改変部５０は、単体試験を実行する旨の通知をソースコードとともに開発用ＰＣ２００から受け付け、改変後の試験用プログラムを開発用ＰＣ２００へ提供してもよい。これにより、単体試験の結果が出力されるログファイルに、ウェブＡＰの実行フローを示すメッセージを出力させてもよい。
【０１０４】
この変形例によれば、ウェブＡＰのコール要素とＵＴ用試験電文との対応づけが困難となる問題を解決できる。例えば、開発用ＰＣ２００のウェブＡＰサーバにおいてデフォルトのディレクトリパスが自動設定される場合や、ディレクトリパスのエイリアスが設定される場合、ＵＴ用試験電文（ＵＲＬ）にコール要素が明示されず、両者の対応づけが困難な場合がある。この変形例によれば、単体試験におけるウェブＡＰの実行フローが可視化されることで、ＵＴ用試験電文により呼び出されたウェブＡＰのコール要素（アプリケーション名やアクション名、入力変数名）が把握容易になり、ウェブＡＰのコール要素とＵＴ用試験電文との対応づけを容易化できる。
【０１０５】
また、試験電文設定部３０２の試験電文解析部３２８は、ログファイルに出力された実行フローメッセージを参照して、ＵＴ用試験電文により呼び出されたウェブＡＰのコール要素を特定してもよい。例えば、実行フローメッセージの行番号により特定されるソースコードのコード行に記述されたアプリケーション名や入力変数名をコール要素として特定してもよい。試験電文解析部３２８は、そのコール要素を、ソースコード解析部３２４により抽出されたウェブＡＰのコール要素と照合してもよい。すなわち、ソースコード解析部３２４により抽出されたウェブＡＰのコール要素のうち、ＵＴ用試験電文により呼び出されたウェブＡＰのコール要素と合致するものを、そのＵＴ用試験電文と対応づけてもよい。
【０１０６】
また、実行フロー可視化部３０６の試験部６０は、変更検出部３４０と試験電文選択部３４２とをさらに備えてもよい。図２１は、変形例における試験部６０の機能ブロックを示すブロック図である。変更検出部３４０は、ＳＣＭ装置２０２に対して新たにチェックインされたソースコード（更新されたソースコード）に関する情報をＳＣＭ装置２０２から取得する。試験電文選択部３４２は、更新されたソースコードに対応するウェブＡＰの単体試験における実行フローを参照して、ＵＴ用試験電文により呼び出されたウェブＡＰのコール要素を試験対象のコール要素として特定する。試験電文選択部３４２は、試験電文保持部３０４に格納されたＩＴ用試験電文のうち、試験対象のコール要素に対応する試験電文を、ソースコードの変更に伴うペネトレーションテストで使用すべきＩＴ用試験電文として選択する。試験対象のコール要素に対応する試験電文は、言い換えれば試験対象のコール要素に基づき設定された試験電文であり、さらに言い換えれば試験対象のコール要素が設定された試験電文である。
【０１０７】
試験実行部６４は、試験電文選択部３４２により選択されたＩＴ用試験電文を用いてウェブＡＰの更新に伴うペネトレーションテストを実行する。この変形例によれば、ソースコードの変更に伴うペネトレーションテストにおいて使用すべきＩＴ用試験電文が自動で選択され、効率的な試験を実現できる。また、ウェブＡＰの実行フローが特定されることにより、ソースコードの一部の変更であっても、その変更箇所から呼び出される一連のコール要素が特定される。すなわちソースコードの変更が影響を与えうるコール要素が特定されて、それらのコール要素に対応するＩＴ用試験電文を用いたペネトレーションテストが実施される。これにより、ソースコードの変更に伴い実施すべきリグレッションテストを漏れなく実行できる。また、ソースコード変更の影響を受けないコール要素、言い換えれば、再度のペネトレーションテストが不要なコール要素に関するＩＴ用試験電文は選択されないため、ソースコードの変更に伴う試験コストを低減できる。
【０１０８】
上記第２実施形態では、試験電文設定部３０２のＵＴ用試験電文取得部３２６は、ＵＴ用試験電文を開発用ＰＣ２００から直接取得することとした。変形例では、開発用ＰＣ２００における単体試験では、所定のプロキシサーバを経由してＵＴ用試験電文をウェブＡＰへ送信することとしてもよい。この場合、ＵＴ用試験電文取得部３２６はその所定のプロキシサーバからＵＴ用試験電文を取得してもよい。
【０１０９】
上記第２実施形態では特に言及していないが、開発用ＰＣ２００とＳＣＭ装置２０２と試験サーバ２０４と運用サーバ２０６はユーザ企業側に設置され、試験支援装置３００はサービスプロバイダ側に設置されてもよい。この場合、試験支援装置３００は、インターネット等の通信網を介してソースコードおよびＵＴ用試験電文を収集してＩＴ用試験電文を設定し、通信網を介してＩＴ用試験電文を用いたペネトレーションテストを実行してもよい。すなわち、ウェブＡＰに対するＩＴ用試験電文の自動作成サービスや、ペネトレーションテスト自動化のサービスを、ＡＳＰ・ＳａａＳの形態で提供してもよい。
【０１１０】
上述した実施の形態および変形例の任意の組み合わせもまた本発明の実施の形態として有用である。組み合わせによって生じる新たな実施の形態は、組み合わされる実施の形態および変形例それぞれの効果をあわせもつ。
【０１１１】
請求項に記載の各構成要件が果たすべき機能は、実施の形態および変形例において示された各構成要素の単体もしくはそれらの連携によって実現されることも当業者には理解されるところである。
【符号の説明】
【０１１２】
１２  原本プログラム保持部、  １４  ノード定義保持部、  １６  ロギング命令保持部、  １８  試験用プログラム保持部、  ２０  入力データ保持部、  ２２  出力データ保持部、  ３４  実行フロー表示部、  ３６  網羅状況表示部、  ５２  原本プログラム取得部、  ５４  構文木生成部、  ５６  構文木改変部、  ５８  試験用プログラム出力部、  ６２  試験用プログラム取得部、  ６４  試験実行部、  ６６  網羅状況特定部、  １００  試験支援装置、  ２００  開発用ＰＣ、  ２０２  ＳＣＭ装置、  ２０４  試験サーバ、  ２０６  運用サーバ、  ３００  試験支援装置、  ３０２  試験電文設定部、  ３０４  試験電文保持部、  ３０６  実行フロー可視化部、  ３２２  ソースコード取得部、  ３２４  ソースコード解析部、  ３２６  ＵＴ用試験電文取得部、  ３２８  試験電文解析部、  ３３０  ＩＴ用試験電文設定部、  ３４０  変更検出部、  ３４２  試験電文選択部、１０００  企業システム。
【図１】
2010267266.tif 000003
【図２】
2010267266.tif 000004
【図３（ａ）】
2010267266.tif 000005
【図３（ｂ）】
2010267266.tif 000006
【図４】
2010267266.tif 000007
【図５（ａ）】
2010267266.tif 000008
【図５（ｂ）】
2010267266.tif 000009
【図６（ａ）】
2010267266.tif 000010
【図６（ｂ）】
2010267266.tif 000011
【図７（ａ）】
2010267266.tif 000012
【図７（ｂ）】
2010267266.tif 000013
【図８（ａ）】
2010267266.tif 000014
【図８（ｂ）】
2010267266.tif 000015
【図９】
2010267266.tif 000016
【図１０】
2010267266.tif 000017
【図１１】
2010267266.tif 000018
【図１２】
2010267266.tif 000019
【図１３】
2010267266.tif 000020
【図１４】
2010267266.tif 000021
【図１５】
2010267266.tif 000022
【図１６（ａ）】
2010267266.tif 000023
【図１６（ｂ）】
2010267266.tif 000024
【図１７】
2010267266.tif 000025
【図１８（ａ）】
2010267266.tif 000026
【図１８（ｂ）】
2010267266.tif 000027
【図１９（ａ）】
2010267266.tif 000028
【図１９（ｂ）】
2010267266.tif 000029
【図１９（ｃ）】
2010267266.tif 000030
【図２０】
2010267266.tif 000031
【図２１】
2010267266.tif 000032