(57)【要約】【課題】ＧＵＩの状態に対して網羅的に自動操作する技術において、テスト対象アプリケーションが無限のＧＵＩの状態を持つ場合でも、自動操作処理が無限ループに陥らず必ず処理が終了することを可能にする。【解決手段】コンピュータ本体２の表示装置４に表示されているＧＵＩからＧＵＩ要素，プロパティ，プロパティの値の組の集合として表現されるＧＵＩ要素の状態の集合をＧＵＩの状態として取得するＧＵＩ状態取得部７と、ＧＵＩ状態取得部７からの要求に応じて該要求に含まれる状態取得条件に基づきＧＵＩ状態取得部７で取得したＧＵＩの状態を変換するＧＵＩ状態変換部８とを備え、前記ＧＵＩ状態取得部７は、所定の記憶装置３に予め記憶されているすべての状態取得条件に対してＧＵＩ状態変換部８にＧＵＩ状態変換を要求し、最終的に変換されたＧＵＩの状態を処理結果とする。【選択図】図１１
2014044613.tif 000002
【特許請求の範囲】
【請求項１】
コンピュータ上で動作するテスト対象アプリケーションのグラフィカルユーザインタフェース（ＧＵＩ）の状態を取得する方法であって、
入力された１以上の状態取得条件を予め記憶手段に記憶しておく第１のステップと、
コンピュータの表示手段に表示されているＧＵＩからＧＵＩ要素，プロパティ，プロパティの値の組の集合として表現されるＧＵＩ要素の状態の集合をＧＵＩの状態として取得する第２のステップと、
記憶手段に記憶されている状態取得条件に基づき第２のステップで取得したＧＵＩの状態を変換する処理を、すべての状態取得条件に対して繰り返す第３のステップとを備えた
ことを特徴とするグラフィカルユーザインタフェースの状態取得方法。
【請求項２】
前記状態取得条件は、ＧＵＩ要素と、プロパティとを含み、
前記第３のステップは、第２のステップ取得したＧＵＩの状態からＧＵＩ要素，プロパティ，プロパティの値の組を取り出すステップと、
状態取得条件のＧＵＩ要素及びプロパティと取り出した組のＧＵＩ要素及びプロパティが合致するか判定するステップと、
合致する場合には取り出した組を取得したＧＵＩの状態から削除する変換を実施するステップとを含む
ことを特徴とする請求項１記載のグラフィカルユーザインタフェースの状態取得方法。
【請求項３】
前記状態取得条件は、ＧＵＩ要素と、プロパティと、プロパティ値の変換関数とを含み、
前記第３のステップは、第２のステップ取得したＧＵＩの状態からＧＵＩ要素，プロパティ，プロパティの値の組を取り出すステップと、
状態取得条件のＧＵＩ要素及びプロパティと取り出した組のＧＵＩ要素及びプロパティが合致するか判定するステップと、
合致する場合には取り出した組におけるプロパティ値を変換関数の入力として与え、取り出した組をＧＵＩ要素，プロパティ，変換関数の出力値の組に置換する変換を実施するステップとを含む
ことを特徴とする請求項１記載のグラフィカルユーザインタフェースの状態取得方法。
【請求項４】
前記状態取得条件は、ＧＵＩ要素と、しきい値条件の集合とを含み、
前記第３のステップは、第２のステップ取得したＧＵＩの状態からリスト部品のリスト項目であるＧＵＩ要素を取り出し配列に格納するステップと、
配列の要素数が状態取得条件のしきい値条件を満たすか判定するステップと、
配列の要素数がしきい値条件を満たす場合には、配列内においてしきい値条件の最小値より大きい位置に格納されているＧＵＩ要素の状態を取得したＧＵＩの状態から削除する変換を実施するステップとを含む
ことを特徴とする請求項１記載のグラフィカルユーザインタフェースの状態取得方法。
【請求項５】
第３のステップにより最終的に変換されたＧＵＩの状態から未操作のＧＵＩ要素を取得し、該ＧＵＩ要素を自動操作してＧＵＩの状態を遷移させる処理を再帰的に繰り返す第４のステップを備えた
ことを特徴とする請求項１項記載のグラフィカルユーザインタフェースの状態取得方法。
【請求項６】
コンピュータ上で動作するテスト対象アプリケーションのグラフィカルユーザインタフェース（ＧＵＩ）の状態を取得する装置であって、
コンピュータの表示手段に表示されているＧＵＩからＧＵＩ要素，プロパティ，プロパティの値の組の集合として表現されるＧＵＩ要素の状態の集合をＧＵＩの状態として取得するＧＵＩ状態取得手段と、
ＧＵＩ状態取得手段からの要求に応じて該要求に含まれる状態取得条件に基づきＧＵＩ状態取得手段で取得したＧＵＩの状態を変換するＧＵＩ状態変換手段とを備え、
前記ＧＵＩ状態取得手段は、所定の記憶手段に予め記憶されているすべての状態取得条件に対してＧＵＩ状態変換手段にＧＵＩ状態変換を要求し、最終的に変換されたＧＵＩの状態を処理結果とするとともに、
前記ＧＵＩ状態取得手段で取得したＧＵＩの状態から未操作のＧＵＩ要素を取得し、該ＧＵＩ要素を自動操作してＧＵＩの状態を遷移させる処理を再帰的に繰り返す網羅操作手段を備えた
ことを特徴とするグラフィカルユーザインタフェースの状態取得装置。
【請求項７】
コンピュータを請求項６記載の各手段として機能させる
ことを特徴とするグラフィカルユーザインタフェースの状態取得プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、グラフィカルユーザインタフェースの動作を表す状態遷移グラフを生成する技術に関する。
【背景技術】
【０００２】
最近のソフトウェアの大部分はグラフィカルユーザインタフェース（以下ＧＵＩ）を備えており、ＧＵＩへの操作によってＧＵＩが期待通りに変化することのテストは、ソフトウェア開発において必須の作業である。ＧＵＩの多くはウインドウシステムを採用しており、ウインドウ内のボタンやテキストボックスなどＧＵＩ要素を操作することでＧＵＩが変化する。これをＧＵＩの状態遷移と呼ぶ。ここでの操作とは具体的には、マウスクリックやキーボード入力などのことである。もし、このような操作による変化後のＧＵＩが期待どおりの状態ではなかった場合、これをＧＵＩのエラーと言う。
【０００３】
ＧＵＩのエラーを発見するためには、ＧＵＩに対するあらゆる操作手順を実行し、操作後のＧＵＩを確認する必要がある。しかし、ＧＵＩは多くのＧＵＩ要素で構成されているため、その操作順番の組合せは膨大な数に及ぶ。よってこの確認を人手で行うと、その作業は膨大な工数を必要とする。
【０００４】
従来技術として、ＧＵＩの要素を自動操作し実際にＧＵＩを遷移させ、さらに遷移したＧＵＩに対して自動操作を再帰的に繰り返す技術が提案されている。このような自動操作の結果、ＧＵＩ要素の操作に対するＧＵＩの遷移を表現する状態遷移グラフを生成することができる。このような状態遷移グラフを使ってＧＵＩのエラーの検出や、ＧＵＩをテストするためのテストケース生成が可能となる。ここでは、それら自動操作の従来技術とその問題点を説明する。
【０００５】
非特許文献１では、初期のＧＵＩとして表示されている複数のウインドウ内のＧＵＩ要素を順次自動的に操作する。ＧＵＩ要素を操作すると新規にウインドウが表示される（あるいはブラウザ等をベースとしたＧＵＩの場合は、別のＧＵＩ要素で構成されるＧＵＩに表示が切り替わる）場合があり、その場合は、新規ウインドウ内のＧＵＩ要素に対して同様の処理を再帰的に繰り返す。例えば図１のように初期のＧＵＩが１つのウインドウで構成され、そのウインドウ内のＧＵＩ要素として２つのラジオボタンと１つのボタンが存在する場合を考える。ボタンを押すとラジオボタンの選択状態に応じて、ＧＵＩが（ａ），（ｂ）あるいは（ｃ）へと切り替わる。このようなＧＵＩに対して非特許文献１の技術を適用すると、以下のような手順で自動操作する。
【０００６】
１．ラジオボタン１を操作（ラジオボタン１が選択状態になる）
２．ラジオボタン２を操作（ラジオボタン２が選択状態になる。ラジオボタン１の選択状態は解除される。）
３．ボタン１を操作（ＧＵＩが（ｃ）に切り替わる。）
４．ＧＵＩ（ｃ）のＧＵＩ要素（キャプションがＹｅｓ，Ｎｏのボタン）を操作。
【０００７】
非特許文献１の問題は、自動操作の過程で出現する各ＧＵＩ要素を１度しか操作しない点である。結果として先ほどの自動操作の手順のように、（ａ）や（ｂ）のＧＵＩへ遷移することができず、生成される状態遷移グラフも（ａ）や（ｂ）への遷移が欠けた不完全なものとなる。
【０００８】
このような非特許文献１の問題に対して、非特許文献２のようにＧＵＩの状態に対して網羅的に自動操作することでより精密なＧＵＩの状態遷移グラフを生成する技術が提案されている。ＧＵＩの状態とは、ＧＵＩとして表示されているＧＵＩ要素の構造を表現した情報である。ＧＵＩ要素はキャプションや活性状態，選択状態等のプロパティとその値の情報を保持している。ＧＵＩを構成する要素の状態は、ＧＵＩ要素名，プロパティ，プロパティの値という組の集合で表現できる。図２に図１の初期のＧＵＩの各要素の状態の例を示す。ＧＵＩは複数のウインドウで構成される。よって各ウインドウの状態とはそれらウインドウを構成するＧＵＩ要素の状態の集合である。そしてＧＵＩの状態は各ウインドウの状態の集合で表現することができる。非特許文献２では、ＧＵＩの状態をＤＯＭ（Document Object Model）で表現しているが本説明の状態表現と表現形式が異なるだけで意味は同じである。
【０００９】
例えば、図１の初期のＧＵＩはラジオボタンの選択に応じて異なる状態として表現することができる。ラジオボタン１とラジオボタン２ともに未選択の場合、ラジオボタン１を選択した場合、ラジオボタン２を選択した場合のＧＵＩの状態を図３に示す。このＧＵＩではウインドウは１つしか存在しないため、それぞれのウインドウの状態をｗ0，ｗ1，ｗ2とすると、各ＧＵＩの状態は｛ｗ0｝，｛ｗ1｝，｛ｗ2｝となる。
【００１０】
非特許文献２では、まずテスト対象のアプリケーションを起動し、初期のＧＵＩを表示させる。初期のＧＵＩからＧＵＩの状態を取得し、操作可能なＧＵＩ要素を自動操作する。この処理によって表示されているＧＵＩの状態が変化するため、変化したＧＵＩの状態に対して同様の処理を再帰的に繰り返す。このようにすることで、例えば、図３の各状態においてボタン１を自動操作すれば、図１のＧＵＩ（ａ）（ｂ）（ｃ）へ遷移することが可能になるため、非特許文献１より精密な状態遷移グラフが構築できる。
【００１１】
このように出現したすべてのＧＵＩの状態に対して網羅的にＧＵＩ要素を自動操作するためには、自動操作の過程で出現したＧＵＩの状態と、そのＧＵＩの状態において操作したＧＵＩ要素を記憶しておく必要がある。記憶しなかった場合、同じＧＵＩの状態が出現したときに、過去に操作したことのあるＧＵＩ要素を繰り返し操作してしまい、無限ループに陥る可能性がある。そこで、非特許文献２では、ＧＵＩの状態の集合Ｓと状態遷移の集合Ｔに対して、出現したＧＵＩの状態や発生した状態遷移をそれぞれの集合に追加し記憶する。
【００１２】
具体的には、現在表示されているＧＵＩの状態を取得し、そのＧＵＩの状態が過去に出現したことがあるか、すなわちＧＵＩ状態の集合Ｓに現在のＧＵＩ状態が含まれるか調べる。もし含まれなければ、そのＧＵＩの状態をＧＵＩ状態の集合Ｓに追加する。さらに現在のＧＵＩ状態において可能な状態遷移を状態遷移の集合Ｔに追加する。状態遷移とは形式的には、操作前の状態，操作するＧＵＩ要素，操作後の状態の組で表現できる。
【００１３】
例えば、図１の初期のＧＵＩに対して、非特許文献２による自動操作を実施した場合を考える。まずディスプレイには初期のＧＵＩが表示されるため、初期ＧＵＩの状態ｓ0＝｛ｗ0｝を取得する。ＧＵＩ状態ｓ0は状態の集合Ｓにまだ登録されていないため、集合ＳにＧＵＩ状態ｓ0を追加する。さらにこのＧＵＩ状態ではラジオボタン１，ラジオボタン２，ボタン１が操作可能であるため、状態遷移として（ｓ0，ラジオボタン１，ＴＢＤ），（ｓ0，ラジオボタン２，ＴＢＤ），（ｓ0，ボタン１，ＴＢＤ）を集合Ｔに追加する（図４）。図４の状態遷移の集合Ｔを示す表の各行が追加した状態遷移に対応する。状態遷移における操作後の状態がＴＢＤであるのは、まだ未操作であるため、操作後の状態が未決定（To Be Determined）であることを意味する。これ以降ではＧＵＩの状態のことを単に状態と呼ぶ。
【００１４】
次に現在の状態ｓ0において未操作である遷移を１つ選択し、そのＧＵＩ要素を自動操作する。例えばここでは、図４の集合Ｔからラジオボタン１を自動操作したとする。その結果、ＧＵＩは図５のように変化する。このＧＵＩの状態をｓ1とすると先ほど選択した状態遷移（ｓ0，ラジオボタン１，ＴＢＤ）を（ｓ0，ラジオボタン１，ｓ1）に置き換える。以降はこれまでの処理を再帰的に現在の状態ｓ1に対して繰り返す。すなわち状態ｓ1が集合Ｓに含まれるか調べ、含まれていないため集合Ｓにｓ1を追加する。さらに状態ｓ1に対して可能な遷移を集合Ｔに追加する。そして、状態ｓ1で可能な遷移を１つ選択し、例えばラジオボタン１を自動操作する。このときの状態の集合Ｓと状態遷移の集合Ｔを図６に示す。
【００１５】
このように初期のＧＵＩから自動操作処理を繰り返したときのＧＵＩの状態遷移を図７に示す。ＧＵＩの状態はｓ0，ｓ1，ｓ1，ｓ2，ｓ1，ｓ3，のように遷移し、状態ｓ3において終了ボタン（ボタン２）を押してアプリケーションが終了するまで継続される。この時点でのＧＵＩ状態の集合Ｓと状態遷移の集合Ｔを図８に示す。アプリケーションが終了してしまった場合、非特許文献２はアプリケーションを再起動し初期のＧＵＩを表示し処理を繰り返す。
【００１６】
非特許文献２はこのような自動操作の結果、状態遷移グラフを生成することができる。状態遷移グラフとは形式的には、ＧＵＩ状態の集合と状態遷移の集合の対＜Ｓ，Ｔ＞で表現する。状態遷移グラフを図形式で表現するとき、Ｓに含まれる状態をノードで表現し、状態遷移はノード間の有向エッジとして表現する。すなわち、Ｔに含まれる遷移において操作前の状態と対応するノードから操作後の状態と対応するノードへエッジを引く。さらにエッジには遷移のＧＵＩ要素をラベルとして記述する。図８のＧＵＩの状態集合Ｓと状態遷移Ｔの状態遷移グラフの図形式を図９に示す。図中のエッジで先がノードを示していないもの、例えばノードｓ0のラジオボタン２やボタン１というラベルのエッジは、操作後の状態がＴＢＤである状態遷移を意味している。
【００１７】
このように自動操作処理を継続していくと、表示されているＧＵＩ状態ｓにおいて未操作のＧＵＩ要素が存在しない場合がある。もしこのとき、他のＧＵＩの状態ｓ’に未操作のＧＵＩ要素が存在するならば、自動操作によって状態ｓから状態ｓ’にＧＵＩを遷移させ、未操作のＧＵＩ要素を操作する必要がある。例えば、表示されているＧＵＩの状態がｓ1だった場合、図９の状態遷移グラフが示すようにｓ1には未操作の状態遷移が存在しない。よって、例えば未操作の状態遷移が存在する状態ｓ2にＧＵＩを遷移させる必要がある。
【００１８】
非特許文献２では状態ｓから状態ｓ’にＧＵＩを遷移させるために、この状態遷移グラフ上で状態ｓから状態ｓ’へ到達するパスを利用する。パスとは、状態遷移をｔ1，ｔ2，ｔ3，…，ｔnとするとき、状態遷移の有限列ｔ1ｔ2ｔ3…ｔnのことである。ただし、ｔ1の操作前の状態はｓで、ｔnの操作後の状態はｓ’でなければならない。さらに、１≦ｉ≦ｎ−１に対して、状態遷移ｔiの操作後の状態とｔi+1の操作前の状態が等しい必要がある。例えば、状態ｓ1からｓ2へのパスは（ｓ1，ラジオボタン２，ｓ2）となる。パスの状態遷移ｔ1からｔnまでのＧＵＩ要素を順次自動操作することでＧＵＩの状態をｓ’に遷移させることができる。
【００１９】
しかし、現実的には必ずＧＵＩの状態ｓをｓ’に遷移させることができるとは限らない。例えば状態ｓからｓ’へのパスが見つからない場合がある。その場合には、初期状態からは必ず任意の状態へのパスを発見することができるため、アプリケーションを再起動して、初期のＧＵＩ状態から状態ｓ’へのパスを状態遷移グラフ上で求める。そしてパスに沿ってＧＵＩ要素を自動操作し状態ｓ’に遷移させる。このように非特許文献２は、これまでの処理をすべてのＧＵＩの状態に対して、未操作のＧＵＩ要素が存在しなくなるまで繰り返す。これによってＧＵＩの状態に対して網羅的に自動操作することが可能となり、非特許文献１に比べてより精密な状態遷移グラフを生成することができる。
【先行技術文献】
【非特許文献】
【００２０】
【非特許文献１】A. Memon, I. Banerjee and A. Nagarajan, "GUI Ripping: Reverse Engineering of Graphical User Interfaces for Testing", In proc. of the 10th Working Conference on Reverse Engineering (WCRE 2003), IEEE, pp. 260-269, 2003
【非特許文献２】A. Mesbah, E. Bozdag and A. Deursen, "Crawling AJAX Inferring User Interface State Changes", In proc. of the 8th International Conference on Web Engineering (ICWE 2008), IEEE, pp.122-134, 2008
【発明の概要】
【発明が解決しようとする課題】
【００２１】
非特許文献２の問題点は、テスト対象アプリケーションのＧＵＩの状態が無限に存在する場合、処理が無限ループに陥ってしまい、網羅的な自動操作が完了しないことである。例えば、実行ボタンとラベルを保有するウインドウで構成されるＧＵＩを考える。ラベルにはそのウインドウが表示された時点でのタイムスタンプが表示されるものとする。非特許文献２の技術による自動操作で、このＧＵＩが初めて表示された時の状態ｓ1とする。状態ｓ1のラベルにはウインドウをオープンしたときの時刻が表示される。ここでは2012年7月4日の11時7分30秒55ミリ秒を意味する20120704-11073055がラベルのキャプションとして表示されるものとする。状態ｓ1において未操作のＧＵＩ要素は実行ボタンであるため、実行ボタンを自動操作して処理を継続する。その後、再び同じＧＵＩが表示された場合を図１０に示す。この時の時刻を2012年7月4日の11時37分30秒00ミリ秒とすると、そのとき表示されるウインドウのラベルのキャプションは20120704-11373000になる。結果としてこの状態は過去に表示された状態ｓ1とは異なる状態と識別されるため、例えばここではその状態をｓ5と表記する。状態ｓ5は新規に出現した状態であるため、未操作のＧＵＩ要素として再度実行ボタンが操作される。これ以降では、このＧＵＩが出現する度に新規のＧＵＩの状態として識別されてしまうために、その度に実行ボタンを操作してしまい無限ループに陥ってしまう。
【００２２】
そこで本発明では、ＧＵＩの状態に対して網羅的に自動操作する技術において、テスト対象アプリケーションが無限のＧＵＩの状態を持つ場合でも、自動操作処理が無限ループに陥らず必ず処理が終了することを可能にするという課題を解決する。
【課題を解決するための手段】
【００２３】
上記目的を達成するために、本願発明は、コンピュータ上で動作するテスト対象アプリケーションのグラフィカルユーザインタフェース（ＧＵＩ）の状態を取得する方法であって、入力された１以上の状態取得条件を予め記憶手段に記憶しておく第１のステップと、コンピュータの表示手段に表示されているＧＵＩからＧＵＩ要素，プロパティ，プロパティの値の組の集合として表現されるＧＵＩ要素の状態の集合をＧＵＩの状態として取得する第２のステップと、記憶手段に記憶されている状態取得条件に基づき第２のステップで取得したＧＵＩの状態を変換する処理を、すべての状態取得条件に対して繰り返す第３のステップとを備えたことを特徴とする。
【００２４】
本発明によれば、テスト対象アプリケーションのＧＵＩを網羅的に自動操作してＧＵＩの状態遷移グラフを生成するときに、テスト対象アプリケーションが無限のＧＵＩの状態を持つ場合でも、状態取得条件を適切に設定することにより無限ループに陥る原因となりうるＧＵＩの状態が生じることを防止できるので、自動操作処理が無限ループに陥らず必ず処理が終了することが可能になる。
【００２５】
本発明の好適な態様の一例としては、前記状態取得条件は、ＧＵＩ要素と、プロパティとを含み、前記第３のステップは、第２のステップ取得したＧＵＩの状態からＧＵＩ要素，プロパティ，プロパティの値の組を取り出すステップと、状態取得条件のＧＵＩ要素及びプロパティと取り出した組のＧＵＩ要素及びプロパティが合致するか判定するステップと、合致する場合には取り出した組を取得したＧＵＩの状態から削除する変換を実施するステップとを含むことを特徴とするものが挙げられる。これは無限ループに陥る原因となりうるＧＵＩ要素の状態を削除することにより無限ループの発生を防止するものである。
【００２６】
また、本発明の好適な態様の他の例としては、前記状態取得条件は、ＧＵＩ要素と、プロパティと、プロパティ値の変換関数とを含み、前記第３のステップは、第２のステップ取得したＧＵＩの状態からＧＵＩ要素，プロパティ，プロパティの値の組を取り出すステップと、状態取得条件のＧＵＩ要素及びプロパティと取り出した組のＧＵＩ要素及びプロパティが合致するか判定するステップと、合致する場合には取り出した組におけるプロパティ値を変換関数の入力として与え、取り出した組をＧＵＩ要素，プロパティ，変換関数の出力値の組に置換する変換を実施するステップとを含むことを特徴とするものが挙げられる。これは無限ループに陥る原因となりうるＧＵＩ要素の状態について、そのプロパティ値を変換関数により置換することにより無限ループの発生を防止するものである。
【００２７】
また、本発明の好適な態様の他の例としては、前記状態取得条件は、ＧＵＩ要素と、しきい値条件の集合とを含み、前記第３のステップは、第２のステップ取得したＧＵＩの状態からリスト部品のリスト項目であるＧＵＩ要素を取り出し配列に格納するステップと、配列の要素数が状態取得条件のしきい値条件を満たすか判定するステップと、配列の要素数がしきい値条件を満たす場合には、配列内においてしきい値条件の最小値より大きい位置に格納されているＧＵＩ要素の状態を取得したＧＵＩの状態から削除する変換を実施するステップとを含むことを特徴とするものが挙げられる。これは無限ループに陥る原因となりうるリスト部品について、そのリスト項目のＧＵＩ要素を削除することにより無限ループの発生を防止するものである。
【００２８】
また、本発明の好適な態様の一例としては、第３のステップにより最終的に変換されたＧＵＩの状態から未操作のＧＵＩ要素を取得し、該ＧＵＩ要素を自動操作してＧＵＩの状態を遷移させる処理を再帰的に繰り返す第４のステップを備えたことを特徴とするものが挙げられる。これにより、テスト対象アプリケーションのＧＵＩを網羅的に自動操作してＧＵＩの状態遷移グラフを生成することができる。
【発明の効果】
【００２９】
本発明によりテスト対象アプリケーションのＧＵＩを網羅的に自動操作してＧＵＩの状態遷移グラフを生成するときに、テスト対象アプリケーションが無限のＧＵＩの状態を持つ場合でも、自動操作処理が無限ループに陥らず必ず処理が終了することが可能になる。
【図面の簡単な説明】
【００３０】
【図１】ＧＵＩの一例
【図２】図１の初期のＧＵＩの各要素の状態の例
【図３】ＧＵＩの状態遷移の一例
【図４】ＧＵＩの状態遷移の一例
【図５】ＧＵＩの状態遷移の一例
【図６】ＧＵＩの状態遷移の一例
【図７】ＧＵＩの状態遷移の一例
【図８】ＧＵＩの状態遷移の一例
【図９】状態遷移グラフの一例
【図１０】状態遷移が無限ループに陥る例を説明する図
【図１１】本実施の形態に係るグラフィカルユーザインタフェースの状態装置の構成図
【図１２】リスト部品を説明する図
【図１３】ＧＵＩ状態取得部の動作を説明するフローチャート
【図１４】ＧＵＩ状態変換部の動作を説明するフローチャート
【図１５】ＧＵＩ状態変換部の動作を説明するフローチャート
【図１６】ＧＵＩ状態変換部の動作を説明するフローチャート
【図１７】実施例に係るＧＵＩの状態遷移を説明する図
【図１８】実施例に係るＧＵＩの状態遷移を説明する図
【図１９】実施例に係るＧＵＩの状態遷移を説明する図
【図２０】実施例に係るＧＵＩの状態遷移を説明する図
【図２１】実施例に係るＧＵＩの状態遷移を説明する図
【図２２】実施例に係る状態取得条件を説明する図
【図２３】実施例に係るＧＵＩの状態遷移を説明する図
【図２４】実施例に係るＧＵＩの状態遷移を説明する図
【図２５】実施例に係るＧＵＩの状態遷移を説明する図
【図２６】実施例に係るＧＵＩの状態遷移を説明する図
【図２７】実施例に係るＧＵＩの状態遷移を説明する図
【図２８】実施例に係るＧＵＩの状態遷移を説明する図
【図２９】実施例に係るＧＵＩの状態遷移を説明する図
【図３０】実施例に係るＧＵＩの状態遷移を説明する図
【発明を実施するための形態】
【００３１】
本発明の一実施の形態に係る グラフィカルユーザインタフェースの状態取得方法を実施する装置について図１１を参照して説明する。ここでは周知のコンピュータ上に実現した例を示すもので、図中、１は入力装置、２はコンピュータ本体、３は記憶装置、４は表示装置である。
【００３２】
入力装置１は、キーボード、マウス等からなり、ユーザがコンピュータ本体２に所定の情報、状態取得条件の集合を入力することができる。状態取得条件については後に詳述する。また入力装置１は、記憶装置３に記録されている状態取得条件の集合の中から削除すべき状態取得条件を指定するために利用される。また入力装置１から、テスト対象アプリケーションに対して網羅操作の開始を指示することができる。
【００３３】
記憶装置３は、入力装置１から入力された状態取得条件の集合を記憶するための装置である。また記憶装置３は、コンピュータ本体２におけるＧＵＩの状態取得処理により得られたＧＵＩの状態を記憶保持したり、該取得処理において必要な情報の一時記憶を行う。
【００３４】
表示装置４は、液晶ディスプレイ、ＣＲＴ等画像表示装置等からなり、網羅操作部６が網羅的に操作するテスト対象アプリケーションのＧＵＩを表示するための装置である。また記憶装置に記憶されている状態取得条件の集合を表示することもできる。
【００３５】
コンピュータ本体２は、各装置を制御するとともに、ＧＵＩ状態取得条件管理部５、網羅操作部６、ＧＵＩ状態取得部７、ＧＵＩ状態変換部８を構成する。なお、コンピュータ本体２の各部は、ハードウェアにより構成してもよいし、コンピュータ本体２にプログラムをインストールすることによって構成してもよい。なお該プログラムは、記録媒体に記録することも、ネットワークを通して提供することも可能である。
【００３６】
ＧＵＩ状態取得条件管理部５は、入力装置１から入力された状態取得条件の集合を記憶装置３へ記憶する。さらにＧＵＩ状態取得条件管理部５は、入力装置１より指定された状態取得条件を記憶装置３から削除することができる。
【００３７】
網羅操作部６は、入力装置１から入力されたテスト対象アプリケーションの網羅操作指示によって、ＧＵＩ状態取得部７によりＧＵＩの状態を取得し、未操作のＧＵＩ要素を自動操作する。この自動操作によってＧＵＩ状態が遷移するため、遷移したＧＵＩの状態に対してこれらの処理を再帰的に繰り返す。網羅操作部６は非特許文献２などの公知の技術により実現することができる。
【００３８】
ＧＵＩ状態取得部７は、網羅操作部６により利用されるものであり、表示装置４に表示されているテスト対象アプリケーションのＧＵＩの状態を取得する処理を行う。ここでＧＵＩ状態取得部７は、取得した全てのＧＵＩ状態を無条件で網羅操作部６に返すのでなく、ＧＵＩ状態変換部８を用いて取得したＧＵＩ状態の変換処理（置換又は削除処理）を行った結果を網羅操作部６に返す。ＧＵＩ状態取得部７の動作については後述する。
【００３９】
ＧＵＩ状態変換部８は、ＧＵＩ状態取得部７により利用されるものであり、記憶装置３に記録されている状態取得条件に基づいたＧＵＩの状態の変換処理（置換又は削除処理）を行う。ＧＵＩ状態変換部８の動作については後述する。
【００４０】
次に、前述の状態取得条件について説明する。状態取得条件とは、ＧＵＩ状態の変換処理のルールを示すものである。背景技術の項目でも説明したように、ＧＵＩ状態とは、ＧＵＩとして表示されているＧＵＩ要素の構造を表現した情報である。ＧＵＩ要素はキャプションや活性状態，選択状態等のプロパティとその値の情報を保持している。ＧＵＩ要素の状態は、ＧＵＩ要素名，プロパティ，プロパティの値という組の集合で表現できる。そして状態取得条件とは、ＧＵＩ要素の状態を表現した組に対する処理のルールを示すものである。入力される状態取得条件には以下の３つのパターンがある。
【００４１】
パターンＡ：状態取得の対象から除外（削除）するＧＵＩ要素とプロパティの入力。ただし指定するＧＵＩ要素のすべてのプロパティの値を除外するという意味でＧＵＩ要素のみを入力してもよい。またあらゆるＧＵＩ要素の指定するプロパティの値を除外するという意味でプロパティのみを入力してもよい。
【００４２】
パターンＢ：ＧＵＩ要素、プロパティ、そのプロパティの値の変換関数の入力。ただし指定するＧＵＩ要素のすべてのプロパティの値を変換関数によって変換するという意味でＧＵＩ要素と変換関数のみを入力してもよい。またあらゆるＧＵＩ要素の指定するプロパティの値を変換関数によって変換する意味でプロパティと変換関数のみを入力してもよい。
【００４３】
パターンＣ：リスト部品のＧＵＩ要素と、しきい値条件の集合を入力。
【００４４】
ここで、パターンＢにおけるプロパティの値の変換関数とは、ＧＵＩの状態としてテスト対象アプリケーションから直接取得されるプロパティの値を、ユーザが指定する値（抽象値）へと変換する関数のことである。例えば、整数の値をもつプロパティがある場合に、プロパティ値が０の場合には抽象値"zero"へ、プロパティ値が０以外の場合には抽象値"non-zero"へと変換するような関数等が入力される。
【００４５】
また、パターンＣにおけるリスト部品とは、ここではその内部にリスト項目を持つＧＵＩ要素のことを意味する。例えば、Microsoft社のWindows（登録商標）の.NETフレームワークのＡＰＩにはListViewクラスやDataGridクラスが存在するが、それらクラスに対応するＧＵＩ要素である。ListViewクラスの例を図１２に示す。リスト部品であるＧＵＩ要素には、その子としてリスト項目を追加し表示することができる。リスト項目もＧＵＩ要素の一種である。コンピュータのメモリ等のリソースを考慮しなければ論理的には無限にリスト項目を追加することもできる。
【００４６】
また、パターンＣにおけるしきい値条件とは、リスト部品に追加されるリスト項目数に関する条件であり、０以上の整数をｍ，ｎとすると（ただしｍ＜ｎ）、（ｍ，ｎ）の形式で与えられる。これは追加されたリスト項目数がｍ以上、ｎより小さいという条件を意味する。パターンＣでは当該条件を満たすリスト項目に係るＧＵＩ要素の状態の組を削除する。
【００４７】
次に、前述したＧＵＩ状態取得部７の動作について図１３を参照して詳述する。ＧＵＩ状態取得部７は、まず、表示装置４に表示されているＧＵＩの状態を取得しｓとおき（ステップＳ１）、記憶装置３に記録されている状態取得条件を１つ取り出しｃと置く（ステップＳ３）。さらに、ＧＵＩ状態変換部８に状態ｓと状態取得条件ｃを与え、結果として得られるＧＵＩの状態を改めてｓとおく（ステップＳ４）。ステップＳ３，Ｓ４を記憶装置３に記憶されているすべての状態取得条件に対して繰り返し（ステップＳ２）、完了したらＧＵＩの状態ｓを網羅操作部６へと返す（ステップＳ５）。
【００４８】
次に、ＧＵＩ状態変換部８の動作について図１４〜図１６を参照して詳述する。ＧＵＩ状態変換部８は、ＧＵＩ状態取得部７が図１３のステップＳ４を実行する際に利用され、ＧＵＩ状態取得部７からは状態ｓと状態取得条件ｃが与えられる。ＧＵＩ状態変換部８は、まず状態取得条件ｃがパターンＡであるか、具体的にはＧＵＩ要素とプロパティであるか調べる（ステップＳ１１）。ここで、このＧＵＩ要素をｅc，プロパティをｐcとおく。もしそうでなければ図１５の手続に進む。ステップＳ１１の条件に合致する場合には状態ｓに含まれるすべての組に対してステップＳＡ２，ＳＡ３，ＳＡ４，ＳＡ５を実行したか調べる（ステップＳＡ１）。すべての組に対して実行していればステップＳＡ６に進み、ＧＵＩの状態としてｓを返し手続を終了する。もしそうでなければ状態ｓから組を１つ取り出し（ｅ，ｐ，ｖ）とする（ステップＳＡ２）。ただし、ｅはＧＵＩ要素、ｐがプロパティ、ｖがプロパティの値である。次に、ＧＵＩ要素ｅcが入力されていて、かつｅ≠ｅcであるか調べる（ステップＳＡ３）。もしこの条件と合致すれば、取り出した組（ｅ，ｐ，ｖ）は除外対象ではなく、次の組を取り出し処理を繰り返すためにステップＳＡ１に戻る。もしステップＳＡ３の条件と合致していなければ、プロパティｐcが入力されていて、かつｐ≠ｐcであるか調べる（ステップＳＡ４）。もしこの条件と合致していなければ、ステップＳＡ３と同様にステップＳＡ１に戻る。条件と合致している場合は、取り出した組（ｅ，ｐ，ｖ）は取り除く対象の状態であるため、状態ｓからこの組を取り除く（ステップＳＡ５）。そして、他の状態ｓに含まれる組に対して、これらの処理を繰り返すためにステップＳＡ１へと戻る。
【００４９】
前記ステップＳ１１の条件に合致せず、図１５の手続に進んだ場合は、まず状態取得条件ｃがパターンＢであるか、具体的にはＧＵＩ要素，プロパティ，プロパティ値の変換関数であるか調べる（ステップＳ１２）。もしそうでなければ図１６の手続を実行する。ステップＳ１２の条件に合致する場合には、ＧＵＩ要素をｅc、プロパティをｐc、プロパティ値の変換関数をｆと置く。続いて、状態ｓのすべての組でステップＳＢ２，ＳＢ３，ＳＢ４，ＳＢ５を実行したか調べ（ステップＳＢ１）、実行していればＧＵＩの状態としてｓを返して（ステップＳＢ６）、手続を終了する。もしステップＳＢ１の条件に合致していない場合は、状態ｓに含まれる組を１つ取り出し（ｅ，ｐ，ｖ）と置く（ステップＳＢ２）。ただし、ｅはＧＵＩ要素、ｐがプロパティ、ｖがプロパティの値である。そして、ＧＵＩ要素ｅcが入力されていて、かつｅ≠ｅcであるか調べる（ステップＳＢ３）。もしこの条件と合致すれば、取り出した組（ｅ，ｐ，ｖ）は変換対象ではなく、次の組を取り出し処理を繰り返すためにステップＳＢ１に戻る。もしステップＳＢ３の条件で合致していなければ、プロパティｐcが入力されていて、かつｐ≠ｐcであるか調べる（ステップＳＢ４）。もしこの条件と合致していれば、ステップＳＢ３と同様にステップＳＢ１に戻る。もしステップＳＢ４の条件を満たさない場合は、変換対象の組であるため（ｅ，ｐ，ｖ）を（ｅ，ｐ，ｆ（ｖ））で更新する（ステップＳＢ５）。ここでｆ（ｖ）は、変換関数ｆの入力としてプロパティ値であるｖを与えたときの出力結果の値である。変換を実施したあとは、他の組に対して、これらの処理を繰り返すためにステップＳＢ１へと戻る。
【００５０】
前記ステップＳ１２の条件に合致せず図１６の手続に進んだ場合は、状態取得条件ｃは、パターンＣ、具体的にはリスト部品を示すＧＵＩ要素としきい値条件の集合である。よってこのＧＵＩ要素をｅ、しきい値条件の集合をＴとする（ステップＳＣ１）。次に状態ｓからＧＵＩ要素ｅの子要素であるリスト項目を示すＧＵＩ要素を抽出し、配列Ｌへと格納する（ステップＳＣ２）。さらにしきい値条件の集合Ｔのすべての要素に対してステップＳＣ４，ＳＣ５，ＳＣ６の処理を実施したか調べ（ステップＳＣ３）、もし実施していれば、ＧＵＩの状態としてｓを返し（ステップＳＣ７）、手続を終了する。もし実施していない場合には、しきい値条件の集合Ｔからしきい値条件を１つ取り出し（ｍ，ｎ）とする（ステップＳＣ４）。ただしｍ，ｎはｍ＜ｎである０以上の整数である。次に配列Ｌの要素数がｍ以上、かつｎより小さいか調べ（ステップＳＣ５）、もしこの条件に合致しない場合は、次のしきい値条件を取り出してステップＳＣ４，ＳＣ５，ＳＣ６を実行するためにステップＳＣ３へ戻る。もしステップＳＣ５の条件を満たす場合には、配列Ｌの先頭からｍ＋１番目以降のリスト項目を示すＧＵＩ要素の状態を状態ｓから削除し（ステップＳＣ６）、ステップＳＣ７へと進む。ステップＳＣ７では状態ｓを返して手続を終了する。
【００５１】
このような本発明によれば、ＧＵＩの状態に対して網羅的に自動操作するときに、テスト対象アプリケーションが無限のＧＵＩの状態を持つ場合でも、自動操作処理が無限ループに陥らず必ず処理が終了し、網羅的に自動操作することが可能となる。
【００５２】
なお、本実施形態では、ＧＵＩ状態取得条件管理部５、網羅操作部６、ＧＵＩ状態取得部７、ＧＵＩ状態変換部８をコンピュータ本体２上のソフトウェアとして実現した例を示したが、ハードウェアで実現してもよい。またこれら各装置が、適切な通信路で相互に接続された複数のハードウェア上に分散して存在し、相互に通信し合いながら実行することもできる。
【００５３】
また、本発明においてテスト対象とするアプリケーションは、コンピュータ本体２において動作してもよいし、適切な通信路で相互に接続されたハードウェア上で動作していてもよい。
【実施例】
【００５４】
本発明によるグラフィカルユーザインタフェースの状態取得方法の実施例について図１７〜図３０を参照して詳述する。
【００５５】
図１７に本実施例におけるテスト対象アプリケーションのＧＵＩを示す。テスト対象アプリケーションのＧＵＩは１つのウインドウで構成される。そのウインドウ内にはラベル１，ラベル２，リストビュー１，ボタン１のＧＵＩ要素が存在する。ラベル１のキャプションはタイムスタンプという文字列であり変化することはない。ラベル２のキャプションはこのアプリケーションが起動したとき、あるいはボタン１を押下したときのタイムスタンプが表示され動的に変化する。登録というキャプションのボタン１を押下すると、ラベル２のキャプションが変更されるとともに、リストビュー１にリスト項目のＧＵＩ要素が追加される。ボタン１が押下されリスト項目１が登録されたときのＧＵＩを図１８に示す。リスト項目１における登録順番のカラムのセルは、登録した順番が表示される。例えばさらにボタン１を押下すると、リスト項目２のＧＵＩ要素が追加され、登録順番は２が表示される。リスト項目１における乱数のカラムのセルには、ボタン１を押下した際にランダムで１から１０の整数の内の１つが選択され表示される。
【００５６】
本実施例では、ラベル１，ラベル２，リストビュー１，ボタン１の各ＧＵＩ要素から取得できるプロパティはキャプションのみとする。図１９に図１７のＧＵＩの状態の例を示す。このときのウインドウの状態は各ＧＵＩ要素の状態の集合であるため、｛ラベル１の状態，ラベル２の状態，リストビュー１の状態，ボタン１の状態｝となる。またＧＵＩの状態は、表示されているウインドウの状態の集合であるため、ここではＧＵＩは１つのウインドウで構成されるため、｛｛ラベル１の状態，ラベル２の状態，リストビュー１の状態、ボタン１の状態｝｝となる。
【００５７】
また本実施例では、リスト項目のＧＵＩ要素から取得できるプロパティは、登録順番と、乱数の２つに限定する。それぞれのプロパティの値は、図１８のように登録順番、乱数のカラムのセルに表示される値である。図２０に図１８のＧＵＩの状態を示す。リスト項目１の状態は｛（リスト項目１，登録順番，１），（リスト項目１，乱数，１）｝となる。またラベル２の状態は図１９におけるラベル２の状態とキャプションの値が変化していることに注意されたい。図２０のウインドウの状態は｛ラベル１の状態，ラベル２の状態，リストビュー１の状態，リスト項目１の状態，ボタン１の状態｝として表現されるため、ＧＵＩの状態は｛｛ラベル１の状態，ラベル２の状態，リストビュー１の状態，リスト項目１の状態、ボタン１の状態｝｝となる。
【００５８】
例えば非特許文献２や、図１１の本発明の実施形態において網羅操作部６のみの構成で自動操作を実施すると、表示されたＧＵＩの状態を取得し（図１９）、未操作のＧＵＩ要素であるボタン１を自動操作する。それによってＧＵＩはラベル２のキャプションが自動操作した時点のタイムスタンプに変更され、かつリスト項目１が追加された状態に変更される（図２０）。再帰的に図２０の状態において未操作のＧＵＩ要素であるボタン１を自動操作すると、さらにラベル２のキャプションが変更され、リスト項目２が追加された状態にＧＵＩは変更される。ボタン１を自動操作するたびに発生するＧＵＩの変化を異なる状態として識別してしまうため、これらの自動操作は無限ループに陥ってしまい、網羅的な自動操作は完了しない（図２１）。
【００５９】
本発明の場合は、まず入力装置１から状態取得条件の集合を入力する。ここでは、図２２のようにｃ1，ｃ2，ｃ3の条件を入力する。ｃ1はパターンＡに該当し、状態取得の対象から除外するＧＵＩ要素とプロパティからなり、ここではＧＵＩ要素としてラベル２、プロパティとしてキャプションを指定している。ｃ2はパターンＢに該当し、ＧＵＩ要素，プロパティ，そのプロパティの値の変換関数からなり、ＧＵＩ要素は指定せず、プロパティとして乱数、変換関数としてすべての値を定数ＲＡＮＤに変換する関数ｆを与える。ｃ3はパターンＣに該当し、リスト部品のＧＵＩ要素としきい値条件の集合からなり、ＧＵＩ要素としてリストビュー１、しきい値条件の集合として｛（０，１），（１，∞）｝を与える。ここで（１，∞）は追加リスト項目数が１以上であることを示すしきい値条件である。
【００６０】
入力された状態取得条件ｃ1，ｃ2，ｃ3は、ＧＵＩ状態取得条件管理部５によって、記憶装置３に記憶される。
【００６１】
さらにテスト対象アプリケーションに対する網羅的な自動操作の指示が入力装置１に入力されると、網羅操作部６が表示装置４に表示されているテスト対象アプリケーションのＧＵＩの状態をＧＵＩ状態取得部７によって取得しようとする。このときＧＵＩ状態取得部７は図１３の手続を実施し取得した状態を網羅操作部６へ返す。具体的には図１７のＧＵＩが表示されているときに、図１３のステップＳ１にてＧＵＩ状態ｓとして図１９のＧＵＩ状態ｓ0を取得する。さらにステップＳ２，Ｓ３へと進み、記憶装置３に記録されている状態取得条件を取り出す。ここではｃ1が取り出されたと仮定する。ステップＳ４では、ＧＵＩ状態変換部８に取得したＧＵＩ状態ｓ0と状態取得条件ｃ1を与える。
【００６２】
ＧＵＩ状態変換部８は、与えられたＧＵＩ状態ｓ0と、状態取得条件ｃ1に対して図１４から図１６の手続を実施する。すなわち、図１４のステップＳ１１でｃ1のＧＵＩ要素であるラベル２をｅc、プロパティであるキャプションをｐcと置く。ステップＳＡ１，ＳＡ２へと進みＧＵＩの状態ｓ0から組を１つ取り出す。ここでは（ラベル１，キャプション，タイムスタンプ）が取り出されたとする。ラベル１とｅcが示すラベル２は等しくないためステップＳＡ３からステップＳＡ１へと戻る。続くステップＳＡ２ではＧＵＩの状態ｓ0からＧＵＩ要素の状態（ラベル２，キャプション，20120704-013300）を取り出す。ステップＳＡ３において、ラベル２はｅcが示すＧＵＩ要素と等しく、さらにステップＳＡ４にてキャプションは、ｐcが示すプロパティと等しいため、ステップＳＡ５へと進み状態ｓ0から組（ラベル２，キャプション，20120704-013300）を削除する。ＧＵＩの状態ｓ0に含まれる他の組に対してもステップＳＡ１からステップＳＡ５を同様に行う。本例の場合は他にステップＳＡ５が実施されることはないため、最終的にはステップＳＡ６に進んでｓ0として図２３のＧＵＩ状態｛｛ラベル１の状態，リストビュー１の状態，ボタン１の状態｝｝をＧＵＩ状態取得部７に返す。
【００６３】
ＧＵＩ状態取得部７は、図１３のステップでＧＵＩ状態変換部８によりＧＵＩの状態｛｛ラベル１の状態，リストビュー１の状態，ボタン１の状態｝｝を取得すると、この状態を改めてｓ0とおき、さらに残りの状態取得条件ｃ2，ｃ3に対してステップＳ２からステップＳ４を繰り返す。この場合はそれ以上、状態の変換は実施されずステップＳ５で状態ｓ0を返す。
【００６４】
網羅操作部６は得られた状態ｓ0に対して未操作のＧＵＩ要素であるボタン１を操作する。結果としてＧＵＩは図１８へと変化する。網羅操作部６は変化したＧＵＩに対して同様の処理を行い、ＧＵＩ状態取得部７を使ってＧＵＩの状態を取得する。
【００６５】
ＧＵＩ状態取得部７は、図１３の手続を実施し、ステップＳ１で、まず図１９のＧＵＩの状態を取得しｓ1と置く。ステップＳ２，Ｓ３へと進み記憶装置３から状態取得条件ｃ1を取り出す。さらにステップＳ４でＧＵＩ状態変換部８にＧＵＩの状態ｓ1と状態取得条件ｃ1を渡す。
【００６６】
ＧＵＩ状態変換部８は、図１４の手続を実施する。このときＧＵＩの状態ｓ0のときと同様にｓ1に含まれる組（ラベル２，キャプション，20120704-023300）が削除される。ステップＳＡ６にて削除された状態をＧＵＩ状態取得部７に返す。このときのＧＵＩの状態を図２４に示す。
【００６７】
ＧＵＩ状態取得部７は、図１３のステップＳ４でＧＵＩ状態変換部８が返したＧＵＩの状態を改めてｓ1と置き、ステップＳ２へと戻る。まだステップＳ３，Ｓ４を実施していない状態取得条件が記憶装置３に存在するため、ステップＳ３で状態取得条件ｃ2取り出し、ステップＳ４にて再度、ＧＵＩ状態変換部８にＧＵＩの状態ｓ1とｃ2を渡す。
【００６８】
ＧＵＩ状態変換部８は、まず図１４の手続のステップＳ１１を実施する。ここで状態取得条件ｃ2はパターンＡではない、すなわちＧＵＩ要素とプロパティではないため、図１５の手続へ進む。図１５のステップＳ１２ではｃ2がパターンＢであるか、すなわちＧＵＩ要素とプロパティ、プロパティ値の変換関数であるか調べる。ｃ2はこの条件に合致するため、ｃ2のプロパティである乱数をｐcと置き、さらに変換関数をｆと置く。ステップＳＢ１，ＳＢ２へと進み、状態ｓ1から組を取り出す。ここでは（ラベル１，キャプション，タイムスタンプ）が取り出されたとする。ステップＳＢ３では、状態取得条件ｃ2にＧＵＩ要素ｅcが指定されていないため、ステップＳＢ４へと進む。ステップＳＢ４ではｐcが示す乱数は組のプロパティであるキャプションと等しくないため、ステップＳＢ４からステップＳＢ１へと戻る。続くステップＳＢ２では、状態ｓ1に含まれる他の組を取り出す。例えばここでは（リスト項目１，乱数，１）という組を取り出したとする。ステップＳＢ３では、状態取得条件ｃ2にＧＵＩ要素が指定されていないため、ステップＳＢ４へと進む。ステップＳＢ４では組のプロパティとｐcの示す乱数が等しいため、ステップＳＢ５へと進む。ステップＳＢ５では、取り出した組のプロパティ値１を変換関数ｆに与える。ここでの変換関数ｆは任意の値を定数ＲＡＮＤに変換するため、（リスト項目１，乱数，１）は、（リスト項目１，乱数，ＲＡＮＤ）に変換される。ＧＵＩの状態ｓ1に含まれる他の組に対してもステップＳＢ１からステップＳＢ５を同様に行う。本例の場合は他にステップＳＢ５が実施されることはないため、最終的にはステップＳＢ６に進んで変換された状態を返す。このときのＧＵＩの状態を図２５に示す。
【００６９】
ＧＵＩ状態取得部７は、図１３のステップＳ４でＧＵＩ状態変換部８が返したＧＵＩの状態を改めてｓ1と置き、ステップＳ２へと戻る。まだステップＳ３，Ｓ４を実施していない状態取得条件が記憶装置３に存在するため、ステップＳ３で状態取得条件ｃ3取り出し、ステップＳ４にて再度、ＧＵＩ状態変換部８にＧＵＩの状態ｓ1とｃ3を渡す。
【００７０】
ＧＵＩ状態変換部８は、まず図１４の手続のステップＳ１１を実施する。ここで状態取得条件ｃ3はパターンＡではない、すなわちＧＵＩ要素とプロパティではないため、図１５の手続へ進む。図１５のステップＳ１２のステップではｃ3がパターンＢであるか、すなわちＧＵＩ要素とプロパティ、プロパティ値の変換関数であるか調べる。ｃ3はパターンＣでありこの条件に合致しないため、図１６の手続へと進む。図１６のステップＳＣ１では、ｃ3のリスト部品のＧＵＩ要素であるリストビュー１をｅ、しきい値条件の集合｛（０，１），（１，∞）｝をＴとする。次にステップＳＣ２にてＧＵＩの状態ｓ1から、ＧＵＩ要素ｅであるリストビュー１のリスト項目のＧＵＩ要素を取り出し、配列Ｌに格納する。図１８のＧＵＩにはリスト項目はリスト項目１のみであるため、配列Ｌの１番目の要素にリスト項目１が登録される。ステップＳＣ３，ＳＣ４へと進み、しきい値条件の集合Ｔから、しきい値条件を１つ取り出す。ここでは（０，１）が取り出されたものとする。ステップＳＣ５では配列Ｌの要素数が０以上１より少ないか調べる。配列の要素数は１であるためこの条件を満たさず、ステップＳＣ３へと戻る。ステップＳＣ３ではまだ処理を実施していないしきい値条件（１，∞）が存在するため、ステップＳＣ４へと進み（１，∞）を取り出す。ステップＳＣ５では配列の要素数が１以上であるか調べる。この条件を満たすため、ステップＳＣ６へと進み配列Ｌの２番め以降のリスト項目の状態を削除する。ここではリスト項目は配列の１番目に登録されているリスト項目１のみなので特に削除は発生せず、ステップＳＣ７で状態ｓ1を返す。
【００７１】
ＧＵＩ状態取得部７は、図１３のステップＳ４でＧＵＩ状態変換部８が返したＧＵＩの状態を改めてｓ1と置き、ステップＳ２へと戻る。ステップＳ３，Ｓ４を実施していない状態取得条件が記憶装置３に存在しないため、ステップＳ５でＧＵＩの状態としてｓ1を返す。ＧＵＩの状態ｓ1の内容は図２５と等しい。
【００７２】
網羅操作部６は、ＧＵＩ状態取得部７が返した状態ｓ1に対して、未操作のＧＵＩ要素を自動操作する。それまでに取得した状態ｓ0とｓ1は図２３と図２５が示すように異なるものなので、状態ｓ1においてボタン１は未操作のＧＵＩ要素となる。よってボタン１が自動操作され、ＧＵＩが図２６へと変化する。網羅操作部６は変化したＧＵＩに対して同様の処理を行い、ＧＵＩ状態取得部７を使ってＧＵＩの状態を取得する。
【００７３】
ＧＵＩ状態取得部７は、図１３の手続を実施し、ステップＳ１で、まず図２７のＧＵＩの状態を取得しｓ2と置く。ステップＳ２，Ｓ３へと進み記憶装置３から状態取得条件ｃ1を取り出す。さらにステップＳ４でＧＵＩ状態変換部８にＧＵＩの状態ｓ2と状態取得条件ｃ1を渡す。
【００７４】
ＧＵＩ状態変換部８は、図１４の手続を実施する。このときＧＵＩの状態ｓ0やｓ1のときと同様にｓ2に含まれる組（ラベル２，キャプション，20120704-033300）が削除される。ステップＳＡ６にて削除された状態をＧＵＩ状態取得部７に返す。このときのＧＵＩの状態を図２８に示す。
【００７５】
ＧＵＩ状態取得部７は、図１３のステップＳ４でＧＵＩ状態変換部８が返したＧＵＩの状態を改めてｓ2と置き、ステップＳ２へと戻る。まだステップＳ３，Ｓ４を実施していない状態取得条件が記憶装置３に存在するため、ステップＳ３で状態取得条件ｃ2取り出し、ステップＳ４にて再度、ＧＵＩ状態変換部８にＧＵＩの状態ｓ2とｃ2を渡す。
【００７６】
ＧＵＩ状態変換部８は、まず図１４の手続のステップＳ１１を実施する。ここで状態取得条件ｃ2はパターンＡではないため、すなわちＧＵＩ要素とプロパティではないため、図１５の手続へ進む。図１５のステップＳ１２ではｃ2がパターンＢであるか、すなわちＧＵＩ要素とプロパティ、プロパティ値の変換関数であるか調べる。ｃ2はこの条件に合致するため、ｃ2のプロパティである乱数をｐcと置き、さらに変換関数をｆと置く。以降では、ＧＵＩの状態ｓ1と同様に処理が実施され、ステップＳＢ５にてｓ1に含まれる組（リスト項目１，乱数，１）が（リスト項目１，乱数，ＲＡＮＤ）に、（リスト項目２，乱数，５）が（リスト項目２，乱数，ＲＡＮＤ）に変換される。結果としてステップＳＢ６にて変換されたＧＵＩの状態が返される。この時のＧＵＩの状態を図２９に示す。
【００７７】
ＧＵＩ状態取得部７は、図１３のステップＳ４でＧＵＩ状態変換部８が返したＧＵＩの状態を改めてｓ2と置き、ステップＳ２へと戻る。まだステップＳ３，Ｓ４を実施していない状態取得条件が記憶装置３に存在するため、ステップＳ３で状態取得条件ｃ3取り出し、ステップＳ４にて再度、ＧＵＩ状態変換部８にＧＵＩの状態ｓ2とｃ3を渡す。
【００７８】
ＧＵＩ状態変換部８は、まず図１４の手続のステップＳ１１を実施する。ここで状態取得条件ｃ3はパターンＡではない、すなわちＧＵＩ要素とプロパティではないため、図１５の手続へ進む。図１５のステップＳ１２ではｃ3がパターンＢであるか、すなわちＧＵＩ要素とプロパティ、プロパティ値の変換関数であるか調べる。ｃ3はこの条件に合致しないため、図１６の手続へと進む。図１６のステップＳＣ１では、ｃ3のリスト部品のＧＵＩ要素であるリストビュー１をｅ，しきい値条件の集合｛（０，１），（１，∞）｝をＴとする。次にステップＳＣ２にてＧＵＩの状態ｓ2から、ＧＵＩ要素ｅであるリストビュー１のリスト項目のＧＵＩ要素を取り出し、配列Ｌに格納する。図２６のＧＵＩにはリスト項目はリスト項目１とリスト項目２が存在するため、配列Ｌの１番目の要素にリスト項目１が、２番めの要素にリスト項目２が登録される。ステップＳＣ３，ＳＣ４のへと進み、しきい値条件の集合Ｔから、しきい値条件を１つ取り出す。ここでは（０，１）が取り出されたものとする。ステップＳＣ５では配列Ｌの要素数が０以上１より少ないか調べる。配列の要素数は２であるためこの条件を満たさず、ステップＳＣ３へと戻る。ステップＳＣ３ではまだ処理を実施していないしきい値条件（１，∞）が存在するため、ステップＳＣ４へと進み（１，∞）を取り出す。ステップＳＣ５では配列の要素数が１以上であるか調べる。この条件を満たすため、ステップＳＣ６へと進み配列Ｌの２番目以降のリスト項目の状態を削除する。ここでは配列の２番目に登録されているリスト項目２の状態、すなわち｛（リスト項目２，登録順番，２），（リスト項目２，乱数，ＲＡＮＤ）｝が削除される。続くステップＳＣ７で削除されたＧＵＩの状態が返される。このときのＧＵＩの状態を図３０に示す。
【００７９】
ＧＵＩ状態取得部７は、図１３のステップＳ４でＧＵＩ状態変換部８が返したＧＵＩの状態を改めてｓ2と置き、ステップＳ２へと戻る。ステップＳ３，Ｓ４を実施していない状態取得条件が記憶装置３に存在しないため、ステップＳ５でＧＵＩの状態としてｓ2を返す。ＧＵＩの状態ｓ2の内容は図３０と等しい。
【００８０】
網羅操作部６は、ＧＵＩ状態取得部７が返した状態ｓ2に対して、未操作のＧＵＩ要素を自動操作する。それまでに取得した状態ｓ0とｓ1は図２３と図２５である。このとき図３０が示す状態ｓ2は状態ｓ1と等しい。既に等しい状態であるｓ1においてボタン１は自動操作されているため、状態ｓ2にとってボタン１は未操作のＧＵＩ要素とはならない。この時点において状態ｓ0と状態ｓ1（＝ｓ2）において未操作のＧＵＩ要素は存在しないため、網羅操作が完了する。
【００８１】
このように本発明によれば、テスト対象アプリケーションのＧＵＩを網羅的に自動操作してＧＵＩの状態遷移グラフを生成するときに、テスト対象アプリケーションが無限のＧＵＩの状態を持つ場合でも、自動操作処理が無限ループに陥らず必ず処理が終了することが可能になる。
【符号の説明】
【００８２】
１…入力装置、２…コンピュータ本体、３…記憶装置、４…表示装置、５…ＧＵＩ状態取得条件管理部、６…網羅操作部、７…ＧＵＩ状態取得部、８…ＧＵＩ状態変換部
【図１】
2014044613.tif 000003
【図２】
2014044613.tif 000004
【図３】
2014044613.tif 000005
【図４】
2014044613.tif 000006
【図５】
2014044613.tif 000007
【図６】
2014044613.tif 000008
【図７】
2014044613.tif 000009
【図８】
2014044613.tif 000010
【図９】
2014044613.tif 000011
【図１０】
2014044613.tif 000012
【図１１】
2014044613.tif 000013
【図１２】
2014044613.tif 000014
【図１３】
2014044613.tif 000015
【図１４】
2014044613.tif 000016
【図１５】
2014044613.tif 000017
【図１６】
2014044613.tif 000018
【図１７】
2014044613.tif 000019
【図１８】
2014044613.tif 000020
【図１９】
2014044613.tif 000021
【図２０】
2014044613.tif 000022
【図２１】
2014044613.tif 000023
【図２２】
2014044613.tif 000024
【図２３】
2014044613.tif 000025
【図２４】
2014044613.tif 000026
【図２５】
2014044613.tif 000027
【図２６】
2014044613.tif 000028
【図２７】
2014044613.tif 000029
【図２８】
2014044613.tif 000030
【図２９】
2014044613.tif 000031
【図３０】
2014044613.tif 000032