(57)【要約】【課題】  本発明の課題は、テスト対象となるＧＵＩ（Ｇｒａｐｈｉｃａｌ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）アプリケーションにおいて、ユーザが行った操作を記録し、その動作を再現するようなテストコードを自動生成することであり、Ｘウィンドウ・システムやウィンドウズ（登録商標）に代表されるイベント・メッセージの中継・捕捉といった手段に依存しない、テストコードの自動生成を行うプログラムとその方法を提供することである。【解決手段】  テスト対象となるＧＵＩアプリケーション１００に対して、ＧＵＩアプリケーション１００の処理系が提供するデバッガライブラリ３０から情報を取得し保存するレコーダ２０と、前記情報を保持する情報記憶部４０と、情報記憶部４０からテストコードソースファイル２００を出力するテストコード出力部５０を備えるようにテストコード自動生成プログラムを構成する。【選択図】図１
2013149178.tif 000002
【特許請求の範囲】
【請求項１】
テスト対象となる単一および複数のＧＵＩアプリケーションに対して、操作した手順や値を記録するためのテストコード自動生成プログラムにおいて、前記ＧＵＩアプリケーションの処理系が提供するデバッガライブラリから情報を取得し保存するレコーダと、前記情報を保持する情報記憶部と、前記情報記憶部からテストコードソースファイルを出力するテストコード出力部を設けたことを特徴とするテストコード自動生成プログラム。
【請求項２】
請求項１のテストコード自動生成プログラムにおいて、単一および複数のＧＵＩアプリケーションが、テストコード自動生成プログラムとは別のコンピュータ上で動作していることを特徴とするテストコード自動生成プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
この発明は、ＧＵＩ（Ｇｒａｐｈｉｃａｌ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）アプリケーションのテスト支援システムに係り、特に、テスト自動化で使用するテストコードの自動生成に関する。
【背景技術】
【０００２】
近年、プログラムを作成する際、同時にそのプログラムのテストコードも作成するという開発形態が一般的になってきている。理由としては、プログラムコードを修正した際、テストコードがあれば回帰テストをすぐに実行することが出来、開発効率がよいからである。たとえば、Ｊａｖａ（登録商標）においては、ＪＵｎｉｔと呼ばれるテストフレームワークが存在し、このフレームワークに従ったテストコードを作成すれば、簡単に単体テストを行うことができる。
【０００３】
しかしながら、テストコードの作成は、対象となるプログラムのプログラム間インターフェース（関数の引数等）が変わると、テストコードの修正が必要となるなど、テストコードの作成自体が開発者にとって非常に労力が必要な作業となっている。そのため、テストコード自体を自動生成する手法が種々提案されている。
【０００４】
例えば、特許文献１においては、テスト対象となるＧＵＩアプリケーションを修正して、Ｘウィンドウ・システムのイベント・メッセージを補足し、イベント情報としてファイルに格納し、保存したイベント情報より、ＧＵＩを自動実行し操作する方法が紹介されている。
【０００５】
また、特許文献２においては、従来の方法として、Ｘウィンドウ・システムにおけるイベント・メッセージの補足方法としてＸサーバの特別な拡張機能を使用して補足する方法が紹介されており、その改善点として同文献では、メッセージ交換手段を作成することにより、ＧＵＩアプリケーションにおけるイベント・メッセージの補足とＧＵＩアプリケーションを再生する手法が紹介されている。
【０００６】
また、特許文献３においては、ウィンドウズ（登録商標）におけるＧＵＩアプリケーションの動作記録方法として、ウィンドウズ（登録商標）のＯＳ内部で発生するイベント・メッセージを読み込んでＧＵＩ用スクリプトファイルに保存するという方法が紹介されている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開平７−８４７６５
【特許文献２】特許第３２７１６８２号
【特許文献３】特許第４２９５７７５号
【発明の概要】
【発明が解決しようとする課題】
【０００８】
上記方法では、Ｘウィンドウ・システム、ウィンドウズ（登録商標）のいずれの場合にしても、ＧＵＩアプリケーションがイベント・メッセージを処理する前にイベント・メッセージを補足し、イベント情報を記録するという方法であり、イベント・メッセージがない（またはイベント・メッセージを補足することが難しい）ＧＵＩシステムにおいては、同様の手法を取り入れることができず、テストコードを自動生成することが困難であった。
【０００９】
本発明は、イベント・メッセージがないＧＵＩシステムにおいても、ユーザがＧＵＩアプリケーションを操作した内容を記録し、テストコードを自動生成する手法を、提案するものである。
【課題を解決するための手段】
【００１０】
本発明は、テスト対象となるＧＵＩアプリケーションにおいて以下の条件を前提とする。
（イ）ＧＵＩアプリケーションは、ＧＵＩに関して特定のＧＵＩフレームワーク（またはＧＵＩライブラリ）を使用して実装されている。
（ロ）ＧＵＩアプリケーションと（イ）のフレームワークは、シンボリックデバッガにより、デバッグ可能である。
（ハ）（ロ）で提供されるデバッガは、外部プログラムから操作できるデバッガライブラリを持ち合わせている。
（ニ）ユーザの動作を再現できるようなテストプログラムのテストフレームワークが存在している。
（ホ）テストコードを自動生成するに当たり、ＧＵＩフレームワークにおいて必要となるデータ項目が明確になっている。
【００１１】
本発明におけるテストコード自動生成プログラムは、以下のレコーダ、情報記憶部、テストコード出力部を含むプログラムを作成することで達成される。
【００１２】
レコーダは、テスト対象となるＧＵＩアプリケーションの処理系が持つデバッガライブラリを使用し、前記ＧＵＩアプリケーションを起動し、起動後、テストコード生成に必要となる個所に実行停止（以降、ブレイクと記述する）ポイントを自動的に設定し、前記ＧＵＩアプリケーションが動作している間は、自動で以下の動作を行うモジュールである。
（Ａ）設定したブレイクポイントによるテスト対象プログラムのブレイク
（Ｂ）テストコードの生成に必要なデータの取得、情報記憶部への保存
（Ｃ）ＧＵＩアプリケーションの再開
【００１３】
情報記憶部は、レコーダが記録した内容を一時的に保持し、テストコードを生成するときに使用するモジュールである。
【００１４】
テストコード出力部は、情報記憶部に蓄積したデータを元にテストコードを生成するモジュールである。
【発明の効果】
【００１５】
本発明を用いることで、イベント・メッセージのないＧＵＩシステムにおいても、ユーザがＧＵＩアプリケーションを操作した内容を記録し、テストコードを自動生成することが可能である。
【００１６】
また本発明を用いることで、ＧＵＩアプリケーション及びＧＵＩアプリケーションが使用するＧＵＩフレームワークを変更することなく、ＧＵＩアプリケーションを動作させた時のユーザの操作を記録し、その記録した内容からユーザ操作と同じ動作を行うテストコードを自動生成することができる。
【００１７】
更に本発明を用いることで、ＧＵＩフレームワークに依存するが、ＧＵＩアプリケーションに依存しないテストコード自動生成プログラムを作成することができる。
【図面の簡単な説明】
【００１８】
【図１】本発明の実施形態の一例を表す構成図である。モジュール間の実線は、モジュール間の関連を表し、矢印線はデータの流れを表す。他の構成図も同様の記法とする。
【図２】図１における、テストコード自動生成プログラムの動作を表すフローチャートである。矢印線は処理の流れを表す。
【図３】ＧＵＩアプリケーション、テストコードソースファイル、テストコード自動生成プログラムにＪａｖａ（登録商標）を使用した場合の、テストコード自動生成プログラムの実施形態の一例を表す構成図である。
【図４】図３における、ＧＵＩアプリケーションの具体例である、画面構成を表す。
【図５】図３における、ＧＵＩフレームワークの具体例である。
【図６】図３における、ブレイクポイント設定テーブルの具体例である。
【図７】図３における、ＧＵＩアプリケーション固有部分の実装部分の具体例である。
【図８】図４のＧＵＩアプリケーションにおいて、記録中にユーザが行った操作の例である。
【図９】図４に対してレコーダが記録したトレース情報テーブルの具体例である。
【図１０】図３における、テストコード変換テーブルの例である。
【図１１】図３において、出力されたテストコードの例である。
【発明を実施するための形態】
【００１９】
以下、本発明の実施の形態を図面を参照して説明する。
【００２０】
図１は、本発明によるテストコード自動生成プログラムの実施の形態に係るもので、その内部・外部の構成を表す図であり、このプログラムは、コンピュータシステムにおけるハードウェア資源を使用することによって実現されるものである。
【００２１】
図１に示すように、このテストコード自動生成プログラム１０は、テスト対象となるＧＵＩアプリケーション１００の動作を記録するレコーダ２０、レコーダ２０が取得した情報を保持するための情報記憶部４０、情報記憶部４０からテストコードソースファイル２００を出力するテストコード出力部５０、によって構成される。レコーダ２０は、ＧＵＩアプリケーション１００の処理系が提供するデバッガライブラリ３０を使用するため、デバッガライブラリ３０と接続している。ＧＵＩアプリケーション１００は、内部的には、ＧＵＩフレームワーク１１０とＧＵＩアプリケーションの固有部分１２０に分かれる。テストコードソースファイル２００は、テストコード自動生成プログラム１０が、ＧＵＩアプリケーション１００のユーザによる操作を記録した後に出力する、ユーザの操作と同じ動作するテストコードソースファイルを表している。
【００２２】
図２は、テストコード自動生成プログラム１０がＧＵＩアプリケーション１００を起動してからテストコードソースファイル２００を出力するまでの処理手順を表すフローチャートである。以下、図２のフローチャートを元にテストコード自動生成プログラム１０の処理手順について説明する。
【００２３】
まず、ステップＳＴ１−１においてレコーダ２０がＧＵＩアプリケーション１００を一時停止の状態で起動し、ステップＳＴ１−２において、ＧＵＩフレームワーク１１０に対してテストコード生成に必要な情報が抽出できる箇所に、デバッガライブラリ３０を使ってブレイクポイントを設定する。その後、ステップＳＴ１−３において、ＧＵＩアプリケーション１００を再開する。以降は、ユーザはＧＵＩアプリケーション１００を操作することが出来、ユーザ操作の記録が可能な状態となる。
【００２４】
続いて、フローチャートはＧＵＩアプリケーションが終了するかユーザによって記録が停止されるまでのループの処理となる。ステップＳＴ１−４は、ＧＵＩアプリケーション１００が起動中であるかの判定処理であり、起動中であれば処理を継続し、終了していればステップＳＴ１−９に進む。また、ステップＳＴ１−５は、テストコード自動生成プログラム１０においてユーザによって記録の停止が要求されたかどうかの判定処理であり、停止要求されていなければ処理は継続し、停止要求されていれば、ステップＳＴ１−９に進む。
【００２５】
続いて、ステップＳＴ１−６は、ＧＵＩアプリケーション１００がブレイクポイントでブレイクされるまで待つ処理である。ステップＳＴ１−６において、ＧＵＩアプリケーション１００がブレイクポイントによりブレイクされると次の処理に進む。ステップＳＴ１−７は、ブレイクしたときの状態で、デバッガライブラリ３０を使用してテストコード生成に必要な情報をＧＵＩフレームワークから取得し、情報記憶部４０に格納する。ステップＳＴ１−８では、デバッガライブラリ３０を使用してＧＵＩアプリケーション１００を再開する。
【００２６】
最後に、ＧＵＩアプリケーション１００が終了したか、ユーザにより停止要求された場合は、ステップＳＴ１−９に進む。ステップＳＴ１−９において、テストコード出力部５０が情報記憶部４０の情報を元にテストコードソースファイル２００を、コンピュータシステムのストレージまたはメモリまたはデータベースに出力する。
【００２７】
図３は、Ｊａｖａ（登録商標）を使用したＧＵＩアプリケーション１０３における、Ｊａｖａ（登録商標）によるテストコード自動生成プログラム１０の実施例である。ここでは、出力するテストコードソースファイル２０１もＪａｖａ（登録商標）で記述される。以下、図３を用いて、ＧＵＩアプリケーション、テストコード、テストプコード自動生成プログラムにＪａｖａ（登録商標）を使用した場合の実施例を説明する。
【００２８】
図１におけるデバッガライブラリ３０は、図３においては、ＪＤＩ（Ｊａｖａ（登録商標）  Ｄｅｂｕｇ  Ｉｎｔｅｒｆａｃｅ）３１に置き換わる。ＪＤＩ３１はＪＤＷＰ（Ｊａｖａ（登録商標）  Ｄｅｂｕｇ  Ｗｉｒｅ  Ｐｒｏｔｏｃｏｌ）３２を使って、ＧＵＩアプリケーション１０３を動作させているＪａｖａ（登録商標）  ＶＭ（Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ）１０１に接続する。情報記憶部４０は、実施例としてブレイクポイント設定テーブル６０、トレース情報テーブル７０、テストコード変換テーブル８０を持つ。
【００２９】
図３におけるレコーダ２０、テストコード出力部５０の動作としては以下の通りである。レコーダ２０は、ＧＵＩアプリケーション１００起動時、ブレイクポイント設定テーブル６０に記載している、ＧＵＩフレームワーク１１０のメソッド（Ｃ＋＋のメンバ関数にあたる）の先頭に、ＪＤＩ３１を使用してブレイクポイントを設定する。ブレイクポイント設定テーブル６０は、テストコード生成に必要な情報を抽出できる個所を記載しているテーブルであり、記録動作を開始する前に予めデータが用意されていることを想定する。レコーダ２０は、記録動作中にブレイクした時、テストコード生成に必要な情報をＪＤＩ３１を使用して取得し、トレース情報テーブル７０に記録する。レコーダ２０の記録動作が終了するとテストコード出力部５０が動作する。テストコード出力部５０は、トレース情報テーブル７０のレコードをテストコード変換テーブル８０を使用してテストコードに変換しながらテストコードソースファイル２０１を出力する。テストコード変換テーブル８０は、トレース情報テーブル７０の情報からテストコードに変換する際、テストコード上のメソッドに置き換えるための変換テーブルであり、テストコード出力動作を開始する前に予めデータが用意されていることを想定する。
【００３０】
図３のような構成にすれば、Ｊａｖａ（登録商標）を使用した環境において、本発明のテストコード自動生成プログラムが実施可能である。
【００３１】
続いて、図３の実施例について、図４〜図１１の具体例を用いて、ＧＵＩアプリケーションにおけるユーザの操作の記録からテストコードソースファイル出力までの動作を説明する。ＧＵＩフレームワーク、ＧＵＩアプリケーション、テストコードは、Ｊａｖａ（登録商標）で記述されることを想定する。以下、この具体例について説明する。
【００３２】
図４は、図３におけるＧＵＩアプリケーションの例である。図４のＧＵＩアプリケーション５００は、ＧＵＩ部品として、”ＭＥＮＵ１”、”ＭＥＮＵ２”、”ＭＥＮＵ３”というキャプションを持つメニュー５０２、メニュー５０３、メニュー５０４を持ち、また、”ＢＵＴＴＯＮ”というキャプションを持つボタン５０１を持つ。ＧＵＩアプリケーション５００は、メニュー部分を除いて、幅×高さは１８０×１８０で構成されており、ボタン５０１は、ウィンドウ部分の座標（１２０、８０）の部分に配置されている。ボタン５０１の幅×高さは６０×２０となっている。
【００３３】
図５は、図３におけるＧＵＩアプリケーションのＧＵＩフレームワークの実装例である。ＧＵＩフレームワーク５１０は、ＧＵＩ部品のボタンを表すＢｕｔｔｏｎクラス、ＧＵＩ部品のメニューを表すＭｅｎｕＩｔｅｍクラス、画面を表すＷｉｎｄｏｗクラスによって構成されている。ＧＵＩフレームワーク５１０における下線部分は、記録動作開始時、レコーダ２０が設定する、ブレイクポイントの設定する場所を表している。
【００３４】
Ｂｕｔｔｏｎクラスは、コンストラクタＢｕｔｔｏｎ（）とボタンクリック時に動作するメソッドｏｎＣｌｉｃｋｅｄ（）を持つ。コンストラクタＢｕｔｔｏｎ（）は、リソースＩＤを表すｉｄ、ボタンの左上Ｘ座標の位置を表すｐｏｓＸ、ボタンの左上Ｙ座標の位置を表すｐｏｓＹ、ボタンに表示する文字列ｃａｐｔｉｏｎ、ボタンを配置するＷｉｎｄｏｗを表すｗｉｎを引数で受け取り、Ｂｕｔｔｏｎクラスのフィールド（Ｃ＋＋のメンバ変数にあたる）に保持し、その後、ＧＵＩ部品の表示を行う。ｏｎＣｌｉｃｋｅｄ（）メソッドは、呼ばれると内部で更にＷｉｎｄｏｗクラスのｏｎＢｕｔｔｏｎＣｌｉｃｋｅｄ（）メソッドを呼び出す。つまり、ボタンクリック時、ＷｉｎｄｏｗクラスのｏｎＢｕｔｔｏｎＣｌｉｃｋｅｄ（）メソッドが呼ばれ、ＷｉｎｄｏｗクラスのｏｎＢｕｔｔｏｎＣｌｉｃｋｅｄ（）メソッドをオーバーライドすることで、ＧＵＩアプリケーション固有の動作が実装できる。
【００３５】
ＭｅｎｕＩｔｅｍクラスも、Ｂｕｔｔｏｎクラスと同様にコンストラクタＭｅｎｕＩｔｅｍ（）、メニュー選択時に動作するメソッドｏｎＳｅｌｅｃｔｅｄ（）を持つ。ｏｎＳｅｌｅｃｔｅｄ（）メソッドは、呼ばれると内部で更にＷｉｎｄｏｗクラスのｏｎＭｅｎｕＩｔｅｍＳｅｌｅｃｔｅｄ（）メソッドを呼び出す。つまり、メニュー選択時、ＷｉｎｄｏｗクラスのｏｎＭｅｎｕＩｔｅｍＳｅｌｅｃｔｅｄ（）メソッドが呼ばれ、ＷｉｎｄｏｗクラスのｏｎＭｅｎｕＩｔｅｍＳｅｌｅｃｔｅｄ（）メソッドをオーバーライドすることで、ＧＵＩアプリケーション固有の動作が実装できる。
【００３６】
Ｗｉｎｄｏｗクラスは、ＧＵＩアプリケーションの基本的な画面を表しており、ＧＵＩアプリケーションはＷｉｎｄｏｗクラスから派生して作成することを想定している。Ｗｉｎｄｏｗクラスでは、アプリケーション開始時（画面生成時）に呼ばれるｃｒｅａｔｅ（）メソッド、ｃｒｅａｔｅ（）から呼ばれるｏｎＣｒｅａｔｅｄ（）メソッド、画面のＧＵＩ部品以外をクリックしたときに呼ばれるｏｎＤｅｖｉｃｅＴｏｕｃｈｅｄ（）メソッド、ボタンクリック時に呼び出されるｏｎＢｕｔｔｏｎＣｌｉｃｋｅｄ（）メソッド、メニュー選択時に呼び出されるｏｎＭｅｎｕＩｔｅｍＳｅｌｅｃｔｅｄ（）メソッド、ｏｎＤｅｖｉｃｅＴｏｕｃｈｅｄ（）メソッドから呼び出されるｏｎＴｏｕｃｈｅｄ（）メソッドを持つ。ｏｎＣｒｅａｔｅｄ（）メソッド、ｏｎＢｕｔｔｏｎＣｌｉｃｋｅｄ（）メソッド、ｏｎＭｅｎｕＩｔｅｍＳｅｌｅｃｔｅｄ（）メソッド、ｏｎＴｏｕｃｈｅｄメソッド（）は、ＧＵＩアプリケーション側の実装であるＷｉｎｄｏｗクラスの派生クラスでオーバーライドすることで、ＧＵＩアプリケーションの固有の動作を実装できるようになっている。ｏｎＴｏｕｃｈｅｄ（）メソッドは、引数のｘ、ｙでクリックした座標のＸ座標、Ｙ座標を受け取る。
【００３７】
図６の５６０は、レコーダ２０が、ＧＵＩフレームワーク５１０にブレイクポイントを設定する際に使用する、ブレイクポイント設定テーブル６０の例である。レコーダ２０は、ＧＵＩアプリケーション５００を起動した後、このブレイクポイント設定テーブル５６０を参照して、ＧＵＩフレームワーク５１０の下線箇所にブレイクポイントを設定する。
【００３８】
図７の５２０は、ＧＵＩフレームワーク５１０を用いたＧＵＩアプリケーション５００のＧＵＩアプリケーションの固有部分の実装例である。５２０のＳａｍｐｌｅＡｐｐｌｉｃａｔｉｏｎクラスは、ＧＵＩアプリケーション５００のメインとなるクラスである。ＳａｍｐｌｅＡｐｐｌｉｃａｔｉｏｎクラスでは、フィールドとして、Ｂｕｔｔｏｎクラスのｂｕｔｔｏｎ、ＭｅｎｕＩｔｅｍクラスのｍｅｎｕＩｔｅｍ１、ｍｅｎｕＩｔｅｍ２、ｍｅｎｕＩｔｅｍ３を持ち、それぞれ、ＧＵＩアプリケーション５００のボタン５０１、メニュー５０２、メニュー５０３、メニュー５０４を表している。ＧＵＩ部品を生成するために、ＷｉｎｄｏｗクラスのｏｎＣｒｅａｔｅｄ（）メソッドをオーバーライドし、その中でＧＵＩ部品のボタンとメニューの生成を行っている。また、ボタンクリック時の動作を実装するためにｏｎＢｕｔｔｏｎＣｌｉｃｋｅｄ（）メソッドをオーバーライドし、メニュー選択時の動作を実装するためにｏｎＭｅｎｕＩｔｅｍＳｅｌｅｃｔｅｄ（）メソッドをオーバーライドし、画面クリック時の動作を実装するためにｏｎＴｏｕｃｈｅｄ（）メソッドをオーバーライドしている。
【００３９】
図８の５３０は、ＧＵＩアプリケーション５００において、ユーザがテストコード自動生成プログラムを実行した際、ＧＵＩアプリケーション５００を操作した内容をまとめた表である（以降、操作表と記述する）。操作表５３０は、項目として、操作表における行の連番を表す”Ｎｏ．”、操作した際の時刻を表す”時刻”、ＧＵＩアプリケーション５００においてユーザが行った操作を表する”ＧＵＩアプリケーションでユーザが行った操作”を持つ。時刻にある形式は、Ｎｏ．１を例にすると、”２０１１−１０−２４Ｔ２０：２７：３１．１００”は、「２０１１年１０月２４日２０時２７分３１秒１００ミリ秒」を表しており、Ｎｏ．１の操作であるＧＵＩアプリケーション５００を、「２０１１年１０月２４日２０時２７分３１秒１００ミリ秒に起動した」ということを表している。Ｎｏ．２以降、同様にユーザが行った内容を記述している。
【００４０】
図９の５４０は、ユーザが操作表５３０にある動作を行った際、レコーダ２０が記録したトレース情報テーブルの例である。トレース情報テーブル５４０は、項目として、ブレイクしたときの時刻を表す”時刻”、アプリケーションを区別するための”アプリケーション種別”、ブレイクする直前にユーザが操作していたウィンドウの種別を表す”ウィンドウ種別”、ブレイクする直前にユーザが操作していたコントロール部品のクラスを表す”クラス名”、ブレイク時のメソッドを表す”メソッド”、ブレイク時のメソッドの引数を表す”引数”、ブレイク時のコントロール部品のクラスのフィールドを表す”フィールド”を持つ。項目”アプリケーション種別”は複数のＧＵＩアプリケーションの操作を記録する際にＧＵＩアプリケーションを区別するために設けた項目である。項目”ウィンドウ種別”は複数のウィンドウやダイアログなどが表示された場合、区別するために設けた項目である。
【００４１】
続いて図９のトレース情報テーブル５４０の記録内容について説明する。操作表５３０のＮｏ．１にあるようにＧＵＩアプリケーション５００が起動されると、レコーダ２０は、ＧＵＩアプリケーション５００の実態であるＳａｍｐｌｅＡｐｐｌｉｃａｔｉｏｎクラスが時刻”２０１１−１０−２４Ｔ２０：２７：３１．１００”に起動したことが検出できるため、レコーダ２０はこのタイミングでトレース情報テーブルに時刻、アプリケーション種別、クラス名、メソッド名を記録する。ここでは、アプリケーション種別は”ＳａｍｐｌｅＡｐｐｌｉｃａｔｉｏｎ”、ＧＵＩアプリケーション５００はウィンドウが１つなのでウィンドウ種別には”Ｍａｉｎ”と記録し、クラス名は”ＳａｍｐｌｅＡｐｐｌｉｃａｔｉｏｎ”、メソッド名は”ｃｒｅａｔｅ”と記録する。次に操作表５３０のＮｏ．２にあるようにボタンがクリックされると、ＢｕｔｔｏｎクラスのｏｎＣｌｉｃｋｅｄ（）メソッドにブレイクポイントが設定されていることから、時刻”２０１１−１０−２４Ｔ２０：２７：３２．４００”にＢｕｔｔｏｎクラスのｏｎＣｌｉｃｋｅｄ（）メソッドでブレイクし、このタイミングでボタンがクリックされたことを検出する。前記ｏｎＣｒｅａｔｅｄ（）メソッドと同様にレコーダ２０がトレース情報テーブルに記録する。このとき、ＢｕｔｔｏｎクラスのｏｎＣｌｉｃｋｅｄ（）メソッドでブレイクしたことから、クラス名として”Ｂｕｔｔｏｎ”、メソッド名として”ｏｎＣｌｉｃｋｅｄ”をトレース情報テーブルに記録する。また、ボタンが複数あった場合に区別をつけるために、ブレイクしている間、ｏｎＣｌｉｃｋｅｄ（）メソッドの引数である、ＢｕｔｔｏｎクラスのｂｕｔｔｏｎオブジェクトのフィールドｉｄよりリソースＩＤの値を取得し、データ”ｉｄ＝１００１”を項目”フィールド”に記録する。操作表５３０のＮｏ．３についても、Ｎｏ．２と同様にトレース情報テーブルに記録する。操作表５３０のＮｏ．４については、テストコードでの再現で必要となるのは、画面上の座標となるので、ブレイク時、ＷｉｎｄｏｗクラスのｏｎＤｅｖｉｃｅＴｏｕｃｈｅｄ（）メソッドの引数の値を取得し、クリックされた座標が（３０、３０）ということを検出して、「ｘ＝３０、  ｙ＝３０」をトレース情報テーブルの項目「引数」に記録する。以降、同様にユーザが操作したことによりブレイクしたメソッドと取得した情報をトレース情報に記録する。
【００４２】
図１１の５５０は、図９に記録されたトレース情報テーブル５４０の内容を元に、図１０のテストコード変換テーブルを使用してテストコード出力部５０が出力したテストコードの出力例である。
【００４３】
図１１のテストコード５５０においては、ＧＵＩアプリケーションの動作を再現できるテストフレームワークがあると仮定しており、５５０のＴｅｓｔＦｒａｍｅｗｏｒｋクラスがそれにあたる。ＴｅｓｔＰｒｏｇｒａｍクラスのｔｅｓｔＳａｍｐｌｅＡｐｐｌｉｃａｔｉｏｎ（）メソッドは、テスト開始時に呼ばれるメソッドである。ｄｏＷｉｎｄｏｗＣｒｅａｔｅ（）メソッド、ｓｌｅｅｐ（）メソッド、ｄｏＢｕｔｔｏｎＣｌｉｃｋ（）メソッド、ｄｏＭｅｎｕＳｅｌｅｃｔ（）メソッド、ｄｏＷｉｎｄｏｗＴｏｕｃｈ（）メソッドは、ＧＵＩ部品の動作を行うＴｅｓｔＦｒａｍｅｗｏｒｋクラスのテスト用メソッドである。それぞれ、「指定したＷｉｎｄｏｗクラスのウィンドウを開く」、「指定された時間（ミリ秒）の待ちを行う」、「指定されたリソースＩＤのボタンをクリックする」、「指定されたリソースＩＤのメニューを選択する」、「指定された座標を画面上でクリック」というユーザの操作を模倣する処理となっている。
【００４４】
図１０は、テストコード変換テーブルの具体例である。テストコード変換テーブル５７０は、項目として、ＧＵＩフレームワーク１１０の変換対象のクラス名を表す”変換対象のクラス名”、前記該当クラスの変換対象のメソッド名を表す”変換対象のメソッド名”、テストコードで置き換えるテストフレームワーク上のクラス名を表す”変換後のクラス名”、テストコードで置き換えるテストフレームワーク上のメソッド名を表す”変換後のメソッド名”を持つ。
【００４５】
図１１のテストコードの出力方法について具体的に説明する。
【００４６】
ｔｅｓｔＳａｍｐｌｅＣｒｅａｔｅ（）メソッドの中のコード以外は、テンプレートより生成することが出来るので、ｔｅｓｔＳａｍｐｌｅＣｒｅａｔｅ（）メソッドの中のコード以外の詳細な生成方法については省略する。
【００４７】
続いて、ｔｅｓｔＳａｍｐｌｅＣｒｅａｔｅ（）メソッドの中のコードの生成方法について記載する。トレース情報テーブル５４０の１行目より、ＳａｍｐｌｅＡｐｐｌｉｃａｔｉｏｎクラスのウィンドウが開いたことがわかるので、テストコード出力部５０はテストコード変換テーブル５７０を使って「ｄｏＷｉｎｄｏｗＣｒｅａｔｅ（ＳａｍｐｌｅＡｐｐｌｉｃａｔｉｏｎ．ｃｌａｓｓ）；」を出力する。ただし、このときテストコード変換テーブル５７０を使って変換する際、「ＳａｍｐｌｅＡｐｐｌｉｃａｔｉｏｎクラスはＷｉｎｄｏｗクラスの派生クラスであるからＷｉｎｄｏｗクラスでもある」ということを踏まえ、トレース情報テーブル５４０の１行目をテストコード変換テーブル５７０の３行目に関連づけて変換する。続いてトレース情報テーブル５４０の１行目の２行目のレコードの時刻の差分より、ＧＵＩアプリケーションが起動してから１３００ミリ秒待ってからボタンをクリックしていることが分かるので、テストコード出力部は「ｓｌｅｅｐ（１３００）；」を出力する。また、２行目のレコードから「リソースＩＤ＝１００１のボタンをクリックする」ということがわかるので、テストコード出力部はテストコード変換テーブル５７０を使って「ｄｏＢｕｔｔｏｎＣｌｉｃｋ（１００１）；」を出力する。以下、同様にトレース情報テーブル５４０のクラス名、メソッド名、引数、フィールドに記録されている内容とテストコード変換テーブル５７０より、どのくらい待ってから処理するか、どの処理を行うか、が分かるので、図１１の５５０にあるようにテストコードを出力することが出来る。
【００４８】
以上のことから、本発明は、ユーザが行った操作を記録し、その操作を再現することが出来るテストコードを出力することが可能である。
【符号の説明】
【００４９】
１０…テストコード自動生成プログラム
１１…テストコード自動生成プログラムを動作させるためのＪａｖａ（登録商標）  ＶＭ（Ｖｉｒｔｕａｌ  Ｍａｃｈｉｎｅ）
２０…レコーダ
３０…デバッガライブラリ
３１…ＪＤＩ（Ｊａｖａ（登録商標）  Ｄｅｂｕｇ  Ｉｎｔｅｒｆａｃｅ）
３２…ＪＤＷＰ（Ｊａｖａ（登録商標）  Ｄｅｂｕｇ  Ｗｉｒｅ  Ｐｒｏｔｏｃｏｌ）
４０…情報記憶部
５０…テストコード出力部
６０…ブレイクポイント設定テーブル
７０…トレース情報テーブル
８０…テストコード変換テーブル
１００…ＧＵＩ（Ｇｒａｐｈｉｃａｌ  Ｕｓｅｒ  Ｉｎｔｅｒｆａｃｅ）アプリケーション
１０１…ＧＵＩアプリケーションを動作させるためのＪａｖａ（登録商標）  ＶＭ
１１０…ＧＵＩフレームワーク
１２０…ＧＵＩアプリケーションの固有部分
２００…テストコードソースファイル
２０１…Ｊａｖａ（登録商標）によるテストコードソースファイル
５００…ＧＵＩアプリケーションの例
５０１…”ＢＵＴＴＯＮ”というキャプションを持つボタン
５０２…”ＭＥＮＵ１”というキャプションを持つメニュー
５０３…”ＭＥＮＵ２”というキャプションを持つメニュー
５０４…”ＭＥＮＵ３”というキャプションを持つメニュー
５１０…ＧＵＩフレームワークの実装例
５２０…ＧＵＩアプリケーションの固有部分の実装例
５３０…ＧＵＩアプリケーションにおいてユーザが行った操作の例
５４０…トレース情報テーブルの記録例
５５０…テストコードソースファイルの出力例
５６０…ブレイクポイント設定テーブルの例
５７０…テストコード変換テーブルの例
【図１】
2013149178.tif 000003
【図２】
2013149178.tif 000004
【図３】
2013149178.tif 000005
【図４】
2013149178.tif 000006
【図５】
2013149178.tif 000007
【図６】
2013149178.tif 000008
【図７】
2013149178.tif 000009
【図８】
2013149178.tif 000010
【図９】
2013149178.tif 000011
【図１０】
2013149178.tif 000012
【図１１】
2013149178.tif 000013