最近のソフトウェアの大部分はグラフィカルユーザインタフェース(以下GUI)を備えており、GUIへの操作によってGUIが期待通りに変化することのテストは、ソフトウェア開発において必須の作業である。GUIの多くはウインドウシステムを採用しており、ウインドウ内のボタンやテキストボックスなどGUI要素を操作することでGUIが変化する。これをGUIの状態遷移と呼ぶ。ここでの操作とは具体的には、マウスクリックやキーボード入力などのことである。もし、このような操作による変化後のGUIが期待どおりの状態ではなかった場合、これをGUIのエラーと言う。
GUIのエラーを発見するためには、GUIに対するあらゆる操作手順を実行し、操作後のGUIを確認する必要がある。しかし、GUIは多くのGUI要素で構成されているため、その操作順番の組合せは膨大な数に及ぶ。よってこの確認を人手で行うと、その作業は膨大な工数を必要とする。
従来技術として、GUIの要素を自動操作し実際にGUIを遷移させ、さらに遷移したGUIに対して自動操作を再帰的に繰り返す技術が提案されている。このような自動操作の結果、GUI要素の操作に対するGUIの遷移を表現する状態遷移グラフを生成することができる。このような状態遷移グラフを使ってGUIのエラーの検出や、GUIをテストするためのテストケース生成が可能となる。ここでは、それら自動操作の従来技術とその問題点を説明する。
非特許文献1では、初期のGUIとして表示されている複数のウインドウ内のGUI要素を順次自動的に操作する。GUI要素を操作すると新規にウインドウが表示される(あるいはブラウザ等をベースとしたGUIの場合は、別のGUI要素で構成されるGUIに表示が切り替わる)場合があり、その場合は、新規ウインドウ内のGUI要素に対して同様の処理を再帰的に繰り返す。例えば図1のように初期のGUIが1つのウインドウで構成され、そのウインドウ内のGUI要素として2つのラジオボタンと1つのボタンが存在する場合を考える。ボタンを押すとラジオボタンの選択状態に応じて、GUIが(a),(b)あるいは(c)へと切り替わる。このようなGUIに対して非特許文献1の技術を適用すると、以下のような手順で自動操作する。
1.ラジオボタン1を操作(ラジオボタン1が選択状態になる)
2.ラジオボタン2を操作(ラジオボタン2が選択状態になる。ラジオボタン1の選択状態は解除される。)
3.ボタン1を操作(GUIが(c)に切り替わる。)
4.GUI(c)のGUI要素(キャプションがYes,Noのボタン)を操作。
非特許文献1の問題は、自動操作の過程で出現する各GUI要素を1度しか操作しない点である。結果として先ほどの自動操作の手順のように、(a)や(b)のGUIへ遷移することができず、生成される状態遷移グラフも(a)や(b)への遷移が欠けた不完全なものとなる。
このような非特許文献1の問題に対して、非特許文献2のようにGUIの状態に対して網羅的に自動操作することでより精密なGUIの状態遷移グラフを生成する技術が提案されている。GUIの状態とは、GUIとして表示されているGUI要素の構造を表現した情報である。GUI要素はキャプションや活性状態、選択状態等のプロパティとその値の情報を保持している。GUIを構成する要素の状態は、GUI要素名,プロパティ,プロパティの値という組の集合で表現できる。図2に図1の初期のGUIの各要素の状態の例を示す。GUIは複数のウインドウで構成される。よって各ウインドウの状態とはそれらウインドウを構成するGUI要素の状態の集合である。そしてGUIの状態は各ウインドウの状態の集合で表現することができる。非特許文献2では、GUIの状態をDOM(Document Object Model)で表現しているが本説明の状態表現と表現形式が異なるだけで意味は同じである。
例えば、図1の初期のGUIはラジオボタンの選択に応じて異なる状態として表現することができる。ラジオボタン1とラジオボタン2ともに未選択の場合、ラジオボタン1を選択した場合、ラジオボタン2を選択した場合のGUIの状態を図3に示す。このGUIではウインドウは1つしか存在しないため、それぞれのウインドウの状態をw0,w1,w2とすると、各GUIの状態は{w0},{w1},{w2}となる。
非特許文献2では、まずテスト対象のアプリケーションを起動し、初期のGUIを表示させる。初期のGUIからGUIの状態を取得し、操作可能なGUI要素を自動操作する。この処理によって表示されているGUIの状態が変化するため、変化したGUIの状態に対して同様の処理を再帰的に繰り返す。このようにすることで、例えば、図3の各状態においてボタン1を自動操作すれば、図1のGUI(a)(b)(c)へ遷移することが可能になるため、非特許文献1より精密な状態遷移グラフが構築できる。
このように出現したすべてのGUIの状態に対して網羅的にGUI要素を自動操作するためには、自動操作の過程で出現したGUIの状態と、そのGUIの状態において操作したGUI要素を記憶しておく必要がある。記憶しなかった場合、同じGUIの状態が出現したときに、過去に操作したことのあるGUI要素を繰り返し操作してしまい、無限ループに陥る可能性がある。そこで、非特許文献2では、GUIの状態の集合Sと状態遷移の集合Tに対して、出現したGUIの状態や発生した状態遷移をそれぞれの集合に追加し記憶する。
具体的には、現在表示されているGUIの状態を取得し、そのGUIの状態が過去に出現したことがあるか、すなわちGUI状態の集合Sに現在のGUI状態が含まれるか調べる。もし含まれなければ、そのGUIの状態をGUI状態の集合Sに追加する。さらに現在のGUI状態において可能な状態遷移を状態遷移の集合Tに追加する。状態遷移とは形式的には、操作前の状態,操作するGUI要素,操作後の状態の組で表現できる。
例えば、図1の初期のGUIに対して、非特許文献2による自動操作を実施した場合を考える。まずディスプレイには初期のGUIが表示されるため、初期GUIの状態s0={w0}を取得する。GUI状態s0は状態の集合Sにまだ登録されていないため、集合SにGUI状態s0を追加する。さらにこのGUI状態ではラジオボタン1,ラジオボタン2,ボタン1が操作可能であるため、状態遷移として(s0,ラジオボタン1,TBD),(s0,ラジオボタン2,TBD),(s0,ボタン1,TBD)を集合Tに追加する(図4)。図4の状態遷移の集合Tを示す表の各行が追加した状態遷移に対応する。状態遷移における操作後の状態がTBDであるのは、まだ未操作であるため、操作後の状態が未決定(To Be Determined)であることを意味する。これ以降ではGUIの状態のことを単に状態と呼ぶ。
次に現在の状態s0において未操作である遷移を1つ選択し、そのGUI要素を自動操作する。例えばここでは、図4の集合Tからラジオボタン1を自動操作したとする。その結果、GUIは図5のように変化する。このGUIの状態をs1とすると先ほど選択した状態遷移(s0,ラジオボタン1,TBD)を(s0,ラジオボタン1,s1)に置き換える。以降はこれまでの処理を再帰的に現在の状態s1に対して繰り返す。すなわち状態s1が集合Sに含まれるか調べ、含まれていないため集合Sにs1を追加する。さらに状態s1に対して可能な遷移を集合Tに追加する。そして、状態s1で可能な遷移を1つ選択し、例えばラジオボタン1を自動操作する。このときの状態の集合Sと状態遷移の集合Tを図6に示す。
このように初期のGUIから自動操作処理を繰り返したときのGUIの状態遷移を図7に示す。GUIの状態はs0,s1,s1,s2,s1,s3,のように遷移し、状態s3において終了ボタン(ボタン2)を押してアプリケーションが終了するまで継続される。この時点でのGUI状態の集合Sと状態遷移の集合Tを図8に示す。アプリケーションが終了してしまった場合、非特許文献2はアプリケーションを再起動し初期のGUIを表示し処理を繰り返す。
非特許文献2はこのような自動操作の結果、状態遷移グラフを生成することができる。状態遷移グラフとは形式的には、GUI状態の集合と状態遷移の集合の対<S、T>で表現する。状態遷移グラフを図形式で表現するとき、Sに含まれる状態をノードで表現し、状態遷移はノード間の有向エッジとして表現する。すなわち、Tに含まれる遷移において操作前の状態と対応するノードから操作後の状態と対応するノードへエッジを引く。さらにエッジには遷移のGUI要素をラベルとして記述する。図8のGUIの状態集合Sと状態遷移Tの状態遷移グラフの図形式を図9に示す。図中のエッジで先がノードを示していないもの、例えばノードs0のラジオボタン2やボタン1というラベルのエッジは、操作後の状態がTBDである状態遷移を意味している。
このように自動操作処理を継続していくと、表示されているGUI状態sにおいて未操作のGUI要素が存在しない場合がある。もしこのとき、他のGUIの状態s’に未操作のGUI要素が存在するならば、自動操作によって状態sから状態s’にGUIを遷移させ、未操作のGUI要素を操作する必要がある。例えば、表示されているGUIの状態がs1だった場合、図9の状態遷移グラフが示すようにs1には未操作の状態遷移が存在しない。よって、例えば未操作の状態遷移が存在する状態s2にGUIを遷移させる必要がある。
非特許文献2では状態sから状態s’にGUIを遷移させるために、この状態遷移グラフ上で状態sから状態s’へ到達するパスを利用する。パスとは、状態遷移をt1,t2,t3,…,tnとするとき、状態遷移の有限列t1t2t3…tnのことである。ただし、t1の操作前の状態はsで、tnの操作後の状態はs’でなければならない。さらに、1≦i≦n−1に対して、状態遷移tiの操作後の状態とti+1の操作前の状態が等しい必要がある。例えば、状態s1からs2へのパスは(s1,ラジオボタン2,s2)となる。パスの状態遷移t1からtnまでのGUI要素を順次自動操作することでGUIの状態をs’に遷移させることができる。
しかし、現実的には必ずGUIの状態sをs’に遷移させることができるとは限らない。例えば状態sからs’へのパスが見つからない場合がある。その場合には、初期状態からは必ず任意の状態へのパスを発見することができるため、アプリケーションを再起動して、初期のGUI状態から状態s’へのパスを状態遷移グラフ上で求める。そしてパスに沿ってGUI要素を自動操作し状態s’に遷移させる。このように非特許文献2は、これまでの処理をすべてのGUIの状態に対して、未操作のGUI要素が存在しなくなるまで繰り返す。これによってGUIの状態に対して網羅的に自動操作することが可能となり、非特許文献1に比べてより精密な状態遷移グラフを生成することができる。
本発明の一実施の形態に係るグラフィカルユーザインタフェースの網羅的な自動操作方法を実施する装置について図12を参照して説明する。ここでは周知のコンピュータ上に実現した例を示すもので、図中、1は入力装置、2はコンピュータ本体、3は記憶装置、4は表示装置である。
入力装置1は、キーボード、マウス等からなり、ユーザがコンピュータ本体2に所定の情報、ここでは起動ファイルと状態遷移グラフ利用フラグを入力するためのものである。起動ファイル及び状態遷移グラフ利用フラグについては後述する。
記憶装置3は、入力装置1から入力された起動ファイル及び状態遷移グラフ利用フラグや、網羅操作制御部5が実施する図14から図17の手続の出力結果であるGUI状態の集合Sと状態遷移の集合T、実行パスの集合Pを記憶保存するとともに、各種処理において必要な情報の一次記憶を行う装置である。
表示装置4は、液晶ディスプレイ、CRT等画像表示装置等からなり、網羅操作制御部5が実施する図14から図17の手続の過程で起動ファイルを実行することによって、起動されるアプリケーションのGUIを表示するためのものである。また、記憶装置3に保存されているGUI状態の集合Sと状態遷移の集合T、実行パスの集合Pの内容を表示することができる。また状態遷移グラフ<S,T>を図形式で表示することができる。
コンピュータ本体2は、各装置を制御するとともに、網羅操作制御部5、GUI状態取得部6、GUI自動操作部7、状態遷移グラフ探索部8、実行パス集合探索部9を構成する。なお、コンピュータ本体2の各部は、ハードウェアにより構成してもよいし、コンピュータ本体2にプログラムをインストールすることによって構成してもよい。なお該プログラムは、記録媒体に記録することも、ネットワークを通して提供することも可能である。
網羅操作制御部5は、テスト対象アプリケーションの全てのGUIの状態を網羅的に取得する処理を制御するものであり、入力装置1より与えられた起動ファイルを実行することでテスト対象アプリケーションを起動し、GUI状態取得部6によりGUIの状態を取得し、GUI自動操作部7により未操作のGUI要素を自動操作する。この自動操作によってGUI状態が遷移するため、遷移したGUIの状態に対してこれらの処理を再帰的に繰り返す。網羅操作制御部5の動作については後述する。
GUI状態取得部6は、表示装置4に表示されているアプリケーションのGUIの状態を取得することができる。GUI状態取得部6は、網羅操作制御部5が図14から図17の手続を実施するにあたって、ステップS4,S596,S5998において呼び出される。
GUI自動操作部7は、網羅操作制御部5が指定するGUI要素を表示装置4が表示するGUIに対して自動操作することができる。GUI自動操作部7は、網羅操作制御部5が図14から図17の手続を実施するにあたって、ステップS595,S5997において呼び出される。
状態遷移グラフ探索部8は、網羅操作制御部5が指定するGUIの状態から未操作のGUI要素が存在する状態へのパスを探索する。このとき本発明による網羅操作の過程で蓄積されるGUI状態の集合Sと状態遷移の集合Tからなる状態遷移グラフ<S,T>を対象にパスを探索する。状態遷移グラフ上のパスの探索は公知の技術によって実現できる。状態遷移グラフ探索部8は、網羅操作制御部5が図14から図17の手続を実施するにあたって、ステップS5992において呼び出される。
実行パス集合探索部9は、網羅操作制御部5が指定するGUIの状態から未操作のGUI要素が存在する状態へのパスを探索する。このとき本発明による網羅操作の過程で蓄積される実行パスの集合Pを対象にパスを探索する。実行パスの集合からパスを探索することは公知の技術によって実現できる。実行パス集合探索部9は、網羅操作制御部5が図14から図17の手続を実施するにあたって、ステップS5993において呼び出す。
次に、前述の起動ファイルについて説明する。起動ファイルとは、テスト対象アプリケーションを起動するためのコマンドが記述されたものであり、Microsoft社のWindows(登録商標)のバッチファイルや、Linux(登録商標)などのシェルスクリプトなどからなる。起動ファイルを実行することで、テスト対象のアプリケーションを起動することができる。起動ファイルには、テスト対象アプリケーションを起動するコマンドだけでなく、そのアプリケーションが実行中にデータを書き込む場合には、そのデータを初期化するコマンドも記述する必要がある。代表的なオペレーティングシステムであるMicrosoft社のWindows(登録商標)標準付属のメモ帳の起動ファイルの例を図13に示す。メモ帳はデータをオペレーティングシステムのレジストリに書き込むことから、reg addコマンドによりそのデータを初期化している。またstartコマンドによりメモ帳を起動することができる。
次に、前述の状態遷移グラフ利用フラグについて説明する。本実施の形態では、あるGUIの状態から未操作のGUI要素が存在する状態へのパスを探索するために、状態遷移グラフ探索部8と実行パス集合探索部9とを備えている。両探索部8,9はアルゴリズムが異なるものであり、探索時の状況やGUIの状態の特性等によっては、状態遷移グラフ探索部8では解が求まる場合であっても他方の実行パス集合探索部9では解が求まらない場合がある。他方、状態遷移グラフ探索部8の処理時間は、実行パス集合探索部9よりも長くなる場合がある。そこで本発明では、状況や特性等に応じて状態遷移グラフ利用フラグとしてtrue又はfalseの何れかを適宜設定することにより、状態遷移グラフ利用フラグの値に応じて状態遷移グラフ探索部8と実行パス集合探索部9の利用を選択可能にしている。状態遷移グラフ利用フラグの値によってどのように動作が変化するかについては、下記の網羅操作制御部5についての動作説明において明らかになる。
次に網羅操作制御部5の動作について詳述する。網羅操作制御部5は、図14の手続を実施する。図14の手続では、入力装置1より与えられた起動ファイルを実行することでテスト対象アプリケーションを起動し(ステップS1)、初期のGUI画面を表示装置4へ表示する。さらにGUIの状態の集合S、状態遷移の集合T、実行パスの集合Pを空集合に設定する(ステップS2)。実行パスとは自動操作によって実際に変化した状態遷移の列のことである。状態遷移グラフ上のパスと区別して実行パスと呼ぶことにする。次いで実行パスπに、長さ0の列を意味する定数εを設定する(ステップS3)。GUI状態取得部6を利用して現在表示されているGUIの状態を取得し、これをs0とおく。また現在の状態を表す変数sにs0を代入する(ステップS4)。最後に図15の手続を実施する(ステップS5)。
図15の手続においては、まず、現在の状態sが状態の集合Sに含まれるか調べる(ステップS51)。もし含まれない場合には、現在の状態sを集合Sに追加する(ステップS52)。さらに現在の状態sから操作可能なGUI要素の集合Eを抽出する(ステップS53)。そしてEに含まれるGUI要素をeとするとき、すべてのGUI要素に対して、状態遷移(s,e,TBD)を状態遷移の集合Tに追加する(ステップS54,S55,S56)。このような状態遷移の追加処理が完了した場合、あるいは、ステップS51にて現在の状態sが状態の集合Sに含まれている場合は、状態遷移の集合Tに操作後の状態がTBDである状態遷移が存在しないか調べる(ステップS57)。存在しない場合は、網羅的な自動操作が完了したことになるため、それまで蓄積したGUI状態の集合S、状態遷移の集合T、実行パスの集合Pを記憶装置に出力し(ステップS58)、手続を終了する。ステップS57にてTBDである状態遷移が存在する場合は、図16の手続を実行する(ステップS59)。
図16の手続においては、まずアプリケーションが終了していて、GUIが何も表示されていないか調べる(ステップS591)。もし終了している場合には、起動ファイルを使ってアプリケーションを再起動する(ステップS592)。さらに、実行パスπを実行パスの集合Pへ追加し、πに長さが0の列を意味する定数εを代入し、現在の状態を示す変数sに初期状態s0を代入する(ステップS593)。そして図15の手続のステップS51に戻る。もしステップS591でアプリケーションが終了していない場合には、変数sの示す現在の状態において未操作のGUI要素が存在するか調べる。すなわち状態遷移の集合Tの中に操作前の状態がsで、操作後の状態がTBDであるような状態遷移tを探し出す(ステップS594)。状態遷移tのGUI要素をeとすれば、t=(s,e,TBD)と表現することができる。このような状態遷移tが存在する場合、GUI自動操作部7によってtのGUI要素eを自動操作し(ステップS595)、GUIを遷移させる。さらに遷移したGUIの状態をGUI状態取得部6を利用して取得し、変数s’に代入する(ステップS596)。この処理によって状態遷移tの操作後の状態が決定するため、tを(s,e,s’)で置き換える(ステップS597)。実行パスπの末尾に状態遷移tを追加し、現在の状態を示す変数sをs’に置き換える(ステップS598)。そして図15の手続のS51へ戻る。もし、ステップS594にて、状態遷移tが発見できない場合には、図17の手続を実施する(ステップS599)。
図17の手続においては、入力装置1から与えられた状態遷移利用フラグの値と、現在の状態を示す変数sの値を調べる(ステップS5991)。変数sがアプリケーションを再起動した直後の初期状態s0でない場合には状態遷移グラフ利用フラグがtrueであれば、状態遷移グラフ探索部8によって状態遷移グラフ<S,T>上で、変数sが示す状態から未操作のGUI要素が存在する状態s’へのパスpを探索する(ステップS5992)。もし状態遷移グラフ利用フラグがfalseであれば、実行パス集合探索部9によって実行パスの集合P∪{π}から同様のパスpを探索する(ステップS5993)。次いでステップS5992あるいはステップS5993にてパスpが発見できたか調べる(ステップS5994)。もし発見できなければ、変数sの示す状態(ただし、アプリケーション再起動後の初期状態ではない)から状態s’へGUIを遷移することができない。よってアプリケーションを再起動して手続を継続するために、図16のステップS592に戻る。もしパスpが発見できた場合には、パスpの先頭の状態遷移をt=(st,et,st’)として取り出し(ステップS5996)、GUI自動操作部7がGUI要素etを操作する(ステップS5997)。それによってGUIが遷移するためGUI状態取得部6を利用してGUIの状態を取得し、現在の状態を示す変数sに代入する(ステップS5998)。さらにパスπの末尾に状態遷移(st,et,s)を追加し、状態遷移の集合Tへ状態遷移(st,et,s)を追加する(ステップS5999)。このとき変数sの示す現在の状態がGUI状態の集合Sに含まれている、あるいは、その状態において未操作のGUI要素が存在するか調べる(ステップS59910)。もしこの条件に合致しない場合には、ステップS5995に戻って、パスpの次の先頭を取り出しステップS5995からS59910を実行する。パスpに含まれていたすべての状態遷移に対してステップS5995からS59910を実行し、ステップS5995でパスの長さが0になっていたら、パスpに沿ってGUI要素を自動操作しても、未操作のGUI要素を持つ状態へ到達できないことになる。よってテスト対象アプリケーションを再起動し処理を継続するために図16のステップS592へ戻る。
もしパスpの先頭の状態遷移t=(st,et,st’)に対してステップS5995からS59910を実行し、GUI要素etを操作してGUIの状態が集合Sに含まれていない、あるいは、そのGUIの状態において未操作のGUI要素が存在する場合には、図15のステップS51に戻る。
このように図17のステップS5991において、変数sがアプリケーション再起動後の初期状態s0でない場合には、状態遷移グラフ上のパス、あるいは実行パスの集合に含まれるパスを利用したとしても、未操作のGUI要素を持つ状態s’にGUIを遷移させることができない可能性がある点に注意されたい。したがって、本発明を利用するユーザがどちらのパスを利用するかは、状態遷移グラフ利用フラグの値を入力装置1から指定することで、アプリケーションの特性に応じて自由に選択することができる。
例えば、今、実行パスの集合に、s1,s2,s3と状態が遷移したときの実行パスと、s4,s2,s5と遷移したときの実行パスが存在する場合を考える。このときの実行パスの集合Pと状態遷移グラフを図18に示す。今、表示されているGUIの状態がs1で、状態s5に未操作のGUI要素が存在すると仮定する。状態s1から状態s5へのパスを状態遷移グラフ上から発見しようとすると、s1,s2,s5というパスを見つけることができる。一方、実行パスの集合から発見しようとすると、状態s1から状態s5へのパスは見つけることができない。状態遷移グラフ上で見つけたs1,s2,s5と状態が遷移する予定のパスに沿ってGUI要素を自動操作すると、不確実ではあるがアプリケーションによっては適切にGUIの状態をs5へ遷移させることができる場合がある。しかし、逆に状態s5へ遷移させることができないこともあり、その場合はパスに沿ってGUI要素を自動操作することが無駄な処理となる。よって網羅的な自動操作の処理時間が実行パスからパスを探索する場合と比べて長くなることがある。このように本発明を利用するユーザは、アプリケーションの特性に応じて状態遷移グラフ上からパスを探索するか、それとも実行パスの集合からパスを探索するか選択することができる。
図17のステップS5991において、現在の状態を示す変数sがアプリケーションを再起動した後の初期状態s0である場合は、状態遷移グラフ利用フラグの値がtrueかfalseかに関わらず、実行パスの集合からパスを探索するためにステップS5993に進む。GUI状態が状態の集合Sに含まれているということは、過去に初期状態からGUI要素を操作することでその状態へ変化したということなので、初期状態から集合Sに含まれる任意にGUI状態へのパスは実行パスの集合の中に必ず存在する。また再起動後の初期状態では、起動ファイルの実行により書き込まれたデータすべてが初期化されている。よって 実行パスの集合から見つけたパスに沿ってGUI要素を操作すれば、必ずそのパスと同様にGUIを状態遷移させることが可能となる。よって、ステップS5991において、現在の状態を示す変数sがアプリケーションを再起動した後の初期状態s0である場合は、ステップS5993に進んだあと、ステップS5994やステップS5995で図16のステップS592に戻ることはありえない。このように未操作のGUI要素を持つ状態へ、必ず遷移することができるようになるためより精密なGUIの状態遷移グラフを生成することができる。
このように本発明により、GUIの状態に対してGUI要素を網羅的に操作しようとして、未操作のGUI要素が存在しない状態のときに、まず状態遷移グラフ利用有無フラグの指定に応じて、状態遷移グラフあるいは実行パスの集合から未操作のGUI要素が存在するGUI状態へのパスを見つけ、そのパスに沿ってGUI要素を操作することで、未操作のGUI要素が存在する状態へGUIを遷移させることができ、未操作のGUI要素を操作することが可能になる。
もしパスが発見できない、あるいはパスを発見しパスに沿ってGUI要素を操作した結果、未操作のGUI要素が存在する状態へGUIが遷移しなかった場合でも、起動ファイルを実行してアプリケーションを再起動し初期のGUIを表示し、実行パスの集合に対して初期のGUI状態から未操作のGUI要素を持つGUI状態へのパスを見つけ、そのパスに沿ってGUI要素を操作することで、未操作のGUI要素を持つ状態へGUIを遷移させ、未操作のGUI要素を操作することが可能になる。アプリケーションを再起動後の初期のGUI状態からは未操作のGUI要素を持つGUI状態へのパスは、GUI状態の集合Sに未操作のGUI要素を持つGUI状態が存在するならば必ず実行パスの集合Pに存在し、かつそのパスに沿ってGUI要素を操作すると必ず未操作のGUI要素を持つ状態へGUIを遷移させることができる。よって、本発明によりGUIの状態に対して網羅的にかつ確実にGUI要素を操作することができ、従来技術より精密な状態遷移グラフを生成することができる。
なお、前述した実施形態では、網羅操作制御部5、GUI状態取得部6、GUI自動操作部7、状態遷移グラフ探索部8、実行パス集合探索部9をコンピュータ上で実現した例を示したが、ハードウェアで実現してもよい。またこれら各装置が、適切な通信路で相互に接続された複数のハードウェア上に分散して存在し、相互に通信し合いながら実行することもできる。
本発明の装置がテスト対象とするアプリケーションは、コンピュータ本体2において動作してもよいし、適切な通信路で相互に接続されたハードウェア上で動作していてもよい。
本発明による網羅的なGUIの自動操作の実施例について図19〜図32を参照して説明する。
図19は本実施例におけるテスト対象アプリケーションの動作である。このアプリケーションは起動すると状態s0のGUIが表示される。状態s0では操作可能なGUI要素は、メニューと、実行ボタンの2つである。メニューをクリックした場合には、状態s1やs2のようにサブメニューとして終了メニューが表示される。終了メニューにはチェックボックスが存在し終了メニューをクリックすることでチェックやチェックを外すことができる。状態s1は終了メニューのチェックが外れている状態であり、状態s2はチェックされている状態である。s1の状態から終了メニューをクリックすると、チェックされた状態s2へ遷移し、s2の状態から終了メニュ−をクリックするとチェックが外れ状態s1へ遷移する。状態s1およびs2において、メニューをクリックすると状態s0へ戻ることができる。状態s0においてメニューをクリックするとき、もし事前に終了メニューが未チェックであるならば、状態はs1へ遷移する。また終了メニューがチェック済みであるならば状態s2へ遷移する。状態s0において実行ボタンをクリックしたとき、もし事前に終了メニューをクリックしチェックした状態であるなら状態s3へ遷移する。状態s3からYesボタンをクリックすれば、アプリケーションは終了する。アプリケーションが終了し、GUIが表示されていない状態をs5とする。状態s3からNoボタンをクリックした場合には状態s0へ戻る。もし状態s0において実行ボタンをクリックしたとき、事前に終了メニューのチェックを外した状態であるなら状態s4へ遷移する。状態s4において確認ボタンをクリックすると状態s0へ戻る。また状態s4において終了ボタンをクリックするとアプリケーションが終了し状態s5へ遷移する。
本発明による網羅的なGUIの自動操作の実施例では、まず入力装置1から起動ファイルと状態遷移グラフ利用フラグを入力する。ここで入力される起動ファイルを実行しテスト対象アプリケーションを起動した場合、GUIとして状態s0が表示され、そのとき必ず終了メニューはチェック済の状態で起動されるものとする。本発明では、網羅操作制御部5が図14から図17の手続を実施する。まず図14のステップS1にて起動ファイルを実行しテストアプリケーションを起動する。このとき表示装置4にはGUIとして状態s0が表示される。次いでステップS2でGUI状態の集合S、状態遷移の集合T、実行パスの集合を空集合で初期化し、さらにステップS3で実行パスπに長さが0の列であるεを設定する。そしてステップS4で表示されているGUIの状態s0をGUI状態取得部6によって取得し、現在のGUIの状態を示す変数sに代入する。以降では図15の手続を実行しようとするが、その過程で変化するGUIの状態遷移と、各遷移におけるGUI状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図20に示す。
まず図15の手続のステップS51にて初期状態s0が代入された変数sが、GUIの状態の集合Sに含まれているか調べる。集合Sは空集合でありs0が含まれていないためステップS52に進み、集合Sに変数sが示す初期状態s0が追加される。次にステップS53で変数sの示す状態において操作可能なGUI要素の集合Eが取り出される。このとき変数sは初期状態s0を示しているためE={メニュークリック,実行ボタンクリック}となる。ステップS54からS56にて集合Eの各要素に対して、操作後の状態がTBDである状態遷移を作成し状態遷移の集合Tに追加される。すなわち集合Tは空集合であるため、状態遷移t0=(s0,メニュークリック,TBD)とt1=(s0,実行ボタンクリック,TBD)が追加され、T={t0,t1}となる。さらにステップS57では、集合Tに操作後の状態がTBDである状態遷移が存在しないか調べる。ここでは存在するため図16の手続に進む。図16の手続のステップS591ではアプリケーションが終了しているか調べ、終了していないためステップS594に進む。ステップS594では、操作前の状態が変数sの示す初期状態s0であり、操作後の状態がTBDである状態遷移が集合Tに存在するか調べる。t0,t1が該当するがここでは状態遷移tをt0としてステップS595に進む。ステップS595では、状態遷移tのGUI要素、すなわち状態遷移t0のGUI要素であるメニュークリックをGUI自動操作部7によって自動操作する。その結果、テスト対象アプリケーションのGUIは状態s2へ遷移することになる。そこでステップS596、S597では変数s’に遷移後の状態s2を代入し、状態遷移t0の操作後の状態をGUI状態s2に置き換えt0=(s0,メニュークリック,s2)とする。ステップS598では実行パスπの末尾に状態遷移t0を追加し、変数sに変数s’が示す状態s2を代入する。そして図15のステップS51に戻る。この時点でのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図20の(A)に示す。
図15のステップS51からは状態s2を示す変数sに対して同様の処理を実施する。すなわち、ステップS51,S52,S53,S54,S55,S56,S54,S55,S56,S54,S57,S59,S591,S594,S595,S596,S597,S598を実行し、結果としてs2において操作可能なGUI要素であるメニュークリックが自動操作され、GUIは状態s0へ遷移し、変数sには状態s0が代入される。この時点でのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図20の(B)に示す。
次に状態s0を示す変数sに対して図15のステップS51を実行する。この時、状態s0は既に集合Sに含まれているためステップS57へ進む。これ以降はS59,S591,S594と進み、状態遷移tは操作前の状態がs0で操作後の状態がTBDである状態遷移t1となる。S595,S596,S597,S598では、t1のGUI要素である実行ボタンクリックが自動操作され、GUIの状態がs1からs3へ変化する。その結果、t1が(s1,実行ボタンクリック,s3)に更新され、変数sに状態s3が代入される。この時点でのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図20の(C)に示す。
さらに状態s3を示す変数sに対して図15のステップS51が繰り返される。すなわち、ステップS51,S52,S53,S54,S55,S56,S54,S55,S56,S54,S57,S59,S591,S594,S595,S596,S597,S598を実行し、結果としてs3において操作可能なGUI要素であるYesボタンクリックが自動操作され、アプリケーションが終了する。アプリケーションが終了しているときのGUIは状態s5となるため、状態遷移t4が(s3,Yesボタンクリック,s5)、変数sには状態s5が代入される。この時点でのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図20の(D)に示す。
アプリケーションが終了した状態であるs5を示す変数sに対して図15のステップS51を実行すると、まず状態s5は集合Sに含まれていないため、ステップS52で集合Sへ追加される。ステップS53では操作可能なGUI要素は存在しないため集合Eは空集合となる。そのためステップS54からステップS57に進み、操作後の状態がTBDである状態遷移は集合Tに存在する(図20(D)のt3やt5)ためステップS59へ進み図16の手続が実行される。図16のステップS591では、アプリケーションが終了しているため、ステップS592へ進み起動ファイルを実行してテスト対象アプリケーションを再起動する。その結果、表示装置にGUIとして初期状態s0が表示される。ステップS593では、実行パスの集合Pに実行パスπ=t0t2t1t4が追加されP={t0t2t1t4}となる。また変数sに初期状態s0を代入し、実行パスπに長さ0の列を示すεが代入され、図15のステップS51に戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図20の(E)に示す。ただし、状態遷移の集合Tは(D)と同じなので割愛する。
続いて図15のステップS51に戻ってから図15,図16,図17の手続を実行したとき、その過程で変化するGUIの状態遷移と、各遷移におけるGUI状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図21に示す。図15のステップS51において変数sの示す状態s0は集合Sに含まれていて、ステップS57で操作後の状態がTBDである状態遷移が集合Tには存在するため、ステップS59へと進み図16の手続が実行される。図16のステップS591ではアプリケーションが終了していないため、ステップS594に進む。ステップS594では操作前の状態が変数sの示す状態s0で、操作後の状態がTBDである状態遷移が集合Tに存在するか調べる。図21(F)が示すように、ここでは操作前の状態がs0である状態遷移はt0とt1であるが、どちらも操作後の状態はTBDではない。よってステップS599へと進み図17の手続が実行される。図17のステップS5991では、入力として与えられた状態遷移グラフ利用フラグがtrueであり、かつ変数sが再起動した直後の状態s0ではないことを調べる。ここでは状態遷移グラフ利用フラグがtrue,falseどちらの値で与えられていても、変数sの示す状態が再起動した直後の状態s0であるためステップS5993へ進む。ステップS5993では、実行パスの集合Pに対して、変数sが示す状態s0から未操作のGUI要素が存在する状態へのパスpが存在するか調べる。未操作のGUI要素が存在する状態とは、操作後の状態がTBDである状態遷移の操作前の状態のことである。よって図21(F)の状態遷移の集合Tが示すように状態遷移t3,t5の操作前の状態であるs2やs3が該当する。ここで集合Pは{t0t2t1t4}であるため、状態s2へのパスpとしてt0、すなわち(s0,メニュークリック,s2)が抽出されたとする。抽出されたパスpの先頭の状態遷移のGUI要素を順番に自動操作するために、ステップS5994,S5995,S5996,S5997へと進み、パスpから先頭の状態遷移t0を取り出し、そのGUI要素であるメニュークリックがGUI自動操作部7により自動操作される。その結果、表示装置に表示されたGUIが状態s2へと遷移し、ステップS5998にてGUI状態取得部6を利用して状態を取得し変数sに状態s2を代入する。さらにステップS5999で実行パスπに状態遷移t0=(s0,メニュークリック,s2)を追加してπ=t0となる。また集合Tに状態遷移(s0,メニュークリック,s2)を追加するが、結果として同じ状態遷移t0が集合Tに存在するため追加されない。ステップS59910にて変数sの示す状態s2が集合Sに含まれていない、もしくは状態s2に未操作のGUI要素が存在するか調べる。ここでは、状態遷移t3のGUI要素である終了メニュークリックが状態s2において未操作であるため、図15のS51のステップに戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図21の(F)に示す。
さらに状態s2を示す変数sに対して図15のステップS51を実行すると、状態s2は集合Sに登録されているため、ステップS57に進む。ステップS57では、状態遷移の集合Tに操作後の状態がTBDである状態遷移がまだ存在するため、ステップS59へ進み図16の手続が実施される。図16のステップS591ではアプリケーションが終了していないためステップS594へ進み、変数sが示す状態s2が操作前の状態で、操作後の状態がTBDである状態遷移t3が集合Tに存在するため、ステップS595にてt3のGUI要素である終了メニュークリックを自動操作する。その結果、GUIが状態s1へ遷移するので、S596ならびにステップS597を実行し、状態遷移t3を(s2,終了メニュークリック,s1)に更新する。ステップS598では、実行パスπの末尾に状態遷移t3を追加し、さらに変数sに状態s1を代入し、図15のステップS51へ戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図21の(G)に示す。
図15のステップS51にて変数sの示す状態s1は集合Sに含まれていないため、集合Sに状態s1が加えられる。ステップS53にて操作可能なGUI要素としてメニュークリックと終了メニュークリックが集合Eの要素として抽出される。よってステップS54,S55,S56が繰り返し実行され、結果として集合Tに状態遷移t6=(s1,メニュークリック,TBD)とt7=(s1,終了メニュークリック,TBD)が加えられ、ステップS57に進む。さらに集合Tに操作後の状態がTBDである状態遷移が存在するためステップS59に進み、図16の手続を実施する。図16のステップS591では、アプリケーションは終了していないためステップS594に進む。ステップS594では、操作前の状態が変数sの示す状態s1で操作後の状態がTBDである状態遷移が集合Tに存在するか調べ、ここではt6=(s1,メニュークリック,TBD)が存在するので、ステップS595でGUI要素であるメニュークリックを自動操作する。その結果、表示装置に表示されるGUIは状態s0へと遷移する。S596ならびにステップS597で状態遷移t6を(s1,メニュークリック,s0)へと置き換える。そして、ステップS598で実行パスπの末尾に状態遷移t6を追加し、図15のステップS51に戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図21の(H)に示す。
変数sの示す状態s0は集合Sに含まれており、集合Tに操作後の状態がTBDである状態遷移も存在し、アプリケーションも終了していない。さらに操作前の状態が状態s0で操作後の状態がTBDである状態遷移が集合Tには存在しないため、図15のステップS51,S57,S59,図16のステップS591,S594,S599,図17のステップS5991を順次実行する。ステップS5991では、変数sの示す状態s0は初期状態ではあるものの、テスト対象アプリケーションを再起動して直後に表示されたGUIではないため、入力された状態遷移グラフ利用フラグの値に応じて、ステップS5992あるいはステップS5993へと進む。状態遷移グラフ利用フラグがtrueの場合はステップS5992で、状態遷移グラフ探索部8の利用によって、これまで蓄積したGUI状態の集合Sと状態遷移の集合Tで構成される状態遷移グラフから未操作のGUI要素が存在する状態へのパスpを抽出する。一方、状態遷移グラフ利用フラグがfalseの場合は、ステップS5993で実行パス集合探索部9を利用して、これまで蓄積した実行パスの集合Pと実行パスπから未操作のGUI要素が存在する状態へのパスpを抽出する。ここでは、状態s0から未操作のGUI要素を持つ状態であるs3へのパスpを見つける場合を考える。もし、状態遷移グラフ利用フラグがtrueの場合はステップS5992で、図22に示すように状態遷移グラフからパスpとしてt1を抽出することができる。状態遷移グラフ利用フラグがfalseの場合はステップS5993で、図23に示すように実行パスの集合Pと実行パスπからパスpとしてt0t2t1が抽出される。ここでは、状態遷移グラフ利用フラグがtrueであったと仮定して、パスp=t1が抽出されステップS5994に進んだ場合を考える。ステップS5994,S5995,S5996,S5997へと進んだとき、パスpの先頭の状態遷移であるt1のGUI要素である実行ボタンクリックを操作する。しかしこの場合、事前にGUIの状態s2から終了メニューをクリックし状態s1を経由しているため、GUIの状態はs3ではなく、s4へ遷移する。結果としてステップS5998では変数sに状態s4が代入される。状態遷移(s0,実行ボタンクリック,s4)をt8としたとき、ステップS5999では、実行パスπの末尾にt8を追加しt0t3t6t8となる。また状態遷移の集合Tにt8を追加する。続くステップS59910では、変数sの示す状態s4が集合Sに含まれていない、あるいは状態s4に未操作のGUI要素が存在するか調べる。ここでは、状態s4が集合Sに含まれていないため、図15のステップS51へ戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図24の(I)に示す。
変数sの示す状態s4に対して図15のステップS51から処理を継続すると、ステップS51,S52,S53,S54,S55,S56,S54,S55,S56,S54,S57,S59,S591,S594,S595,S596,S597,S598を実行し、結果としてs4において操作可能なGUI要素である確認ボタンクリックが自動操作され、GUIは状態s0へ遷移し、変数sには状態s0が代入される。この時点でのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図24の(J)に示す。
変数sの示す状態s0は集合Sに含まれており、集合Tに操作後の状態がTBDである状態遷移も存在し、アプリケーションも終了していない。さらに操作前の状態が状態s0で操作後の状態がTBDである状態遷移が集合Tには存在しないため、図15のステップS51,S57,S59,図16のステップS591,S594,S599,図17のステップS5991を順次実行する。ステップS5991では、変数sの示す状態s0は初期状態ではあるものの、テスト対象アプリケーションを再起動して直後に表示されたGUIではないため、入力された状態遷移グラフ利用フラグの値をtrueとした場合、ステップS5992へと進む。ステップS5992ではこれまでの状態遷移グラフ<S,T>上で未操作のGUI要素を持つ状態へのパスを探索する。ここでは、状態s0から状態s1へのパスを探索するものとする。このときの状態遷移グラフは図25のようになり、パスpとしてt0t3が取得できる。ステップS5994,S5995,S5996,S5997へと進み、状態遷移t0のGUI要素メニュークリックを自動操作する。このとき終了メニューのチェックが外れている状態であるため、t0と同様のGUIの遷移が発生せず、状態s2ではなく状態s1へと遷移する。ステップS5998,S5999で変数sに状態s1を代入し、このとき状態遷移(s0,メニュークリック,s1)をt11と置くと、実行パスπの末尾にt11を追加し、状態遷移の集合Tにt11を追加する。変数sの示す状態s1においては未操作のGUI要素である終了メニュークリックが存在するため、ステップS59910から図15のステップS51へと戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図26の(K)に示す。
変数sの示す状態s1は集合Sに含まれており、かつ未操作のGUI要素が存在するため、図15のS51,S57,S59,図16のS591,S594,S595,S596,S597,S598へと進み、状態遷移t7のGUI要素である終了メニュークリックが自動操作されGUIが状態s2に遷移する。よって変数sに状態s2が代入され、図15のステップS51へと戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図26の(L)に示す。
変数sの示す状態s2は集合Sに含まれており、かつ未操作のGUI要素が存在しないため、図15のステップS51,S57,S59,図16のステップS591,S594,S599へと進み、図17のステップS5991が実行される。変数sが状態s0ではなく、状態遷移グラフ利用フラグがtrueであるためステップS5992へと進み、状態遷移グラフ上の状態s2から未操作のGUI要素を持つ状態s4へのパスpを探索する。ここでは、状態遷移グラフは図27のようになっているため、パスpとしてt2t8を得ることができる。続く、ステップS5994,S5995,S5996,S5997,S5998,S5999,S59910を繰り返すと、状態遷移t2のGUI要素であるメニュークリックを自動操作しGUIが状態s0へと遷移し、さらに状態遷移t8のGUI要素である実行ボタンクリックを自動操作すると、GUIは状態s4ではなく状態s3へと遷移する。これは実行ボタンを操作する前に状態s2を経由しており終了メニューがチェック済みのためである。変数sに状態s3を代入すると、状態s3では未操作のGUI要素が存在するため、ステップS59910から図15のステップS51へと戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図28の(M)に示す。
変数sの示す状態s3は集合Sに含まれており、かつ未操作のGUI要素が存在するため、図15のステップS51,S57,S59,図16のステップS591,S594,S595,S596,S597,S598へと進み、状態遷移t5のGUI要素であるNoボタンクリックが自動操作されGUIが状態s0に遷移する。よって変数sに状態s0が代入され、図15のステップS51へと戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図28の(N)に示す。
変数sの示す状態s0は集合Sに含まれており、かつ未操作のGUI要素が存在しないため、図15のステップS51,S57,S59,図16のステップS591,S594,S599へと進み、図17のステップS5991が実行される。変数sはテスト対象アプリケーションを再起動した直後の状態s0ではなく、状態遷移グラフ利用フラグがtrueであるためステップS5992へと進み、状態遷移グラフ上の状態s0から未操作のGUI要素を持つ状態s4へのパスpを探索する。ここでは、状態遷移グラフは図29のようになっているため、パスpとしてt8を得ることができる。続くステップS5994,S5995,S5996,S5997,S5998,S5999,S59910によって、状態遷移t8のGUI要素である実行ボタンクリックを自動操作すると、GUIは状態s4ではなく状態s3へと遷移する。これは実行ボタンを操作する前に状態s2を経由しており終了メニューがチェック済みのためである。変数sに状態s3を代入すると、状態s3ではGUI要素が存在しないため、ステップS59910からステップS5995へと戻り、パスに含まれる状態遷移すべてに対して処理を実行したため、図16のステップS592に戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図30の(O)に示す。
図16のステップS592,S593では、起動ファイルを実行しアプリケーションを再起動し、GUIの初期状態であるs0を表示装置に表示する。さらに変数sに状態s0を代入し、図15のステップS51へと戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図30の(P)に示す。ただし、状態遷移の集合は図30の(O)と等しいため省略する。
変数sの示す状態s0が操作前の状態で、操作後の状態がTBDである状態遷移が存在しないため、図15のステップS51,S57,S59,図16のステップS591,S594,S599と進み、図17のステップS5991が実行される。変数sの示す状態s0が、テスト対象アプリケーション再起動直後の状態であるため、ステップS5993へと進む。ステップS5993では実行パス集合探索部9によって実行パスの集合Pおよび実行パスπから未操作へのGUI要素が存在する状態へのパスpが探索される。ここでは状態s0から状態s4へのパスを探索すると、図31に示すように、p=t0t3t6t8が抽出される。ステップS5994,S5995へと進みステップS5995からステップS59910を繰り返し実行して、パスに含まれる状態遷移のGUI要素を先頭から順次、操作することによって、GUIは状態s4へ遷移する。変数sが示す状態s4では未操作のGUI要素が存在するためステップS59910から図15のステップS51へと戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図30の(Q)に示す。ただし、状態遷移の集合は図30の(O)と等しいため省略する。
本発明では、ステップS5991にて変数sの示す状態が、テスト対象アプリケーション再起動直後の状態である場合にはステップS5993に進み、実行パスの集合Pと実行パスπから未操作のGUI要素を持つ状態へのパスを探索する。ここでは非特許文献2と同様に状態遷移グラフ<S,T>から同様のパスを探索する場合を考える。このときの状態遷移グラフは図29のようになるため、例えばパスpとしてt8が抽出される。表示装置に表示されているGUIはテスト対象アプリケーションを再起動直後の状態であり、終了メニューがチェック済みの状態である。よって、t8のGUI要素である実行ボタンを操作してもGUIは状態s4ではなくs3へ遷移してしまう。結果として、どんなに処理を繰り返しても状態s4の未操作のGUI要素を操作することができず、取得する状態遷移グラフは状態や遷移の欠けが多いものになってしまう。本発明では、変数sの示す状態がテスト対象アプリケーション再起動直後の状態である場合には、実行パスの集合Pと実行パスπから抽出した未操作のGUI要素を持つ状態へのパスに沿ってGUI要素を操作する。それによって確実に未操作のGUI要素を持つ状態へGUIを変化させ未操作のGUI要素を漏れなく自動操作することができ、欠けのない状態遷移グラフを取得することができる。
変数sの示す状態s4において、これ以降はステップS51,S57,S59,図16のステップS591,S594,S595,S596,S597,S598を実行し、状態s4において未操作である終了ボタンクリックを操作してGUIの状態はs5へと遷移する。変数sは状態s5を示し図15のステップS51へと戻る。このときのGUIの状態の集合S、状態遷移の集合T、実行パスの集合P、実行パスπを図32の(R)に示す。
変数sの示す状態s5において図15のステップS51を実行すると、集合Sに含まれており、状態遷移の集合Tには、操作後の状態がTBDである状態遷移は存在しない。よって、ステップS51,S57,S58へと進み、記憶装置にGUI状態の集合S、状態遷移の集合T、実行パスの集合Pと実行パスπが記録される。最終的に記憶装置に記録されるGUI状態の集合S、状態遷移の集合T、実行パスの集合Pと実行パスπは図32の(R)となる。
このようにGUIの状態に対して網羅的に操作を実施し、精密な状態遷移グラフを取得することができる。