近年ではインターネットやWorld-Wide Web (Web)の隆盛に伴い、多くのサーバ側アプリケーションがさまざまな用途で広く利用されている。係るアプリケーションの動作に支障が起きないこと、さらには悪意者が異常な入力を行うことで意図的にアプリケーションを誤動作させるような攻撃を防ぐことは重要であり、そのために開発段階や導入・運用段階において動作確認テスト(試験・検査)が行われる。
アプリケーションの動作確認テストの一手段として、ブラックボックステストが知られている。ブラックボックステストとは、対象アプリケーションに対し、アプリケーション内部の構造とは無関係に外部から関与して観測できる情報だけをもとに判断するテストである。ブラックボックステストでは、対象アプリケーション内部でどのような処理が行われているかは一切問題とされない。つまり、外部から適当な入力を与え、それに対する出力が所定の条件を満たしているかを判定することにより、入力に対する出力が、期待されたものであるか否かを判定する。したがって、ブラックボックステストにおけるテストルールは、アプリケーションに与える入力(テスト入力パターン)と、当該入力に対する出力が満たすべき条件(テスト出力判定条件)を含む。
ここで、図12に基づき、従来行われているWebアプリケーション向けブラックボックステストに用いるテストルールセット(テストルールの集合)の具体例について説明する。各テストルールはテストルール識別子(名前)、前記テスト入力パターン、および、前記テスト出力判定条件を有する。この例では、「Name」ラベルが付された行にはテストルール識別子を記述する。「Send」ラベルが付された行には前記テスト入力パターンを記述する。テスト入力パターンは、後述するテストリクエストの変数に格納される値に相当する文字列である。「Test」ラベルが付された行には前記テスト出力判定条件である条件式を記述する。テスト出力判定条件は'='で左辺と右辺に分けることができる。左辺は、判定種別であり、「OK」または「NG」の値をとる。一方、右辺は、テストの合否を決めるための判定パターンを指定する。左辺の判定種別が「OK」であるテスト出力判定条件は、右辺の判定パターンにマッチしたときにテスト結果が合格(OK)となり、マッチしないときはテスト結果は不合格(NG)となる。反対に、左辺の判定種別が「NG」であるテスト出力判定条件は、右辺の判定パターンにマッチしたときに不合格(NG)となり、マッチしなかったときは合格(OK)となる。ここではパターンを、プログラミング言語Perlの正規表現指定の書式で記述しているが、ワイルドカード文字列等を用いて記述してもよい。
例として、図12における、テストルール「zip-search」について説明する。このテストルールは、郵便番号検索アプリケーションに対して動作テストを行うためのテストルールの一例を表現したものである。テスト入力パターン「100-0014」を郵便番号検索アプリケーションに入力したとき、郵便番号検索アプリケーションの出力に「永田町」の文字列が含まれていれば(判定種別が「OK」のため)、テストは合格となる。反対に、含まれていなければ、テストは不合格となる。また、アプリケーションのセキュリティ対策をチェックするためのセキュリティテストを行うこともできる。例えば、テストルール「script-tag」は、テスト入力パターンにHTMLのscriptタグを混入させ、その出力に当該scriptタグがそのまま含まれていた場合に不合格とするテストルールである。これはサーバ側でHTMLタグのサニタイジング(無害化)が為されていないことを意味しており、クロスサイト・スクリプティング攻撃への耐性をテストするものである。同様に、テストルール「javascript(登録商標)-url」もセキュリティ対策をテストするものであり、JavaScript(登録商標)のサニタイジング対策をテストするためのテストルールの例である。
ブラックボックステストの一般的な説明に戻る。ブラックボックステストを実施する場合、得られたテスト出力に対してテスト出力判定条件を適用するときに誤検出(誤判定)が起きることがある。こうした誤検出はルールの記述を誤ったために発生する。特に、テスト出力判定条件に複雑な正規表現を使う場合等において、頻繁に発生しうる。このようなルール記述の誤りを発見するには、実際にそのルールを使ってテストを行い、意図した検出がされ(検出漏れがないこと)、意図しない検出がされない(過剰検出しないこと)ことを確認するのが有効である。これはいわば、「テストルールのテスト」である。本稿では、このようなテストルールのテストのことを「テストルール動作確認」(または、文脈上自明である場合には単に「動作確認」)と呼ぶこととする。
テストルール動作確認を行うには、単純には実際のテスト対象のアプリケーションに対してテストを実施することも考えられるが、これは望ましくない。テスト対象である、つまり動作確認のされていないアプリケーションを、それをテストするためのテストルールの確認に使っても、テストルールの妥当性を担保できないという論理的不整合の問題があるためである。また、労力の問題もある。すなわち、アプリケーションを実際に動かすためには、動作環境の整備が必要であり、それには多大な工数が必要な場合がある。
一般的に、テストルールの動作確認を行う場合には、実際のアプリケーションの代わりに、モックアップアプリケーション(以下モックアップと略す)が用いられる。モックアップとは、本来のテスト対象のアプリケーションを模倣する動作をするアプリケーションである。ただし、アプリケーションの内部の処理まで模倣はせず、入出力だけが模倣される。テストルール動作確認を行うには、モックアップに対し、確認したいテストルールを用いてテストを実施する。その結果を吟味することで、正しく検出できたこと(検出漏れがないこと)、および検出すべきでないものを正しく見逃したこと(過剰検出しないこと)を確認できる。
一方、アプリケーションは一般に多くの機能から成り立っており、ブラックボックステストはそれら各機能に対して一括して行われるのが普通である。あるいは、複数のアプリケーションからなるシステムに対してブラックボックステストが行われる場合もある。したがって、テストルール動作確認に用いるモックアップでは、複数の動作(機能)を模倣できることが望まれる。本稿では、このようなモックアップの個々の動作を「モックアップ要素」と呼ぶことにする。
ブラックボックステストに関連し、コンピュータにおいて複数の動作の模倣をおこなうエミュレータを構成し、その動作を外部から指定して切り替える発明がある(例えば、特許文献1参照)。
特開2006−85612号公報 図11は従来技術に係るテストルール動作確認システムの機能ブロック図である。クライアント100とサーバ200がネットワーク接続されており、クライアント100が「テストをする側」でありサーバ200が「テストをされる側」である。サーバ200では、テスト対象であるネットワークアプリケーションを模倣するモックアップ201が動作する。モックアップ201は、模倣する個々の動作に相当する前記モックアップ要素203を一つ以上と、モックアップ要素203をモックアップ要素識別子211に基づいて選択するモックアップ要素選択部202とを備える。
テストルールの動作確認を行うために、事前に、クライアント100にテストルールセット111及びリクエストテンプレート112を格納しておく。ここで、テストルールセット111は、従来技術の項で説明したもの(図12)を用いることができる。
図13に基づき、前記リクエストテンプレート112について説明する(なお、この段落においては、記号□を、クエスチョンマーク記号(ASCII文字コードの0x3f)に置き換えて読まれたい)。これは、テスト入力を含むHTTPリクエストであるテストリクエストに係るURLの雛形となる文字列データであり、例えば「http://www.example.com/test/mock.jsp(登録商標)□p1=」等である。ここで、'□'以下の文字列「p1=」が、Webアプリケーションへのパラメータに相当する。この例ではパラメータは1個であるが、複数個でもよい。テストリクエストとリクエストテンプレートとの違いは、パラメータに値が格納されているか否かである。すなわち、テストリクエストでは、パラメータに値が格納され、例えば「http://www.example.com/test/mock.jsp(登録商標)□p1=wx<script>yz」等となる。これに対し、リクエストテンプレート112は単なる雛形であり、パラメータに値は格納されない。
図11のテストルール動作確認システムの処理の概要は次の通りである。まずサーバ200側でモックアップ201に含まれるモックアップ要素203を切り替えるため、モックアップ要素識別子受付部204がモックアップ要素識別子211を受け付ける。次に、クライアント100のルール読込部101はテストルールセット111を読み込み、リクエスト生成部102が、別途読み込んだリクエストテンプレート112及び前記読み込んだテストルールセット111に含まれるテスト入力パターンとに基づいてテストリクエストを生成する。すなわち、リクエスト生成部102は、図13に示すように、リクエストテンプレート112のパラメータに対し、前述したテストルールセット111において定義されたテスト入力パターンを格納することで、テストリクエストを生成する。次に、クライアント100のメッセージ送受信部103とサーバ200のメッセージ送受信部205がテストリクエスト114を送受信する。サーバ200のモックアップ実行部206は、前記モックアップ201を実行する。サーバ200のモックアップが備えるモックアップ要素選択部202は、前記モックアップ要素識別子受付部204が受け付けたモックアップ識別子211に基づき、モックアップ要素203のうち1つを選択する。前記選択されたモックアップ要素203は、前記受信したテストリクエスト114に基づき、テストレスポンスであるHTMLページを生成する。サーバ200のメッセージ送受信部205とクライアント100のメッセージ送受信部103がテストレスポンス212を送受信する。クライアント100のレスポンス判定部104が、前記読み込んだテストルール中のテスト出力判定条件に基づいてテストレスポンスの合否を判定する。クライアント100の判定結果出力部105が前記判定結果113をテストルール動作確認の結果として出力する。
以下、本発明の実施の形態を図面を参照して説明する。
なお、以下の実施例では、テスト対象であるサーバ側アプリケーションがWebアプリケーションである場合を例として説明する。すなわち、WebサーバとWebクライアントが、アプリケーション層の通信プロトコルとしてHypetText Transfer Protocol(HTTP)を用いる例である。クライアントはサーバにHTTPリクエストを送信し、その応答としてサーバはクライアントにHTTPレスポンスを返す。以下では、HTTPリクエストとHTTPレスポンスを、それぞれ単にリクエスト、レスポンスと呼ぶ。
サーバ側アプリケーションがWebアプリケーションなので、モックアップは当該Webアプリケーションの動作を模倣するものとなるが、モックアップそのものもWebアプリケーションとして実現する。Webアプリケーションは通常はHTMLデータを出力するので、モックアップの出力もHTMLデータとなる。本実施形態では、モックアップの実装の基盤としてJava(登録商標)サーブレットコンテナを採用し、モックアップをJavaServer Pages(JSP)(登録商標)コードで記述する。モックアップの動作をJSP(登録商標)コード形式で記述したファイルを、Java(登録商標)サーブレットコンテナがコンパイルして実行することで、モックアップは実行される。
以下では、本発明の第1の実施形態を説明する。
まず、図1に、本発明の第1の実施形態に係るテストルール動作確認システムの機能ブロック図を示す。クライアント100とサーバ200がネットワークで接続されている。なお、それぞれの図において、対応する部分については同じ番号を付している。
まず、クライアント100について説明する。同図に示すクライアント100は、ルール読込部101、リクエスト生成部102、メッセージ送受信部103、レスポンス判定部104、判定結果出力部105、ルール送信部106、および、モックアップ要素識別子付加部107を備える。また、クライアント100は、データとして、テストルールセット111とリクエストテンプレート112とを格納する。リクエストテンプレート112は、従来技術のリクエストテンプレート(図13)と同じであるため、ここでは説明しない。
ルール読込部101は、テストルールセット111を読み込む。ルール送信部106は、読み込んだテストルールセット111をサーバ200に送信する。リクエスト生成部102は、読み込んだテストルールセット111に記述されたテスト入力パターンを、別途読み込んだリクエストテンプレート112に格納し、テストリクエスト114を生成する。モックアップ要素識別子付加部107は、前記読み込んだテストルールセット111に基づき、サーバ200で動作させるモックアップ要素203を指定するためのモックアップ要素識別子211を生成して、前記生成したテストリクエスト114に付加する。メッセージ送受信部103は、前記モックアップ要素識別子211が付加されたテストリクエスト114をサーバ200に送信するとともに、その応答であるテストレスポンス212をサーバ200から受信する。レスポンス判定部104は、前記受信したテストレスポンス212が、前記読み込んだテストルールセット111において前記テストリクエスト114に格納したテスト入力パターンに対応付けられたテスト出力判定条件を満たすか否かを判定する。判定結果出力部105は、前記レスポンス判定部104が判定した結果である判定結果113を出力装置などに出力する。
図2に、本発明の第1の実施形態に係るテストルールセット111の例を示す。これは、図12で示した従来のテストルールセット111に、モックアップの個々の動作をJSP(登録商標)コード形式で記述したデータである「モックアップ要素」を追加したものである。本稿では、このようなモックアップが有する個々の動作、あるいは当該個々の動作をJSP(登録商標)コード形式で記述したデータを「モックアップ要素」と呼ぶ。
図2において、先頭に「OK」ラベルまたは「NG」ラベルを付した行において、前記モックアップ要素を記述している。ここで「OK」と「NG」は、モックアップ要素に対して想定される出力判定の結果(想定判定結果)であり、テスト出力判定条件の合格(OK)と不合格(NG)とに対応している。すなわち、モックアップ要素の「OK」は、テスト出力判定が合格(OK)となるべきモックアップ要素を記述する。反対に、モックアップ要素の「NG」は、テスト出力判定が合格(NG)となるべきモックアップ要素を記述する。モックアップ要素は必要に応じて引数(図3の例では“p”)を用いても良く、これによりモックアップがリクエストに応じてレスポンス(HTMLページ)を動的に生成することも可能となる(HTMLページの動的な生成については後述する)。
次に、サーバ200について説明する。図1に示すサーバ200は、メッセージ送受信部205、モックアップ実行部206、ルール受信部207、および、モックアップ生成部208を備える。また、前記モックアップ生成部208が生成するモックアップ201は、モックアップ要素選択部202、および、1つ以上のモックアップ要素203を備える。また、サーバ200は、モックアップ201の生成に用いるデータであるモックアップテンプレート213を格納している。
ルール受信部207は、クライアント100からテストルールセット112を受信する。モックアップ生成部208は、モックアップテンプレート213を読み込み、当該モックアップテンプレート213に前記受信したテストルールセット112から読み出したモックアップ要素203を組み込んで、モックアップ201を生成する。当該生成されたモックアップ201には、モックアップ要素選択部202と、1つ以上のモックアップ要素203とを含む。メッセージ送受信部205は、モックアップ要素識別子211が付加されたテストリクエスト114をクライアント100から受信するとともに、テストリクエスト114への応答であるテストレスポンス212をクライアント100に送信する。モックアップ実行部206は、前記生成したモックアップ201を実行する。モックアップ選択部202は、前記受信したテストリクエスト114に付加されたモックアップ要素識別子211に基づき、前記実行されたモックアップ201に含まれるモックアップ要素203の中から、動作させるモックアップ要素203を選択する。モックアップ要素203は、テストレスポンス212であるHTMLファイルを生成する。
図3に基づき、モックアップテンプレート213について説明する。なお、図3では、説明の便宜のために各行の先頭に行番号を付しているが、実際のモックアップテンプレート213には行番号は不要である。
モックアップテンプレート213とは、モックアップ要素203を組み込むための雛形に相当するJSP(登録商標)コードを記述したファイルである。換言すると、モックアップテンプレート213に、テストルールセット111に記述されたモックアップ要素203が埋め込まれることで、モックアップ201が生成される。ここで、モックアップ要素203を埋め込む箇所を、ブロックタグ「mockup-behavior」によって指定している(図3の10行目)。また、JSP(登録商標)コード「request.getHeader("x-mock-id")」は、「x-mock-id」というHTTPヘッダの値を取り出す処理を記述している。(図3の7行目)。詳しくは後述するが、これはテストリクエスト114に付加されたモックアップ要素識別子211を取り出す処理に相当する。また、JSP(登録商標)コード「request.getParameter("p")」は、テストリクエスト114のパラメータ「p」を取り出している(図3の8行目)。引数「p」を使用するモックアップ要素203では、「p」の値に応じて、テストレスポンス212であるHTMLページを動的に生成することができる。
次に、図4に基づき、モックアップ201について説明する。前述の通り、モックアップ201はサーバ200に始めから格納されているわけではない。サーバ200のモックアップ生成部208が、サーバ200に始めから格納されているモックアップテンプレート213に、クライアント100から受信したテストルールセット111に記述されたモックアップ要素203を埋め込むことで、モックアップ201を生成する。
図4に例示するモックアップは、図3に例示したモックアップテンプレート213に、図1に例示したテストルールセット111に記述されたモックアップ要素203を埋め込んだJSP(登録商標)コードに相当する。なお、図4では、説明の便宜のために各行の先頭に行番号を付しているが、実際のモックアップ201には行番号は不要である。図4では、モックアップ要素203を埋め込む箇所を指定したブロックタグ「mockup-behavior」で指定しており(図4の10行目)、当該ブロックタグが付されたブロックに、モックアップ要素203それぞれがモックアップ要素識別子と対応付けられて埋め込まれている(図4の11〜31行目)。図4において、たとえば、モックアップ要素「<span>東京都千代田区永田町</span>」が、モックアップ識別子「zip-search-1」に対応付けられて埋め込まれている(図4の11〜13行目)。
図4のモックアップ201は、前述したように、動的にHTMLページを生成することができる。すなわち、動的にページを生成するアプリケーションを模倣できる。図4において、JSP(登録商標)のrequest.getParameter関数により、テストリクエストのパラメータpを取り出している(図4の8行目)。そして、モックアップ要素識別子が「script-tag-1」であるモックアップ要素「<%=p%>」では、pに格納された値(文字列)を、そのまま記載したHTMLページを生成する(図4の14〜16行目)。また、モックアップ要素識別子が「script-tag-2」であるモックアップ要素「<%=Utility.htmlEscape(p)%>」は、pに格納された値(文字列)にエスケープ処理(JSP(登録商標)のUtility.htmlEscape関数)を施した文字列を記載したHTMLページを生成する(図4の17〜19行目)。すなわち、これらのモックアップ要素は、テストリクエストの内容に応じて、テストレスポンス212であるHTMLページを動的に生成している。
ちなみに、一般論として、Webアプリケーションは、セキュリティの観点から、HTTPリクエストから与えられたパラメータを、出力であるHTMLページにそのまま含めるべきでなく、エスケープ処理を施すべきである。そうすることで、HTMLページにタグが混入されることがなくなり、いわゆるクロスサイトスクリプティング攻撃を回避できるためである。すなわち、図4のモックアップ要素「script-tag-1」はセキュリティ上問題のあるWebアプリケーションに対応しており、モックアップ要素「script-tag-2」は安全なWebアプリケーションに対応している。
図5に基づき、第1の実施形態の処理フローについて説明する。
まずクライアント100のルール読込部101は、テストルールセット111を記述したファイルを読み込む(ステップS101)。次に、クライアント100のルール送信部106は、読み込んだテストルールセット111の全体をサーバ200に送信する(ステップS102)。サーバ200のルール受信部206は、前記クライアント100が送信したテストルールセット111を受信する(ステップS103)。そして、サーバ200のモックアップ生成部208は、まずモックアップテンプレート213を読み込み、前記受信したテストルールセット111に含まれる各モックアップ要素203と各モックアップ要素に対応付けられたモックアップ要素識別子211とを対応付けて、モックアップテンプレートに組み込むことでモックアップを生成する(ステップS104)。ステップS104の処理の詳細については後述する。
ここで、図4には不図示であるが、クライアント100は、所定時間(例えば10秒間)のスリープ処理を行う。サーバ200においてモックアップが生成されるまでの時間を確保するためである。次にクライアント100のリクエスト生成部102は、リクエストテンプレート112を読み込むとともに、当該リクエストテンプレート112と前記読み込んだテストルールセット111に含まれるテスト入力パターンとを組み合わせてテストリクエスト114を生成する(ステップS105)。テストリクエスト114の生成は、前述の通り、図13に示すように行えばよい。
そしてクライアント100のモックアップ要素識別子付加部107は、前記読み込んだテストルールセット111に基づき、モックアップ要素識別子211を生成し、前記リクエスト生成部102が生成したテストリクエスト114に、当該モックアップ要素識別子211を付加する(ステップS106)。これは以下のように行う。まずモックアップ要素識別子付加部107は、テストルールセット111に定義されたルール識別子にモックアップ要素の番号(記載された順番)を連結することで、モックアップ識別子211を生成する。例えば、図2のテストルールセット111に基づいて説明すれば、ルール識別子「script-tag」が備える3個のモックアップ要素「<%=p%>」、「<%=Utility.HTMLEscape(p)%>」、「<script>validCode</script>」に対し、モックアップ要素識別子211をそれぞれ「script-tag-1」 、「script-tag-2」 、「script-tag-3」と生成できる。そして、モックアップ要素識別子付加部107は、前記リクエスト生成部102が生成したテストリクエスト114に、前記生成したモックアップ要素識別子211を付加する。これは、テストリクエスト114に付加するHTTPヘッダの1つである「X-Mock-Id」ヘッダに、モックアップ要素識別子211を格納することで実現する。
そして、クライアント100のメッセージ送受信部103は、モックアップ要素識別子211が付加されたテストリクエスト114をサーバ200に送信する(ステップS107)。サーバ200のメッセージ送受信部205は、前記クライアント100が送信したモックアップ要素識別子211が付加されたテストリクエスト114を受信する(ステップS108)。サーバ200のモックアップ実行部206は、前記生成したモックアップ201を実行する(ステップS109)。サーバ200のモックアップ201が備えるモックアップ要素選択部202は、前記受信したテストリクエスト114に付加されたモックアップ要素識別子211に基づき、当該モックアップ要素識別子211に対応付けられたモックアップ要素203を選択する(ステップS110)。サーバ200のモックアップ201が備えるモックアップ要素203のうちで前記選択されたモックアップ要素203は、テストリクエスト114を処理する動作を行い、動作結果(出力のHTMLページ)であるテストレスポンス212を生成する(ステップS111)。たとえば、図4のモックアップにおいて、モックアップ要素識別子「script-tag-1」が選択されると、モックアップ要素「<%=p%>」が動作し、pに格納された値(文字列)をそのまま記載したHTMLページが生成される。また、モックアップ要素識別子「script-tag-2」が選択されると、モックアップ要素「<%=Utility.htmlEscape(p)%>」が動作し、pに格納された値(文字列)にエスケープ処理を施した文字列を記載したHTMLページが生成される。
次に、サーバ200のメッセージ送受信部205は、前記生成したテストレスポンス212を、HTTPレスポンスの形式でクライアント100に送信する(ステップS112)。クライアント100のメッセージ送受信部103は、前記サーバ200が送信したテストレスポンス212を受信する(ステップS113)。
クライアント100のレスポンス判定部104は、前記受信したテストレスポンス212が、対応するテスト出力判定条件を満足するかを判定する(ステップS114)。すなわち、クライアント100のレスポンス判定部104は、前記受信したテストレスポンス212に含まれるHTMLページに対し、前記読み込んだテストルールセット111において前記送信したテストリクエスト114に係るテスト入力パターンに対応付けられた出力判定条件と照合し、テスト出力の合否を判定する。たとえば、図13におけるルール「script-tag」の場合、テスト入力パターンは「wx<script>yz」であり、それに対応付けられたテスト出力判定条件は「NG=/wx<script>yz/gi」である。判定の仕方についてはテストルールセット111の説明の中で述べたとおりであるが、例として、前記のテスト出力判定条件が「NG=/wx<script>yz/gi」である場合を説明する。この判定条件は判定種別が「NG」なので、判定パターンにマッチしたときに、テスト結果は不合格(NG)とする。すなわち、HTMLページに文字列「wx<script>yz」が1つでも含まれている(ただし、大文字小文字は区別しない)ときに、テスト結果は不合格(NG)となる。一方、HTMLページに文字列「wx<script>yz」が1つも含まれていない(ただし、大文字小文字は区別しない)ときに、テスト結果は合格(OK)となる。
クライアント100の判定結果出力部105は、前記ステップS113で得られたテスト結果に基づき、判定結果113を出力装置であるモニタに出力する(ステップS115)。クライアント100の判定結果出力部105は、以下のようにして、図6に例示するようなテーブルを生成して出力する。クライアント100の判定結果出力部105は、各行につき、ルール識別子、テスト入力パターン、テスト出力判定条件、モックアップ要素、および、想定判定結果を、テストルールセット111から読み出して出力する。ここで、想定判定結果とは、テストルールにおいてモックアップ要素に付された「OK」または「NG」のラベルを指す。そして、クライアント100の判定結果出力部105は、各行につき、前記ステップS114で得られたテスト結果を「実際判定結果」として出力する。さらに、クライアント100の判定結果出力部105は、各行につき、想定判定結果と実際判定結果とを比較した結果を「ルール動作確認結果」として出力する。ここで、想定判定結果と実際判定結果との比較の結果、これらが一致すれば、テストルールは想定通りに記述されていることが検証されたということなので、テストルール動作確認の結果としては「問題なし」となる。反対に、比較の結果、これらが一致しなければ、テストルールは想定通りに記述されていないことが検証されたということなので、テストルール動作確認の結果としては「問題あり」となる。ここでは判定結果をモニタに出力しているが、モニタに出力する代わりに、またはモニタに出力するのと併せて、判定結果を任意の記憶装置に出力してもかまわない(HDDにファイル出力するなど)。
クライアント100のリクエスト生成部102は、直前に送信したテストリクエスト114が現在の処理に係るテストルールの最後のモックアップ要素に係るものであるかを判定する(ステップS116)。もし最後のモックアップ要素でなければ、当該テストルールにおける次のモックアップ要素に対し、ステップS105に戻って処理を繰り返す。もし最後のモックアップ要素であればステップS117に進む。クライアント100のリクエスト生成部102は、直前に送信したテストリクエスト114がテストルールセット111の最後のテストルールに係るものであるかを判定する(ステップS117)。もし最後のテストルールでなければ、次のテストルールに対し、ステップS105に戻って処理を繰り返す。もし最後のテストルールであれば処理を終了する。これに対し、サーバ200は、クライアント100が次のテストリクエスト114を送信した場合には、ステップS108に戻って処理を繰り返す(ステップS118)。そうでなければ終了する。
図7の処理フローに基づき、ステップS104について詳しく説明する。ステップS104では前述のように、サーバ200のモックアップ生成部208が、図4に例示するようなモックアップ201(実体はJSP(登録商標)コードを格納したファイル)を生成する。
図7の処理フローにおいて、まずサーバ200のモックアップ生成部208は、図3に示すモックアップテンプレート213を読み込み、データjとする(ステップS201)。次にモックアップ生成部208は、クライアント100から受信したテストルールセット111をデータRとする(ステップS202)。そしてモックアップ生成部208は、テストルールセットRから順次テストルールrを取り出し(ステップS203)、そのそれぞれについて次の処理を行う。まずモックアップ生成部208は、テストルールrの識別子を読み出しnとする(ステップS204)。ここで、テストルールrの識別子とは、図3における「zip-search」等である。次にモックアップ生成部208は、テストルールrのモックアップ要素のセットをEとする(ステップS205)。ここで、テストルールrのモックアップ要素のセットをEとは、テストルールrが備えるモックアップ要素の集合であって、例えばテストルールrが図3の「script-tag」の場合のEは、それぞれ「<%=p%>」、「<%=Utility.htmlEscape(p)%>」、および、「<script>validCode</script>」と定義された3個のモックアップ要素からなる集合である。次にモックアップ生成部208は、i=1とする(ステップS206)。そしてモックアップ生成部208は、モックアップ要素のセットEから順次モックアップ要素eを取り出し、そのそれぞれについて次の処理を行う(ステップS207)。まずモックアップ生成部208は、ルール識別子nにiを文字列連結し、eのモックアップ要素識別子mを作る(ステップS208)。たとえば、モックアップ要素「<%=p%>」のモックアップ要素識別子mは、対応するルール識別子nが「script-tag」にi=1を文字列連結されることで生成され、結局「script-tag-1」となる。次にモックアップ生成部208は、HTTPリクエストから得たモックアップ要素識別子がmと一致するならばモックアップ要素eを実行するというコードを、jの埋め込み部分に追加する(ステップS209)。ここで、埋め込み部分とは、図3においてブロックタグ「mockup-behavior」で指定された領域が該当する。図4に基づいて説明すれば、たとえばモックアップ要素eが「<%=p%>」である場合、モックアップ要素識別子「script-tag-1」及びモックアップ要素「<%=p%>」とに基づき、ブロックタグ「mockup-behavior」で指定された領域に以下の3行のコードを追加する。
<% else if ("script-tag-1".equals(id)) [ %>
<%=p%>
<% ] %>
そしてモックアップ生成部208は、iに1を加える(ステップS210)。モックアップ生成部208は、以上の処理を全てのルールの全てのモックアップ要素eに対して行い(ステップS211、ステップS212)、最後にモックアップ生成部208は、結果のデータjをモックアップ201(JSP(登録商標)コードを記述したファイル)として出力する(ステップS213)。
以上のように、本発明の第1の実施の形態によれば、サーバ側アプリケーション向けブラックボックステストのテストルール動作確認を、クライアント側のみの操作によりおこなうことが可能となる。これにより、操作が簡単になり、複数のテストルールを一括して動作確認できるようになるため、テストルール動作確認を効率よく行えるようになる。また、動作確認のミスも生まれ難く、より正しい結果を得ることが可能となる
以下では本発明の第2の実施形態を説明する。
図8は本発明の第2の実施形態に係るテストルール動作確認システムの機能ブロック図である。第2の実施形態では、クライアント100がサーバ200に送信するテストリクエスト114において、モックアップ要素識別子211ではなく、モックアップ要素115そのものを付加する。そのため、第1の実施形態に係る図1の構成と比較して、クライアント100は、モックアップ要素識別子付加部107の代わりにモックアップ要素付加部108を備える。一方、サーバ200は、モックアップ要素選択部202を備えず、モックアップ要素203が1つのみである。また、テストルールセット111の送受信が不要なため、クライアント100のルール送信部106およびサーバ200のルール受信部207は必要ない。なお、図8及び以降の説明において、第1の実施形態に係る機能ブロック図である図1に記載されていると同じ構成要素については、同じ名前及び符号を用いる。
図9は本発明の第2の実施形態に係る処理フローである。基本的には第1の実施形態の処理を踏襲するが、以下の点が異なる。
まず、クライアント100のテストルール読込部101は、テストルールセット111を読み込む(ステップS301)。次に、クライアント100のテストルール読込部101は、テストリクエストを生成する(ステップS302)。そしてクライアント100のモックアップ要素付加部108は、前記読み込んだテストルールセット111に基づき、前記リクエスト生成部102が生成したテストリクエストに、モックアップ要素115を付加する(ステップS303)。モックアップ要素は、第1の実施形態におけるモックアップ識別子と同様に、「X-Mock-id」ヘッダに格納する。
そして、クライアント100のメッセージ送受信部103は、モックアップ要素115が付加されたテストリクエスト114をサーバ200に送信する(ステップS304)。サーバ200のメッセージ送受信部205は、前記クライアント100が送信したモックアップ要素115が付加されたテストリクエスト114を受信する(ステップS305)。そして、サーバ200のモックアップ生成部208は、まずモックアップテンプレート213を読み込み、前記受信したテストリクエスト114に付加されたモックアップ要素115を、モックアップテンプレートに組み込むことでモックアップを生成する(ステップS306)。この処理は、第1の実施形態に係るモックアップ生成処理(図7)とは異なり、図3におけるブロックタグ「mockup-behavior」で指定された領域に、モックアップ要素115を埋め込めばよい。
サーバ200のモックアップ実行部206は、前記生成したモックアップ201を実行する(ステップS307)。これにより、サーバ200のモックアップ201に埋め込まれた前記モックアップ要素203は、テストリクエスト114を処理する動作を行い、動作結果(出力のHTMLページ)であるテストレスポンス212を生成する(ステップS308)。次に、サーバ200のメッセージ送受信部205は、前記生成したテストレスポンス212を、HTTPレスポンスの形式でクライアント100に送信する(ステップ309)。クライアント100のメッセージ送受信部103は、前記サーバ200が送信したテストレスポンス212を受信する(ステップS310)。
以降の処理内容は、第1の実施形態に係る処理フロー中の対応する処理内容と同じであるため、簡単に説明する。クライアント100のレスポンス判定部104は、前記受信したテストレスポンス212が、対応するテスト出力判定条件を満足するかを判定する(ステップS311)。クライアント100の判定結果出力部105は、前記ステップS311で得られたテスト結果に基づき、判定結果113を出力装置であるモニタに出力する(ステップS312)。クライアント100のリクエスト生成部102は、直前に送信したテストリクエスト114が現在の処理に係るテストルールの最後のモックアップ要素に係るものであるかを判定する(ステップS313)。もし最後のモックアップ要素でなければ、当該テストルールにおける次のモックアップ要素に対し、ステップS105に戻って処理を繰り返す。もし最後のモックアップ要素であればステップS314に進む。クライアント100のリクエスト生成部102は、直前に送信したテストリクエスト114がテストルールセット111の最後のテストルールに係るものであるかを判定する(ステップS314)。もし最後のテストルールでなければ、次のテストルールに対し、ステップS302に戻って処理を繰り返す。もし最後のテストルールであれば処理を終了する。これに対し、サーバ200は、クライアント100が次のテストリクエスト114を送信した場合には、ステップS305に戻って処理を繰り返す(ステップS315)。そうでなければ終了する。
第2の実施形態によれば、第1の実施形態と同じ作用・効果を奏する。すなわち、サーバ側アプリケーション向けブラックボックステストのテストルール動作確認を、クライアント側のみの操作によりおこなうことが可能となる。これにより、操作が簡単になり、複数のテストルールを一括して動作確認できるようになるため、テストルール動作確認を効率よく行えるようになる。さらに、第2の実施形態は、第1の実施形態に比べて、事前のテストルールセットの送信が不要なため、ネットワークへの負担及び処理時間が低減される効果を奏する。ただし、HTTPヘッダに長い文字列を格納するのは一般的ではないため、特にサーバにおいて想定外の挙動を示す可能性もある。そのため、第2の実施形態は、HTTPヘッダに格納するモックアップ要素のサイズが十分に小さい場合のみ実施すべきである。
以上、本発明に係るテストルール動作確認システムの実施形態について説明したが、本発明は上記実施形態に限るものではなく、その技術的思想の範囲内で種々の設計変更が可能である。
例えば、上記実施の形態では、テスト対象であるサーバ側アプリケーションがWebアプリケーションであるが、サーバ側アプリケーションはWebアプリケーションに限るものではなく、ネットワークアプリケーションであればなんでも良い。
また、上記実施の形態では、モックアップの基盤としてJava(登録商標)サーブレットコンテナを使用し、モックアップ要素やモックアップをJavaServer Pages(JSP)(登録商標)コードの形式で記述するが、モックアップアプリケーションの基盤及びコード形式(プログラム言語)としては、Perl(Practical Extraction and Report Language)等を用いたCommon Gateway Interface(CGI)、PHP: Hypertext Preprocessor(PHP)、Active Server Pages(ASP)その他の技術を使用しても良い。
また、上記実施の形態では、レスポンス判定及び結果出力に係るステップ(第1の実施形態のステップS114、S115)をテストルール毎に逐次的に行っているが、これをバッチ処理のように行っても良い。すなわち、クライアントは、全てのテストルールに対してレスポンスを取得してから、それらにまとめて出力判定処理を行うような構成とすることができる。
また、上記実施の形態では、2つの装置をネットワーク接続してそれぞれの装置をクライアント100とサーバ200として機能させているが、クライアント100とサーバ200を物理的なネットワークを介さずに1つの装置で構成しても良い。また、テストルールセット111をクライアント100に格納する代わりに、サーバ200に格納しておきクライアント100に送付する構成、若しくは不図示の第3のホスト上に格納しておきクライアント100及びサーバ200に送信する構成を採用しても良い。
また、上記実施の形態では、モックアップ要素識別子211或いはモックアップ要素115をHTTPヘッダに格納しているが、それ以外の箇所にモックアップ要素識別子211或いはモックアップ要素115を格納してもよい。ただし、推奨される格納先は、HTTPヘッダである。その理由は、アプリケーションの動作やテストに影響する可能性が低く、テストルールの動作確認時だけ特別にモックアップ要素識別子を付けるのではなく、本来のテスト時に付けてもほとんどの場合問題がないため、テストルールの動作確認作業を透明性の高い形で実現できるというメリットがあるためである。
最後に、以上ではテストルール動作確認システムの構成を説明したが、これらを構成するクライアント100あるいはサーバ200は、図10に示すようなコンピュータ上で動作するプログラムによっても実現することができる。
本願発明に係るプログラムを実行するコンピュータのハードウェア構成の例を図10に示す。コンピュータ10のハードウェア構成として、例えば、Central Processing Unit(CPU)11、主記憶12、補助記憶装置13、出力インタフェース14、入力インタフェース15、通信インタフェース16がバス17で接続されている。
CPU11は後述する主記憶12に格納されたプログラムを実行する。主記憶12としては、通常はRandom Access Memory(RAM)が用いられ、後述する補助記憶装置13から実行するプログラムや使用するデータを読み込んで一時的に格納する。補助記憶装置13としては、通常はHard Disk Drive(HDD)が用いられ、プログラムやデータを格納してファイルとして保存する。なお、補助記憶装置13としては、CD−ROM、DVD−ROM、USBメモリ等の外部記憶媒体を用いることもできる。
出力インタフェース14には出力装置の一つとして表示装置であるモニタ18が接続される。プログラムの実行結果などがモニタに出力され表示される。入力インタフェース15には入力装置としてキーボード19やマウス20が接続され、これら入力装置からデータが入力される。通信インタフェース17はネットワーク21に接続される。コンピュータはネットワークを介して他のコンピュータとデータをやり取りする。
上記ハードウェア構成を、図1、図8及び図11の機能ブロックと対応付けると以下のようになる。コンピュータをクライアント100として機能させるためのプログラム(ルール読込部101、リクエスト生成部102、メッセージ送受信部103、レスポンス判定部104、判定結果出力部105、ルール送信部106、モックアップ要素識別子付加部107、および、モックアップ要素付加部108)、及びデータ(テストルールセット111およびルクエストテンプレート112)を予め補助記憶装置13に格納させておく。プログラムが起動されると、当該プログラムおよびデータはまず主記憶12に読み込まれ、その後主記憶12とCPU11とが連携することでプログラムが実行される。
また、コンピュータをサーバ200として機能させるためのプログラム(モックアップ要素識別子受付部204、メッセージ送受信部205、モックアップ実行部206、ルール受信部207、および、モックアップ生成部208)、及びデータ(モックアップテンプレート213)を予め補助記憶装置13に格納させておく。プログラムが起動されると、当該プログラムおよびデータはまず主記憶12に読み込まれ、その後主記憶12とCPU11とが連携することでプログラムが実行される。プログラムであるモックアップ201は主記憶12上で生成され、一旦補助記憶装置13に保存される。補助記憶装置13上のモックアップ201が実行されると、モックアップ201は主記憶12に読み込まれ、モックアップ要素選択部202とモックアップ要素203とが実行される。