以下、図面に基づいて本発明の実施の形態を説明する。本実施の形態では、テスト対象から仕様をリバースし、リバースした仕様に基づいて網羅的なテストケースを自動生成し、テストスクリプトとして出力するといったアプローチを提案する。本アプローチによって、追加の稼働を必要とせずに網羅的なテストスクリプトを自動生成することができる。
本実施の形態では、機能テストにおける画面遷移テストを対象としているため、以下のステップで処理が実行される。
(1)テスト対象を解析し、仕様としてテスト対象を構成する画面と画面間の繋がり、各画面に到達するための手段を抽出する。
(2)(1)で取得した仕様から機能テストにおける画面遷移テストに適した画面遷移図を生成する。
(3)(2)で生成した画面遷移図の各遷移に対応するテストスクリプトを、(1)で抽出した画面に到達するための手段の情報に基づいて、出力したいスクリプト形式に合わせて出力する。
(1)ではテスト対象を構成する画面とその画面に到達するための手段を抽出する。Webアプリケーションでは、jspファイル等の画面(HTML)の元となるファイルから、クライアントサイドからのリクエストに応じて、動的に画面を生成するケースが一般的である。したがって、テスト対象がどのような画面で構成されていて、それらがどのように繋がっているかの情報は、ソースコードに直接記述されていないため、適切な解析が必要となる(技術課題1:テスト対象から仕様をリバースする方法の検討)。
また、画面に到達するための手段の抽出においても、Webアプリケーションでは、特定の入力値を与えないと遷移することができない画面遷移が存在する。例えば、電話番号を登録するようなシステムにおいて、11桁の半角数字でないと登録完了画面に遷移できないケースが挙げられる。このような画面遷移に対して、適切な入力値を生成する必要がある(技術課題2:画面遷移を実現するための適切な入力値生成方法の検討)。
(2)では、(1)で取得したテスト対象を構成する画面情報を用いて、機能テストにおける画面遷移テストに適した画面遷移図を生成する。機能テストにおける画面遷移テストでは、機能の粒度で画面を識別する必要がある。一般的に画面はURLで識別されるが、同一URLの画面同士でも、機能テストでは異なる画面と判別されることがある。例えば、検索サイトにおいて、検索結果が無かったときの画面と検索結果が有ったときの画面はURLで見た場合、同一となることがあるが、機能テストの観点では別々の画面としてみなされる。したがって、機能テストの観点に合った、適切な画面識別を行う必要がある(技術課題3:機能テストにおける適切な画面識別方法の検討)。
(3)は、出力したいスクリプト形式に合わせてテストスクリプトを生成するステップである。(1)で抽出した画面に到達するための手段(リンクやボタンのクリック、フォーム(入力領域)への入力等)を、出力したいスクリプト形式で記述する。本ステップについては、抽出した手段をそれに対応するメソッドで記述するだけなので技術的課題はないと考えられる。
以上より、本アプローチには以下の3つの技術的課題があると考えられる。
技術課題1:テスト対象から仕様をリバースする方法の検討。
技術課題2:画面遷移を実現するための適切な入力値生成方法の検討。
技術課題3:機能テストにおける適切な画面識別方法の検討。
[技術課題1:テスト対象から仕様をリバースする方法の検討]
<従来技術と問題点>
アプリケーションから仕様をリバースする技術として、静的解析を用いた技術が存在する(例えば、「"Reconstructing Software Architecture for J2EE Web Applications" Minmin Han, Christine Hofmeister, Robert L. Nord,Proceedings of the 10th Working Conference on Reverse Engineering 2003」)。しかし、jspファイルから動的に生成されるHTMLのように、実行しないと生成できない情報を取得することができないため、仕様を完全にリバースすることができない。このような欠点を補うため、静的解析と動的解析を組み合わせた技術も存在する(例えば、「Silva CE, Campos JC. 2013. "Combining Static and Dynamic Analysis for the Reverse Engineering of Web Applications". Proceedings of the 5th Symposium on Engineering Interactive Computing Systems - EICS. :107-112.」)。本技術では静的解析でプログラム中のパスを洗い出し、動的解析でそれらのパスを全て網羅するようなテストケースを生成することでWebアプリケーションの振る舞いの網羅を目指している。しかし、動的解析で通過したパスを取得するためには入力値が通過しうる全ての箇所にログが取得できるようなコードを挿入する必要があり、ユーザは、クライアントサイドからサーバサイドまで、システム構成を正確に把握し、プログラムが通過した場所を表すログを出力するための環境を用意しなくてはならないため、ツール導入のための追加稼働の削減を目指している本実施の形態の目的とは合致しない。また、テスト対象に手を加えることで振る舞いが変わる可能性もあり、そのようなテスト対象から生成したテストケースを実際のテストに用いた場合、想定していたテストシナリオと異なる内容のテストをしてしまうリスクが存在する。
<本実施の形態における提案:コントローラに着目した静的解析と動的解析を用いた仕様のリバース技術>
本実施の形態では、Webアプリケーションにおいて一般的に用いられているデザインパターンであるMVC(Model View Controller)の構成において、クライアントサイドからのリクエストに対して実行する処理を決定するコントローラに着目する。例えば、サーブレットがコントローラの一例である。コントローラが割り振る遷移を静的解析で全て把握し、その後の動的解析でそれらの遷移を網羅することで、テスト対象を構成する画面と画面間の繋がり、各画面に到達するための手段を漏れなくリバースすることができる。従来手法との違いとして、本実施の形態ではコントローラにのみ着目するため、クライアントサイドの情報からコントローラの示す遷移先をどの程度網羅できたかを推測することができ、ログを取得するための環境を用意する稼働を不要、又は少なくすることができるといった利点が挙げられる。従来のプログラムの実行パスを取得する方法では、実行パスの詳細な情報をクライアントサイドから推測することは不可能である。
[技術課題2:画面遷移を実現するための適切な入力値生成方法の検討]
<従来技術と問題点>
画面遷移を実現するための適切な入力値を生成するための方法として、Search Based Software Testing(以下「SBST」という。)を用いた手法が存在する(N. Alshahwan and M. Harman, "Automated web application testing using search based software engineering," 2011 26th IEEE/ACM International Conference on Automated Software Engineering (ASE 2011), Lawrence, KS, 2011, pp. 3-12.)。SBSTを用いた入力値生成では、達成したい要件に対する達成度合いを定量的に評価できるように設計された評価関数に基づいて、ヒューリスティック探索アルゴリズムを用いて、達成したい要件を満足するテスト入力値を生成する。例えば入力値aに対して「a>10」の場合にのみ遷移する画面遷移が存在した場合、評価関数を「a−10」と置く。この時、評価関数の値が0より大きい場合に所望の画面遷移を実現することができる。最初に入力値a=0とした場合、評価関数の値は、−10となる。次に入力値a=2とした場合、評価関数の値は、−8となり、所望の画面遷移を実現するための条件である、評価関数の値が0より大きいという条件に近づく。したがって入力値aの値が大きい方が良いと判断し、徐々に入力値aの値を大きくしていくことで、a=12等の所望の画面遷移を実現するための値を生成することができる。
SBSTを用いた入力値生成は、上記の数値型の例のように、所望の画面遷移を実現するための条件を、定量的な評価が可能な評価関数と置くことができる単純な場合には有効である。しかし、入力フォームにどのような入力値が求められているのかを判断し、判断結果に基づいて適切な入力値を与える必要がある場合には、定量的な評価が可能な評価関数を設計することが困難なため、有効ではない。具体的には、氏名やメールアドレスなどの文字列型を入力とし、型チェックを行って問題なければ正常系の画面に遷移する場合においては、型チェックの条件(メールアドレスであればアットマークを含んでいるかどうかなど)を、定量的な評価が可能な評価関数と置くことが困難なため、適切な入力値を生成することは難しい。また、適切な入力値が生成できなかった場合、当該入力値の入力フォームが存在する画面に対するテストについては、ユーザがすべて人手で実施する必要があり、その画面に遷移までの画面操作の手間なども含めると、多くの稼働がかかってしまう。具体的には、図2に示される画面g1の入力フォームの入力値は、メールアドレスであるべきところ、当該入力フォームに対して適切な入力値を生成するのは困難である。したがって、画面g2への遷移は容易だが、画面g3への遷移には多くの稼動がかかってしまう。
<本実施の形態における提案:入力フォームの周辺情報を用いたテスト入力値生成とユーザによる補助技術>
本実施の形態は、2つのステップから構成される。第1ステップでは、ラベル等の入力フォームの周辺情報(すなわち、画面の記述情報のうち入力フォームに対応する記述部分から抽出される情報)を用いて、どのような種類の入力値が求められているのか判断し、求められている内容に対応する具体的な単語を予め用意された辞書から取得し、当該単語を入力値として与えることで、各入力フォームに合った適切な入力値を与えることができる。
第2ステップでは、第1ステップで適切な入力値を生成できなかった入力フォームの情報をユーザに提示し、入力値の補助をユーザに求めることで、入力値だけを与えるという必要最低限の稼働で、自動生成できなかった箇所の補完を行うことができる。
[技術課題3:機能テストにおける適切な画面識別方法の検討]
<従来技術と問題点>
本実施の形態では、機能テストにおける画面遷移テストを、機能テストの中でも、「クライアントサイドからのインタラクションに対し、クライアントサイドに表示される画面から、仕様通りに実装されているかどうかを確認することができる機能に対するテスト」と定義する。一般的に画面はURLで識別されるが、本定義における画面遷移テストでは、同一URLの画面同士でも画面によっては異なる画面としてテストすることが重要である。例えば、検索サイトにおいて、図1のように検索結果が無かったときの画面と検索結果が有ったときの画面はURLで見た場合、同一となることがあるが、機能テストの観点では別々の画面としてみなす。このような場合、URLではなく、表示される画面から識別するべきである。しかし、単純に表示された画面同士を画像として比較すると、確認したい機能部分が同一でも、それ以外の箇所が異なっていた場合、異なる画面と判別されてしまう。したがって、画面全体ではなく、画面を構成する要素の一部を比較する必要がある。画面は主にHTML、DOM(Document Object Model )構造、テキスト、画像、CSS(Cascading Style Sheets)等の要素で構成されている。
試験観点によって着目すべき箇所は異なるが、本実施の形態では機能の違いがHTMLのDOM構造に表れるケースを対象とする。HTMLのDOM構造比較の既存手法として、Tree Edit Distance(以下「TED」という。)を用いた手法が存在する(例えば、「"A survey on tree edit distance and related problems" Philip Bille. 2004. Theoretical Computer Science. Volume 337, Issues 1-3, 9 June 2005, Pages 217-239.」)。
TEDとは、両DOMツリーが一致するまでノードの削除・挿入を行ったときの削除・挿入の回数となる。例えば、図3においてDOMツリー1とDOMツリー2を一致させるには、DOMツリー2の<p>、<strong>、<U>の3つのノードを削除し、<img>ノードを挿入する必要があるため、TEDの値は4となる。閾値が3以下の場合、DOMツリー1とDOMツリー2の構造は不一致と判断することができ、閾値が4以上の場合、DOMツリー1とDOMツリー2の構造は一致すると判断することができる。
TEDを用いた画面の構造比較の欠点として、画面ごとに適切な閾値が異なるため、閾値の設定が困難であるといった点が挙げられる。閾値(TEDに対する許容範囲)を必要とする原因として、以下の2つが考えられる。
原因1:機能テストにおける画面の識別に影響を与えないノードの存在
原因2:並列化されたノードの存在
原因1については、太字タグ<b>など、機能テストにおいて画面の識別に影響を与えないノードが存在することが挙げられる。原因2については、見出しタグなどが挙げられる。例えば、ニュースサイトにおいて、見出しの数が異なっている場合でもニュースを表示するという機能は同一であるため、見出しの数は機能に影響を与えないということがいえる。このように画面の識別に影響を与えないノードが存在し、それらのノードによってTEDの値が増加するため、閾値を設ける必要がある。
<本実施の形態における提案:HTMLのDOM構造の類似度を利用した画面識別技術>
本実施の形態では、原因1に関わるノードを削除し、原因2に関わるノードを集約することでHTMLを抽象化し、抽象化されたHTMLを比較することで、閾値の設定を必要とせずに機能テストにおける適切な画面識別を可能とする。
以下、上記を実現するための具体例について説明する。図4は、本発明の実施の形態におけるシステム構成例を示す図である。図4において、サーバ装置20及びクライアント装置10は、例えば、LAN(Local Area Network)又はインターネット等のネットワークを介して接続される。
サーバ装置20は、Webアプリケーションを含むテスト対象のシステムを含む1以上のコンピュータである。
クライアント装置10は、サーバ装置20が有するWebアプリケーションについてのテスト(検証)を支援する装置である。
図5は、本発明の実施の形態におけるクライアント装置10のハードウェア構成例を示す図である。図5のクライアント装置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はプログラムによるGUI(Graphical User Interface)等を表示する。入力装置107はキーボード及びマウス等で構成され、様々な操作指示を入力させるために用いられる。
図6は、本発明の実施の形態におけるクライアント装置10の機能構成例を示す図である。図6において、クライアント装置10は、画面遷移情報抽出部11、テストシナリオ生成部12、画面自動操作部13、画面評価部14及びテスト資材生成部15等を有する。これら各部は、クライアント装置10にインストールされた1以上のプログラムが、CPU104に実行させる処理により実現される。
画面遷移情報抽出部11は、Webアプリケーションのコントローラのソースコードに基づいて、静的解析技術を用いてコントローラを解析し、各リクエストに対する遷移先の数を取得する。
テストシナリオ生成部12は、テストにおいて表示された各画面に対するテストシナリオとテスト入力値とを生成する。或る画面の各フォームに対するテスト入力値は、当該画面に係るHTMLのDOMツリーにおける当該フォームの周辺情報を用いて生成される。当該フォームの周辺情報とは、HTMLにおいて当該フォームに関して定義された情報の一例である。
画面自動操作部13は、生成されたテストシナリオとテスト入力値とをテストケースとして、画面操作を自動的に実行することで、動的解析を実現する。
画面評価部14は、画面操作の実行により遷移した画面が既に遷移したことのある画面か否かをURLやHTML等の情報を用いて判定する。画面評価部14は、画面操作の実行により遷移した画面のHTMLデータと、既に遷移したことのある画面のHTMLデータとについて、それぞれを抽象化するための編集処理を行って、編集後のHTMLデータを比較する。
テスト資材生成部15は、静的解析及び動的解析により得られた情報に基づいて、画面遷移図を生成する。テスト資材生成部15は、また、テストシナリオ生成部12によって生成されたテストシナリオとテスト入力値をテストスクリプトの形式で出力する。
以下、クライアント装置10が実行する処理手順について説明する。図7は、クライアント装置10が実行する処理手順の一例を説明するためのフローチャートである。
ステップS101において、画面遷移情報抽出部11は、静的解析技術を用いてコントローラのソースコードを解析し、画面の遷移先を決定するコントローラの情報から、各リクエストに対する遷移先の数を取得する。1つのリクエストに対する遷移先の数を示す情報を「画面遷移情報」といい、画面遷移情報のリストを「画面遷移情報リスト」という。
図8は、静的解析の一例を示す図である。図8には、コントローラのソースコードの一部が示されている。図8において記述d1は、リクエストを示す。記述d2及び記述d3は、当該リクエストに対応した遷移先を示す。ステップS101では、記述d1、d2、及びd3から、「owners/new」というリクエストに対して2つの遷移先が有ることが抽出される。このような抽出が、ソースコードに定義されている全てのリクエストについて実行される。
続いて、画面自動操作部13は、初期URLにアクセスして、初期URLに対応するHTMLデータ等を取得する(S102)。その結果、当該HTMLデータ等に基づく画面が表示装置106に表示される。初期URLは、例えば、ユーザによって入力されてもよいし、補助記憶装置102に予め記憶されていてもよい。
続くステップS103〜S108では、初期URLに対応するHTMLデータ、及び当該HTMLデータに係る画面を起点として遷移可能な全てのHTMLデータに関して、動的解析等が実行される。具体的には、静的解析で取得された各リクエストに対する遷移先を全て網羅するように、動的解析として、初期URLに対応する画面を起点として実際にテスト対象の画面操作が自動的に実施される。動的解析では、各画面上の全てのリンクに対してクリックを実施し、入力フォームとそれに対応するサブミットボタンが有る場合には、サブミットボタンを押したときのリクエストに対して、静的解析で取得したそのリクエストの遷移先の数を満たすまで、テスト入力値が生成され、画面操作が繰り返される。リクエストの遷移先の数を満たしたか否かについては、遷移先の画面について、既に遷移した画面との比較を行い、新規に遷移した画面かどうかの判断を行って、到達画面数をカウントする。以上の動的解析によって遷移先画面の情報(HTML、URL等)と画面間の繋がり、画面に到達するための手段が取得される。また、コントローラを通らない画面遷移が動的解析で発見された場合、その画面遷移の情報も追加される。コントローラを通らない画面遷移とは、例えば、aタグでのリンクがクリックされた場合に発生する画面遷移である。
以下、ステップS103〜S108の間で処理対象とされているHTMLデータを、「対象HTML」という。
ステップS104において、テストシナリオ生成部12は、対象HTMLに係る画面(以下、「対象画面」という。)に対するテストシナリオを生成する。すなわち、対象画面において画面の遷移を発生させる画面要素(リンクやサブミットボタン等)ごとに、操作及びロケータの組からなるテストシナリオが生成される。操作は、クリック等の操作である。ロケータは、操作の対象とされる画面要素の識別情報である。
続くステップS105〜S107は、ステップS104において生成されたテストシナリオごとに実行される。S105〜S107において処理対象とされているテストシナリオを、以下「対象テストシナリオ」という。
ステップS106において、テストシナリオ生成部12が、対象テストシナリオに基づいてテストケースを生成し、画面自動操作部13が、当該テストケースを対象画面に対して実行する。その結果、画面遷移が発生する。なお、対象テストシナリオが、入力値を必要とする場合、ステップS106において、テスト入力値の生成が行われる。
遷移先の全ての画面(HTML)に対してステップS103〜S108が実行されると、テスト資材生成部15は、画面遷移図を生成する(S109)。具体的には、テスト資材生成部15は、生成された画面遷移情報リストと、ステップS103〜S108において実際に発生した画面遷移とを比較して、テストにおいて発生しなかった画面遷移が有れば当該画面遷移を抽出(検出)し、遷移することのできた画面遷移と遷移することのできなかった画面遷移の情報を合わせた画面遷移図を生成する。遷移することができなかった画面遷移に対しては、テストスクリプトも生成できていないため、人手で作成する等のサポートが行われてもよい。
図9は、画面遷移図の一例を示す図である。図9では、画面Aから画面B及び画面Cに遷移し、画面Cから画面Bに遷移することが示されている。また、破線の矩形は、仕様では遷移する予定であるが、テストにおいて遷移が発生しなかった画面を示す。すなわち、ソースコードでは、画面Cから遷移する画面が有ることが定義されているが、動的解析では当該画面への遷移が発生しなかったことを示す。
続いて、テスト資材生成部15は、画面遷移図において、遷移できなかった箇所の有無を判定する(S110)。すなわち、図9において、破線の矩形に該当する箇所の有無が判定される。
該当箇所が無い場合(S110でNo)、テスト資材生成部15は、各画面遷移が発生したときのテストシナリオとテスト入力値とをテストスクリプトの形式で出力する(S112)。
一方、該当箇所が有る場合(S110でYes)、テスト資材生成部15は、テストケースに対する入力値の補助をユーザから受けるための処理を実行する(S111)。ステップS111に続いて、ステップS101以降が再実行される。
続いて、図7のステップS101の詳細について説明する。図10は、画面遷移情報の抽出処理の処理手順の一例を説明するためのフローチャートである。
ステップS301において、画面遷移情報抽出部11は、コントローラのソースコードを読み込む。当該ソースコードは、予め補助記憶装置102に記憶されていてもよい。
続いて、画面遷移情報抽出部11は、ソースコードから検出されるリクエストごとにステップS302〜304を実行する。ステップS303において、画面遷移情報抽出部11は、処理対象のリクエストに対する遷移先の数をソースコードを参照して特定し、当該リクエストと当該数との組を、画面遷移情報リストに追加する。したがって、画面遷移情報リストには、ソースコード(仕様)において予定されている全ての画面遷移の情報が登録される。
続いて、図7のステップS106の詳細について説明する。図11は、テストケースの生成及び実行処理の処理手順の一例を説明するためのフローチャートである。
ステップS401において、テストシナリオ生成部12は、対象テストシナリオの操作にフォームへの入力操作が含まれているか否かを判定する。対象テストシナリオの操作にフォームへの入力操作が含まれていない場合(S401でNo)、テストシナリオ生成部12は、対象テストシナリオをそのままテストケースとする(S402)。続いて、画面自動操作部13は、当該テストケースを対象画面に対して実行する(S403)。当該テストケースの実行により、画面遷移が発生する。続いて、画面評価部14は、テストケースの実行によるリンクのクリックやボタンの押下により発生したリクエストを「リクエストA」として記憶する(S405)。
続いて、画面評価部14は、ステップS403で遷移した画面が既に遷移したことのある画面か否かをURLやHTML等の情報を用いて判定する(S405)。この際、ステップS403で遷移した画面が未だ遷移したことのない画面である場合、当該遷移に関する情報が、遷移リストの要素として追加される。遷移リストとは、動的解析において発生した画面間の遷移に関する情報を要素とするリストである。当該要素は、遷移前画面のURL、遷移後画面のURL、リクエストA、遷移後画面のHTML、及びテストケース等を含む。
一方、対象テストシナリオの操作にフォームへの入力操作が含まれている場合(S401でYes)、テストシナリオ生成部12は、フォームへの入力値(テスト入力値)を生成する(S406)。例えば、対象画面が図12に示される通りであれば、対象テストシナリオには、姓に対応するフォームへの入力操作、名に対応するフォームへの入力操作、メールアドレスに対応するフォームへの入力操作、及び登録ボタンの押下等が含まれている。したがって、この場合、フォームごとにテスト入力値が生成される。1つのフォームに対して複数のテスト入力値が生成される可能性が有る。そこで、続くステップS407〜S412は、各フォームに対するテスト入力値の組み合わせごとに実行される。当該組み合わせは、全通りの組合せであってもよいし、全通りの中から所定数の組み合わせが抽出されたものであってもよい。全通りの組み合わせとは、例えば、姓についてN個のテスト入力値が生成され、名についてM個のテスト入力値が生成され、メールアドレスについてL個のテスト入力値が生成された場合、N×M×L通りの組み合わせをいう。以下、処理対象の組み合わせを、「対象組み合わせ」という。
ステップS408において、テストシナリオ生成部12は、対象組み合わせに属する各テスト入力値がそれぞれに対応するフォームへの入力対象とされたテストケースを、対象テストシナリオに基づいて生成する。続いて、画面自動操作部13は、当該テストケースを対象画面に対して実行する(S409)。すなわち、対象テストシナリオにおいて値の入力先とされている各フォームに対して対象組み合わせに属するテスト入力値が入力され、対象テストシナリオにおいて押下対象とされているサブミットボタンが押下される。その結果、画面遷移が発生する。
続いて、画面評価部14は、ボタンの押下により発生したリクエストを「リクエストA」として記憶する(S410)。続いて、画面評価部14は、ステップS405と同様の処理を実行する(S411)。
全ての組み合わせについてステップS407〜S412が実行されると、画面評価部14は、遷移リストにおけるリクエストAに対する遷移後画面のURLの数(すなわち、リクエストAを含む要素の数、以下「動的遷移数」という。)が、画面遷移情報リストにおいてリクエストAに対応する遷移先URLの数(以下、「静的遷移数」という。)に等しいか否かを判定する(S413)。すなわち、ステップS413では、リクエストAに関してソースコードに定義されている全ての遷移が検出されたか否かが判定される。
動的遷移数が、静的遷移数に等しい場合(S413でYes)、対象テストシナリオについては、図11の処理が終了する。動的遷移数が、静的遷移数に達していない場合、すなわち、動的遷移が静的遷移に対して不足する場合(S413でNo)、画面評価部14は、対象画面の各フォームに対するテスト入力値としてテストシナリオ生成部12が生成しうる全ての入力値が生成されたか否かを判定する(S414)。テストシナリオ生成部12が生成しうる全ての入力値が生成されていない場合、すなわち、テストシナリオ生成部12によって、異なる入力値の生成の余地が有る場合(S414でNo)、ステップS406以降が繰り返される。この場合、対象テストシナリオについて、異なるテスト入力値の組み合わせが生成されてテストケースが実行される。
一方、対象画面の各フォームに対するテスト入力値としてテストシナリオ生成部12が生成しうる全ての入力値が生成された場合(S414でYes)、テスト資材生成部15は、入力情報補助ファイルに、対象画面のURL及びタイトルと、対象画面の各フォームの周辺情報(ラベル、id及びname)等を追加(記録)する(S415)。すなわち、入力情報補助ファイルには、全ての画面遷移を網羅する入力値を生成できなかった画面ごとに、URL、タイトル、各フォームの周辺情報が記録される。ここで入力情報補助ファイルに登録されたフォームに対する入力値の入力が、図7のステップS111においてユーザによって補助される。
なお、入力情報補助ファイルの形式は所定のものに限定されないが、例えば、表形式ファイルが好適である。また、入力情報補助ファイルは、例えば、補助記憶装置102に記憶される。
なお、ステップS414の判定は、ステップS406以降の繰り返し回数が上限に達したか否かに基づいて行われてもよい。
続いて、ステップS406の詳細について説明する。図13は、テスト入力値の生成処理の処理手順の一例を説明するためのフローチャートである。
ステップS501〜S508は、対象テストシナリオにおいて入力対象とされるフォーム(対象画面のフォーム)ごとに実行される。以下、処理対象のフォームを「対象フォーム」という。
ステップS502において、テストシナリオ生成部12は、対象フォームの周辺情報(又は属性情報)を対象HTMLから取得する。本実施の形態では、対象フォームのラベル(label)、id及びname等が周辺情報として取得される。例えば、対象フォームが、図12の3つ目のフォーム(メールアドレスの入力フォーム)である場合に、当該フォームに関するHTMLの記述情報が図14の通りであったとすると、ラベル(label)として「メールアドレスを入力して下さい」、idとして「ma」、nameとして「mail」が取得される。
続いて、テストシナリオ生成部12は、当該周辺情報と、対象画面のURL及びタイトルとの組み合わせが、入力情報補助ファイルに登録されているか否かを判定する(S503)。すなわち、対象フォームが入力情報補助ファイルに登録されているか否かが判定される。
対象フォームが入力情報補助ファイルに登録されていない場合(S503でNo)、テストシナリオ生成部12は、ステップS502において取得された周辺情報としての各文字列を形態素解析技術を用いて単語に分割する(S504)。上記の例によれば、例えば、["メールアドレス"、"入力"、"mail"、"ma"]といった単語群が得られる。
続くステップS505〜S507では、当該単語群に含まれる単語ごとに、ステップS506が実行される。以下、処理対象の単語を「対象単語」という。ステップS506において、テストシナリオ生成部12は、予め用意された辞書から対象単語に対応する値を検索し、検索された値を対象フォームに対する入力値とする。
図15は、辞書の一例を示す図である。図15に示されるように、辞書は、項目ごとに項目名と、当該項目に関する具体的な値とを含む情報であり、例えば、補助記憶装置102等に記憶されている。又は、何らかのシステムのユーザの属性情報を記憶したDBが辞書として利用されてもよい。
ステップS506において、テストシナリオ生成部12は、対象単語に一致する項目名を辞書から検索する。但し、同意語辞書を用いて、対象単語に類似した意味を有する項目名が検索されてもよい。該当する項目名が検索された場合、テストシナリオ生成部12は、当該項目名に係る項目に登録されている具体的な値を入力値として取得する。該当する項目名が検索されない場合、入力値は取得されない。
例えば、["メールアドレス"、"入力"、"mail"、"ma"]の中では、"メールアドレス"が対象単語である場合に、入力値として、例えば「xxx@xxx.xx」が取得される。なお、["メールアドレス"、"入力"、"mail"、"ma"]の例では、1つの入力値しか取得されないが、それぞれ別の項目名に一致するような複数の単語が周辺情報から抽出されたフォームに関しては、複数の入力値が生成される可能性も有る。
一方、対象フォームが入力情報補助ファイルに登録されている場合(S503でYes)、テストシナリオ生成部12は、対象フォームの周辺情報等に対応付けられて入力情報補助ファイルに記録されている値を入力値として取得する(S509)、この場合、対象フォームに関する処理は終了する。なお、対象フォームに関して図19のステップS111が実行されていれば、対象フォームに対する入力値が入力情報補助ファイルに記録されている。
続いて、図11のステップS405及びS411の詳細について説明する。図16は、遷移先画面の判定処理の処理手順の一例を説明するためのフローチャートである。
ステップS601において、画面評価部14は、遷移リストの中のリクエストAを含むいずれかの要素の中に、現在の遷移先画面(すなわち、対象画面)のURLが遷移後画面のURLとして含まれているか否かを判定する。現在の遷移先画面のURLがリクエストAの遷移後画面のURLとして遷移リストに含まれていない場合(S601でNo)、画面評価部14は、リクエストA、遷移前画面のURL、現在の遷移先画面のURL、現在の遷移先画面のHTML(対象HTML)、及び対象テストシナリオに係るテストケースをセットとする要素を遷移リストに追加する(S602)。
一方、現在の遷移先画面のURLがリクエストAの遷移後画面のURLとして遷移リストに含まれている場合(S601でYes)、画面評価部14は、遷移リストにおいてリクエストAを含み、かつ、現在の遷移先画面のURLを遷移後画面のURLとして含む要素の遷移後画面のHTMLデータごとに、ステップS603〜S611を実行する。以下、処理対象とされているHTMLを「対象遷移済みHTML」という。また、現在の遷移先画面のHTMLを、上記において定義した通り「対象HTML」という。
続いて、画面評価部14は、対象遷移済みHTML及び対象HTMLのそれぞれについて、ステップS604〜S608を実行する。対象遷移済みHTML及び対象HTMLのうち、処理対象とされているHTMLを、「着目HTML」という。
ステップS605において、画面評価部14は、着目HTMLのDOMツリーを生成する。図17にDOMツリーの一例を示す。図17に示されるように、DOMツリーは、各ノード(各画面要素)の階層構造を示す。
続いて、画面評価部14は、画面の役割に影響を与えない(すなわち、画面の識別に影響を与えない)ノードを、DOMツリーから削除する(S606)。画面の役割に影響を与えないノードとは、属性ノード、テキストノード、及び文字の大きさや字体、位置を表すノード(Centerタグ、Uタグなど)等の3種類である。したがって、図17において破線の矩形で示されているノードが削除される。
続いて、画面評価部14は、DOMツリーにおいて並列関係を有するノード(並列ノード)を1つのノードに集約する(S607)。並列ノードとは、DOMツリーの階層構造において同じ階層に属する同じタグ名の複数のノードをいう。図17では、1点鎖線で囲まれている2つの<h1>タグに対応するノードが並列ノードに該当する。ノードの集約は、並列ノードのうちの1つを残して他を削除することによって実現されてもよいし、各ノードを抽象化した1つのノードによって、並列ノードを置換することによって実現されてもよい。
ステップS604〜S608が対象遷移済みHTML及び対象HTMLのそれぞれについて実行されることにより、それぞれについて抽象化されたDOMツリーが生成される。
続いて、画面評価部14は、抽象化された2つのDOMツリーのそれぞれをHTMLに変換し、変換結果を比較して、比較結果を出力する(S609)。すなわち、対象遷移済みHTMLに係る画面と、対象HTMLに係る画面との同一性が判定される。比較されたHTMLが一致する場合、「一致」が比較結果として出力される。そうでない場合、「不一致」が比較結果として出力される。なお、比較されたHTMLの一致には、完全一致が要求されなくてもよい。例えば、同一タグの出現順等が異なることが許容されてもよい。
比較結果が「一致」である場合(S610でYes)、対象遷移済みHTMLに関する処理は終了する。比較結果が「不一致」である場合(S610でNo)、画面評価部14は、ステップS602と同じ処理を実行して(S612)、図16の処理を終了する。
続いて、図7のステップS109の詳細について説明する。図18は、画面遷移図の生成処理の処理手順の一例を説明するためのフローチャートである。
ステップS701〜S703は、遷移リストに含まれている要素(遷移前画面のURL、遷移後画面のURL、リクエスト、遷移後画面のHTML、及びテストケースのセット)ごとに実行される。以下、処理対象の要素を「対象要素」という。
ステップS702において、テスト資材生成部15は、画面遷移図リストに、対象要素のリクエスト、対象要素の遷移前画面のURL、対象要素の遷移後画面のURLを含む要素を追加する。すなわち、画面遷移図リストは、リクエスト、遷移前画面のURL、遷移後画面のURLのセットを一つの要素とするリストである。
ステップS704〜S709は、画面遷移図リストの要素ごとに実行される。以下、処理対象の要素を「対象要素」という。
ステップS705において、テスト資材生成部15は、画面遷移図リストにおいて、リクエスト及び遷移前画面のURLが対象要素と共通する要素数をカウントする。当該要素数は、動的解析において同じ画面(遷移前画面)から同じリクエストに基づいて遷移した画面の数である。以下、当該要素数を「動的遷移数n」という。
続いて、テスト資材生成部15は、対象要素のリクエストに対応する遷移先の数を画面遷移情報リストから取得する(S706)。当該遷移先の数は、静的解析においてソースコードから抽出された当該リクエストの遷移先の数である。以下、当該遷移先の数を「静的遷移数m」という。
続いて、テスト資材生成部15は、動的遷移数nが静的遷移数m以上であるか否かを判定する(S707)。動的遷移数nが静的遷移数m以上である場合(S707でYes)、対象要素に対する処理は終了する。動的遷移数nが静的遷移数m未満である場合(S707でNo)、テスト資材生成部15は、動的な遷移と静的な遷移との差異を検出する。すなわち、動的解析において遷移していない画面の存在が検出される。そこで、テスト資材生成部15は、対象要素のリクエストと対象要素の遷移前画面のURLとを含む要素を、m−nの数だけ画面遷移図リストに追加する(S708)。すなわち、図9の破線の矩形に対応する遷移に係る要素が追加される。
画面遷移図リストの全ての要素に対してステップS704〜S709が実行されると、テスト資材生成部15は、画面遷移図リストに基づいて、画面遷移図を生成する(S710)。この際、遷移後画面のURLが無い要素については、破線の矩形等、遷移できなかった画面として表現される。なお、生成された画面遷移図は、表示装置106に表示されてもよいし、画面遷移図を示すデータが、補助記憶装置102に保存されてもよい。
続いて、図7のステップS111の詳細について説明する。図19は、テストケースに対する入力値の補助処理の処理手順の一例を説明するためのフローチャートである。
ステップS801において、テスト資材生成部15は、入力情報補助ファイルを表示装置106に表示する。
図20は、入力情報補助ファイルの表示例を示す図である。図20に示されるように、入力情報補助ファイルは、全ての画面遷移を達成することの出来なかった画面ごとに「URL」及び「タイトル」と、当該画面のフォームごとに、「ラベル」、「id」、「name」、「値」等を記憶可能な形式を有する。このうち、「URL」、「タイトル」、「ラベル」、「id」及び「name」の値は、図11のステップS415において登録されている。
続いて、テスト資材生成部15は、入力情報補助ファイルを介して、各フォームの「値」の入力をユーザから受け付ける(S802)。すなわち、ユーザは、入力情報補助ファイルに登録されている各フォームについて、「ラベル」、「id」及び「name」等を手がかりとして、該フォームに対して適切な値を推測し、当該値を各フォームの「値」に入力する。
続いて、テスト資材生成部15は、「値」が入力された状態の入力情報補助ファイルを保存する(S803)。
なお、入力情報補助ファイルの「値」に対して値が入力された後で、ステップS101が実行された場合、図13のステップS503では、入力情報補助ファイルに登録された各フォームに関してYesの判定となる。したがて、ステップS509において、当該各フォームについては、入力情報補助ファイルから入力値が取得される。その結果、前回では実現できなかった画面遷移を実現できる可能性が高まる。
続いて、図7のステップS112の詳細について説明する。図21は、テストスクリプトの出力処理の処理手順の一例を説明するためのフローチャートである。
ステップS901〜S903において、テスト資材生成部15は、遷移リストの各要素に含まれているテストケースをスクリプトの形式で出力することで、テストスクリプトを出力する(S902)。
上述したように、本実施の形態によれば、Webアプリケーションの仕様として予定された画面遷移の情報(静的な画面遷移の情報)をソースコードから抽出し、Webアプリケーションに対する操作を自動的に実行して画面遷移を繰り返すことで発生した画面遷移の情報(動的な画面遷移の情報)を自動的に抽出し、静的な画面遷移の情報と動的な画面遷移の情報との差異を検出することができる。その結果、ソースコード上で定義されていながらテストスクリプトでは発生させることができない画面遷移を検出することができる。この際に、本実施の形態では、テストスクリプトでは発生させることができなかった画面遷移の遷移元の画面の各入力領域(各フォーム)に関する周辺情報が、入力情報補助ファイルに記録される。その後、入力情報補助ファイルが表示され、当該各入力領域に対する入力値がユーザによって入力される。
したがって、ユーザによる入力値の入力負担を出来るだけ小さくすることができると共に、テストスクリプトでは発生させることができなかった画面遷移が実現される可能性を高めることができる。その結果、Webアプリケーションに関するテストの実行を効率化することができる。
また、ユーザから入力値を受け付ける際には、各入力フォームの周辺情報が表示される。したがって、ユーザは、当該周辺情報を手がかりとして、各入力フォームに適した値を推測することができる。
また、本実施の形態によれば、テスト対象から仕様をリバースし、リバースした仕様に基づいてテストケースを自動生成し、テストスクリプトとして出力することができる。これによりWebアプリケーションにおける網羅的な画面遷移テストのテストスクリプト生成を追加の稼働を必要とせずに自動で行うことができる。その結果、例えば、ソフトウェアテストにかかる費用を削減することができる。
また、本実施の形態によれば、技術課題1に関して、テスト対象から自動で、テスト対象を構成する画面と画面間の繋がり、各画面に到達するための手段を漏れなくリバースすることができる。また、静的解析によって、予めリクエストに対する画面遷移数の情報が入手できるため、動的解析中に探索打切りの判断を下しやすくなり、現実的な時間内で処理を行うことができる。本実施の形態ではサーバサイドの情報は必要としないため、ユーザはサーバサイドの情報を取得できるようにする環境を整える必要が無く、ツール導入のための追加稼働を抑えることができる。
また、本実施の形態によれば、技術課題2に関して、クライアントサイドの情報(HTML)を用いて、画面遷移を実現するための適切なテスト入力値を生成することができる。従来技術と異なり、サーバサイドの情報は必要としないため、ユーザはサーバサイドの情報を取得できるようにする環境を整える必要が無く、ツール導入のための追加稼働を抑えることができる。また、適切なテスト入力値を生成できなかった場合であっても、上記したようにユーザによる補助を受けることができるため、画面遷移を網羅できる可能性を高めることができる。
更に、本実施の形態によれば、技術課題3に関して、閾値の設定を必要とせずに機能テストにおける適切な画面識別が可能となり、検証パターンの質を向上させることができる。
なお、本実施の形態において、クライアント装置10は、テスト実行装置の一例である。画面遷移情報抽出部11は、抽出部の一例である。テストシナリオ生成部12は、第1の生成部の一例である。画面自動操作部13は、操作部の一例である。画面評価部14は、第2の生成部の一例である。テスト資材生成部15は、受付部及び記録部、の一例である。HTMLデータは、画面の記述情報の一例である。画面遷移情報リストは、第1の画面遷移の情報の一例である。遷移リストは、第2の画面遷移の情報の一例である。入力情報補助ファイル(補助記憶装置102)は、記憶部の一例である。
以上、本発明の実施例について詳述したが、本発明は斯かる特定の実施形態に限定されるものではなく、特許請求の範囲に記載された本発明の要旨の範囲内において、種々の変形・変更が可能である。