Sun WorkShop Visual 再現機能を使用して、Xt ベースのアプリケーションを記録および再生することができます。
記録モードでは、Sun WorkShop Visual 再現機能は「push hello_button, type Hello World」のように、ユーザーのアクションを高水準で記述したスクリプトを作成します。
再生モードでは、アプリケーション内の任意のウィジェットの状態を調べたり、再 生速度を制御することができます。スクリプト内のアクションは、ユーザーがキーボードから操作している かのように再生されます。
Sun WorkShop Visual 再現機能のコマンドセットはユーザーによる拡張が可能で、操作性に優れ、柔軟性に富んでいます。Sun WorkShop Visual 再現機能は、次のような幅広い用途に活用することができます。
再コンパイルや再リンクは必要ありません。また、特別なテスト環境も不要です。
Sun WorkShop Visual 再現機能は、Sun WorkShop Visual の「ツール」メニューから使用することができます。また、このツールは 「コマンド行からの記録および再生」で説明するように、コマンド行からも使用することがで きます。
本章では、Sun WorkShop Visual 再現機能の使い方に慣れるために、まず学習手順の中で簡単な例をいくつか挙げながら Sun WorkShop Visual 再現機能の使用方法について説明します。Sun WorkShop Visual 再現機能の拡張については、「Sun WorkShop Visual 再現ウィジェットセットの拡張」 と 「独自の Sun WorkShop Visual 再現機能コマンドの追加」で記述します。
Sun WorkShop Visual 再現機能の構文については 付録 A「Sun WorkShop Visual 再現機能の コマンド構文」を参照してください。
Sun WorkShop Visual 再現機能は、Java アプリケーションに使用できます。その場合は、「Sun WorkShop Visual 再現機能を使用したデバッグ」セクションの説明に従って、最初のアプリケーションとして Java インタプリタを指定し、その後にターゲットアプリケーションを指定しなければなりません。「Sun WorkShop Visual 再現機能を使用したデバッグ」セクションでは、Sun WorkShop Visual 再現機能をコマンド行から使用する場合の間接参照の使い方が説明されています。このように、Java アプリケーションを記録または再生するためには、次のようにして Java インタプリタも指定しなければなりません。
visu_replay java MyJavaProgram
これは Java アプリケーションには当てはまりますが、アプレットには当てはまりません。Java コードの生成の詳細については、第 10 章「Java 用のデザイン」を参照してください。
Sun WorkShop Visual 再現機能が正しく動作するためには、記録したい Motif アプリケーションが Xt ライブラリ (libXt) と動的にリンクしている必要があります。UNIX 実装上では通常、次のように入力してアプリケーションと libXt とのリンクが動的か静的かを判断することができます。
ldd AnApplication
出力に libXt に関する内容がある場合は、そのアプリケーションは Xt ライブラリと動的にリンクしており、Sun WorkShop Visual 再現機能で使用することができます。このライブラリが存在しない場合は、アプリケーションは Xt ライブラリと静的にリンクしている可能性があります。この場合に Sun WorkShop Visual 再現機能を使用するには、アプリケーションを Xt 共用ライブラリと再度リンクする必要があります。
注 - Sun WorkShop Visual 再現機能をすぐに使用したい場合は、本節を省略して 「学習例」に進んでください。
「ツール」メニューから「WorkShop Visual 再現」を選択すると、記録または再生したいアプリケーション名の入力を要求するダイアログが表示されま す。図 14-1 に、そのダイアログを示します。
「コマンド」テキストボックスに名前を入力します。アプリケーションの名前また は保存場所が分からない場合は、「コマンド」というラベルが付いたボタンを押します。図 14-2 に示すような、「パス」スクロールリストを含むファイル選択ボックスが表示されます。
「パス」というラベルが付いた第 2 のスクロールリストには、 PATH 環境変数で指定されている各ディレクトリが表示されます。 このリストから項目を選択すると、そのディレクトリの内容が「ファイル」リストに表示されます。
注 - 「パス」スクロールリストには、Sun WorkShop Visual 再現を実行したときに PATH 環境変数として設定されたディレクトリが表示されます。ただし、Sun WorkShop Visual に必要な特別なディレクトリが含まれている場合もあります。 PATH 設定 は、Sun WorkShop Visual の終了時には実行前と同じ状態になっています。
ダイアログの「ファイル」リストから項目を選択して「了解」ボタンを押すと、そ の項目は 「捕獲/再現」の入力要求ダイアログの「コマンド」フィールドに追加されます。このダイアログの「引数 」というラベルが付いたテキストボックスに、アプリケーションに対するオプションや引数を入力します。 「了解」ボタンを押すと、アプリケーションが Sun WorkShop Visual 再現を使用して実行されます。
1. 「Sun WorkShop Visual 再現」ダイアログはアプリケーションの一部であるため、アプリケーションを終了すると画面から消去され ます。
2. Sun WorkShop Visual 再現機能はアプリケーションの実行内容を監視するだけです。再生モードで動作を再現するだけで、アプリ ケーションの動作には決して影響を与えません。
Sun WorkShop Visual 再現機能は、特に移植性と明確な記述を行うことに重点を置いています。 Motif インタフェースを効率的にテスト実行するように設計されています。
Sun WorkShop Visual 再現機能は、アプリケーション内のウィジェット間の移動およびユーザーとウィジェットとの対話を詳細に 渡って記録します。以下の情報の記録および再生を行うことができます。
Sun WorkShop Visual 再現機能は、汎用の X テスト用機構として設計されているわけではありません。したがって、すべてのアプリケーションの動作が Sun WorkShop Visual 再現で記録されるわけではありません。ただし、Sun WorkShop Visual 再現機能を拡張することはできます。詳細は、「Sun WorkShop Visual 再現ウィジェットセットの拡張」および 「独自の Sun WorkShop Visual 再現機能コマンドの追加」を参照してください。
「Sun WorkShop Visual 再現」ダイアログは、アプリケーションの横に表示されます。また、著作権メッセージも、Sun WorkShop Visual 再現機能の実行時に標準のエラー出力に表示されます。
著作権メッセージが表示されない場合は、アプリケーションが Xt ライブラリと動的にリンクしていない可能性があります。詳細は、「Sun WorkShop Visual 再現機能を使用する前に」を参照してください。
図 14-3 に、「Sun WorkShop Visual 再現」ダイアログを示します。
また、Sun WorkShop Visual 再現機能の実行中にコマンド行からこのダイアログを表示することもできます。詳細は、「コマンド行からの記録および再生」を参照してください。
このダイアログには、Sun WorkShop Visual 再現用とSun WorkShop Visual 捕獲用の 2 つのページがあります。ページを切り替えるには、「ページ」というラベルが付いたオプションメニューを 選択します。Sun WorkShop Visual 捕獲機能を使用する場合のダイアログについては、500 ページの「捕獲ダイアログ」を参照してください。
「Sun WorkShop Visual 再現」ダイアログが表示されると、スクリプトの記録および再生を直ちに実行することができます。スクリ プトの記録および再生はすべて、図 14-4 に示す 「Sun WorkShop Visual 再現」ウィンドウ上のボタンを使用して行います。
選択したスクリプトの現在の位置から、アプリケーションに対して行なったユーザ
ーアクションを記録します。スクリプトを停止した後でこのボタンを押すと、スクリプトはその位置から上
書きされます。スクリプトの最後でこのボタンを押すと、そのスクリプトに追加されます。 |
||
スクリプトが停止した位置に、アプリケーションに対して行なったユーザーアクシ
ョンを記録します。スクリプト内のアクションは変更されません。 |
||
有効なボタンだけが選択可能です。無効なボタンはグレー表示されています。
スクリプトを作成する前は、押すことができるボタンは「録画」だけです。このボ タンを押すと「unnamed (名前未定)」のスクリプトが作成されます。スクリプトを作成したら、そのスクリプトの「巻き戻し」、「 再生」、「シングルステップ」を実行することができます。
スクリプトを停止または一時停止すると、「挿入」ボタンが有効になります。挿入 処理については、「スクリプトへの挿入」を参照してください。
「新規スクリプト」ボタンを押すと、空のスクリプトが作成されます。スクリプト の命名または名前変更を行うには、次のようにします。
現在選択しているスクリプトは、「Sun WorkShop Visual 再現」ダイアログ内で強調表示されます。
Sun WorkShop Visual 再現のステータスインジケータは、記録中か再生中かを表し、またスクリプト内での現在位置を示します。 ステータスインジケータが赤い場合は、記録中を示します。それ以外の場合は、再生中です。図 14-5 に、インジケータの表示状態としてあり得るものを示します。
「モニター」ボタンを押すと、記録中および再生中に行なったアクションのログが 表示されます。図 14-6 に示すように、記録個所または再生箇所の先頭および末尾を示すコメントは、Sun WorkShop Visual 再現機能によって自動的に挿入されます。
アプリケーション以外のコマンドおよびコメントも、アクションと同じようにスク リプトに追加することができます。追加するには、手動でスクリプトを編集するか Sun WorkShop Visual 再現インタフェースを使用して編集します。本節では、インタフェースからスクリプトを編集する方法を説 明します。
まず、追加コマンドを追加する位置でスクリプトを停止します。追加コマンドをス クリプトの先頭に追加するには、まずスクリプトを巻き戻します。スクリプト内の別の位置にコマンドを追 加する場合は、シングル ステップ実行してその位置まで移動します。
次に「コマンドを追加」というラベルが付いたボタンを押します。テキスト編集ウ ィンドウが表示され、追加コマンドまたはコメントを入力することができます。図 14-7に、このダイアログを示します。
「コメントとして入力」トグルを設定すると、ダイアログの内容がコメントとして 処理されます。スクリプトでは、各行の行頭に「#」文字が付加されます。
「実行」ボタンを押すと、記録されているスクリプトとは無関係に「コマンドを追 加」ダイアログ内のコマンドだけが実行されます。コマンドが実行される様子は、「モニター」ウィンドウ を使用して確認します。コマンドが希望どおりに実行されている場合は、「追加」ボタンを押してそれらの コマンドをスクリプトに保存します。
さらにコマンドまたはコメントを追加入力する場合は、その前に「消去」を押して ください。「コマンドを追加」ダイアログの情報が削除されます。スクリプトの内容には影響しません。 P>
作成したアプリケーションでモード付きアプリケーションダイアログを使用してい る場合は、そのダイアログを閉じなければ Sun WorkShop Visual 再現機能のインタフェースにアクセスすることができません。つまり、モード付きアプリケーションダイア ログ内では記録および再現を停止することはできません。シングルステップモードでは、モード付きアプリ ケーションダイアログで行なったすべてのアクションは、シングルステップとして認識されます。
デフォルトでは、「Sun WorkShop Visual 再現」ダイアログで作成したスクリプトは名前のない一時ディレクトリに保存されます。
注意 - XDS_KEEPDIR 環境変数を定義していない場合は、一時ディレクトリおよびその保存内容は、Sun WorkShop Visual 再現を終了すると自動的に削除されます。 XDS_KEEPDIR 環境変数を定義すると、一時ディレクトリとその保存内容は /tmp/XDS_SAVE に保存されます。作成した内容を保存したい場合は、名前を持ったディレクトリで作業してください (以下の内容を参照してください)。
Sun WorkShop Visual 再現機能の「ディレクトリ」メニューの「別名保存」オプションを使用して、現作業ディレクトリに新しい 名前を付けて保存します。
「ディレクトリ」メニューの「開く」オプションを使用して、別のディレクトリか らスクリプトを開きます。また、「別名保存」オプションを使用して、現在作業しているディレクトリの名 前を変更することもできます。
「編集」メニューのオプションを使用すると、あるディレクトリでカットまたはコ ピーしたスクリプトを別のディレクトリにペーストすることができます。「消去」コマンドを選択すると、 選択したスクリプトが削除されます。
規約により、ファイルシステムでは記録スクリプトには「 .xds 」というファイル名の接尾辞を付けてください。ただし、この接尾辞は、「Sun WorkShop Visual 再現」ダイアログに表示されるスクリプトの名前には使用されません。
この節では、Sun WorkShop Visual 再現機能を使用して visu_config ツールに対して行った操作を記録し、次に再生する方法を段階的に説明します。
注 - 以下の学習例では、visu_config ツールに関する知識は必要ありません。visu_config ツールの詳細については、「visu_config のメインダイアログ」を参照してください。
1. 「ツール」メニューから「WorkShop Visual 再現」を選択します。
2. 「捕獲/再現」ダイアログの「コマンド」フィールドに visu_config と入力し、「了解」ボタンを押します。
visu_config が実行され、その横に「Sun WorkShop Visual 再現」ダイアログが表示されます。
4. 「新規スクリプト」テキストフィールドにスクリプトの名前を入力し、Return キーを押します。
ダイアログが表示され、行なったすべてのアクションのログが表示されます。
6. 図 14-8 に示す「録画」ボタンを押します。
「録画」ボタンおよび「巻き戻し」ボタンが有効になります。それ以外のボタンは すべて無効になります。
アクションの記録を含むファイルが作成されました。このファイルは、いつでも再 生することができます。ここでは内容を確認するために、すぐに再生してみましょう。
「録画」、「挿入」、「再生」、「シングルステップ」の各ボタンが有効になりま す。
これまで記録した内容を見ることができます。「WorkShop Visual 再現」ダイアログの「速い/遅い」スライダを使用すると記録内容を再生する速度を変更することができま す。
このボタンを使用すると、記録スクリプトの各コマンドを 1 ステップずつ実行することができます。このコマンドは、画面に「モニター」ウィンドウがあるとさらに詳 細に内容を確認することができます。各ステップが再生されるたびに、該当するログが「モニター」ウィン ドウに出力されます。
変更を保存するかどうかを尋ねるメッセージに対しては、「いいえ」を選択します 。アプリケーションが終了すると、記録内容の再生も終了し、「WorkShop Visual 再現」ダイアログも消去されます。これは、このダイアログが実際は visu_config プログラムの一部であるためです。
Sun WorkShop Visual 再現機能は、独立したアプリケーションとして提供されています。記録スクリプトおよび再生スクリプトを 両方ともコマンド行から実行することができます。
Sun WorkShop Visual 再現機能 (ユーザーアクションの記録に使用する場合) は、 visu_record という独立したアプリケーションとして提供されます。
ツールに関する基本情報を表示するには、次のように入力します。
visu_record -x
visu_record -f MyRecordScript AnApplication
MyRecordScript は、内容を記録したスクリプトが保存されるファイル名です。この引数を指定する必要はありません。指定 しないと、スクリプトは標準出力に書き込まれます。 AnApplication は、記録するアプリケーションの名前です。 -i フラグを指定すると、ツールを対話形式で使用できます。この場合、「Sun WorkShop Visual 再現機能のインタフェース」で示した 「WorkShop Visual 再現」 ダイアログが表示されます。
Sun WorkShop Visual 再現機能 (記録したスクリプトの再生に使用する場合) は、 visu_replay という独立したアプリケーションとして提供されます。
ツールに関する基本情報を表示するには、次のように入力します。
visu_replay -x
次の行は、Sun WorkShop Visual 再現機能の使用例です。
visu_replay -f MyRecordScript AnApplication
MyRecordScript は、内容を記録したスクリプトを含むファイル名です。この引数を指定する必要はありません。指定しない と、スクリプトは標準入力から読み取られます。 AnApplication は、再実行するアプリケーションの名前です。 -i フラグを指定すると、「WorkShop Visual 再現」 ダイアログでツールを対話形式で使用できます。
本節では、Sun WorkShop Visual 再現機能の応用方法を説明し、以下の項目について説明します。
これらの内容は、Sun WorkShop Visual 再現機能の応用方法のすべてではありません。Sun WorkShop Visual 再現機能の幅広い機能を紹介するために、例として挙げています。
Sun WorkShop Visual 再現機能を使用して作成したスクリプトは、以下に示すような簡単なシェルスクリプトを使用して「連続ル ープ」状態で実行することができます。
while (true)
{
visu_replay -f mydemo.xds myapplication
}
end
アプリケーションの画面ダンプの撮影は、そのアプリケーションがたえず変わる傾 向がある場合は特に複雑になることがあります。Sun WorkShop Visual 再現機能を使用すると、後で何度でも再利用できる画面ダンプ用スクリプトを作成することができます。ま た、画面ダンプ処理が自動化されるので、それらの処理を行うための費用を大幅に削減できます。
画面ダンプスクリプトは、アプリケーションの画面撮影を行う準備をする一連のア クションと、その後に続けて実際の画面撮影を行うアプリケーション外のコマンドで構成されています。以 下に示すスクリプト例では、 current_shell ダイアログの画面ダンプが撮られます。
in current_shell
setenv ID WindowFrame(current_shell)
shell xwd -id $ID -out /tmp/current_shell.xwd
最後の 2 行は非アプリケーションコマンドです。最初の行で変数 ID をウィンドウ装飾を含む現在のシェルウィンドウに設定します。2 番目の行では、 xwd コマンドを使用してシェルウィンドウの画面ダンプを撮影し、保存します。当然、 xwd の代わりに別の画面ダンプコマンドを使用することができます。変数の設定に使用されるキーワードについ ては、「非アプリケーション操作」を参照してください。
Sun WorkShop Visual 再現機能は簡単に使用できて移植性のある、強力なウィジェットベースのテストツールです。Sun WorkShop Visual がサポートするすべてのプラットフォームに対して、テストツールとして使用できます。
ほとんどの Motif/Xt プログラミングでは、Motif ウィジェットを再利用し、X ツールキットを利用しています。Sun WorkShop Visual 再現テストはテスト動作の制御とテストが成功したかどうかの判定の両方を行うために、Xt ウィジェット階層を主に使用します。
ウィジェット自体が正しいかどうかを調べているのではない、ということに注意し てください。Sun WorkShop Visual 再現機能では、ユーザーがアプリケーション内のウィジェットに対して行なったアクションによって、希望 する結果が得られたかどうかだけを調べます。
注 - このテスト上のテクニックおよび方法は、テストの「陳腐化」に対して非常に高い 抵抗力があります。使用するディスプレイのサイズ、形状、品質とは関係なくテスト結果は同じになる必要 があります。アプリケーション自体が変更された場合以外は、テストを追加または更新する必要はありませ ん。また、これらのテストは、テスト担当者に報告されていない変更があれば、すぐに検出します。
すべてのテストをこのように自動化できるわけではありません。アプリケーション が正しく表示されているかどうか、また (描画領域内などで) グラフィックのプログラミングが動作しているかどうかを常に目で確認する必要があります。ただし、ウィ ジェットベースのテスト方法を使用すると、アプリケーションの必要な部分だけに集中することができます 。
これまでの経験から、テストスクリプトを作成する方法には、以下の 3 つの段階があります。
ユーザーアクションが記録されたとおり正確に再生されているかどうかを調べるに は、この方法が最も簡単です。ただし、スクリプトが非常に大きくなり、保守が困難になる場合があります 。また、テストのどの部分が失敗したかを特定することが難しい場合もあります。特に、アプリケーション に変更が加わると、スクリプト全体を再度記録しなければなりません。
ここでは、大規模なスクリプトを小さく独立したスクリプトに分割し、各スクリプ トでアプリケーションが識別可能な部分をテスト実行します。これは非常に効果的なテストテクニックなの で、「テストマクロの使用」に詳細な例を記載しています。プリプロセッサ ( m4 または cpp など) または使い慣れたプログラミング言語を使用して、細分化された各スクリプトを展開することができます。 この方法で、以下のようなスクリプトを構築することができます。
次に、プリプロセッサ、インタプリタ、コンパイラのうちのいずれかがこれらの細 分化スクリプトを完全な Sun WorkShop Visual 再現コマンド群に変換します。この簡単な方法によって段階的なプログラミングは必要なくなり、さらに、テスト スクリプトも管理が非常に簡単になります。
テストを表現するために使用する言語は、注意して選択してください。主な選択基 準は、次のとおりです。
このためには、 Java や Python などのクラスベースの言語が最適です。それ以外の有力候補としては、 Lisp や Prolog などの記号処理向けのモデル化言語があります。 m4 などのプリプロセッサ、または C プリプロセッサでも高速に処理することができます。
または、アプリケーションが使用する言語でモデルを構築してもよいでしょう。こ うすると、ソフトウェアを移植する場合に常に使用することができます。目安としては、一連のテストを設 計しているのではなくプログラムを記述しているように感じたら、必ず他により簡単な方法があるというこ とです。
このテスト方法は、小規模から中規模までの大部分のアプリケーションに適用でき ます。しかし、大規模アプリケーション (Sun WorkShop Visual がその一例) の場合は、細分化にも次のような限界があります。
これまで Sun WorkShop Visual 用のテストを計画してきた経験から、テストを記述する最も費用効果の高い方法は、各ダイアログの記述を 用意してその記述をテストで使用することです。以下に示す Sun WorkShop Visualの 「カラー」ダイアログが記述された例について考えてみます。
ColorDialog.shell = my_color_shell
ColorDialog.helpbutton = color_help
ColorDialog.applybutton = color_apply
ColorDialog.quit = color_quit
左側の名前でダイアログのウィジェットを間接参照できます。右側の名前は特定の ウィジェットの名前です。これらの記述は、以下に示すようなダイアログの名前に渡すだけで、汎用関数に 使用できます。
CheckHelpFor(ColorDialog)
Close(ColorDialog)
以下に、 CheckHelpFor と Close の定義を示します。
#define CheckHelpFor(dialog)
in dialog.shell
push dialog.helpbutton
#enddef
#define Close(dialog)
in dialog.shell
push dialog.quit
#enddef
これらの関数を、 ColorDialog にリストされた記述を含むダイアログに使用して、「ヘルプ」ボタンと 「閉じる」 ボタンが提供されているかどうかを確認することができます。
このテクニックを使用すると、インタフェースの記述とその記述を使用するアクシ ョンを分離することができます。また、インタフェースに変更を加えても、関連するデータ記述に変更を加 える必要があるだけで、テストスクリプトは変更なくそのままです。新規ダイアログをアプリケーションに 追加する際は、その記述およびダイアログで実行される非標準操作を作成するだけで十分です。
このような方法の最大の利点は、記述が簡単で明確であること、また、デザイン自 体に非常に近いため、テストと製品開発の同期をとることで、確実で簡単なテストが実行可能であることで す。
よいテストとは、アプリケーションで調べる対象部分を分離するよう設計されたテ ストです。アプリケーションが停止しなければそのテストは成功です。それ以外の場合は失敗です。
自動再生それ自体が、1 個のユーザーアクションに対して起こり得る 1 つの結果をテストするという意味で、最小単位のテストと言えます。一連の動作がエラーなしで再生される と、予想した内容が実際に行われたということになります。
ファイルを開くというアクションを考えてみます。最小形式のテストでの予測され る結果は、ファイルが開かれ、すべての処理が正常に行われることです。ただし、このテストは決して完全 ではありません。以下のような別の結果も考慮する必要があります。
最も簡単なテストは、アプリケーションでの一連のアクションを記録し、次にその スクリプトを再生してそれらのアクションを複製することです。スクリプトが正常に実行されると、そのア プリケーションには信頼性があると言えますが、基本スクリプトの機能を増やすために Sun WorkShop Visual 再現機能によって提供される制御フローおよび式の追加コマンドを利用すると、さらに信頼性を高めること ができます。これらのコマンドを使用すると、各種ディスプレイへの対応、ウィジェットのリソース設定の 検査、メッセージ出力などを行うことができます。
アプリケーションをモノクロディスプレイで実行している場合はメッセージが表示 されるが、フルカラーディスプレイで実行している場合はメッセージが表示されない、という場合を考えて みます。
もちろん、ディスプレイごとの個別テストは行う必要はありません。代わりに、メ ッセージを表示したい位置にコマンドを挿入し、これらのコマンドを以下のように if 文で囲みます。
if !IsPseudoColor
message Non PseudoColor display
in warning_popup
push warning.OK
endif
これと同じ検査処理は、使用しているディスプレイのハードウェアやウィンドウマ ネージャとは関係なく行われます。
また、アプリケーションのダイアログのサイズも重要です。2 つのダイアログを同時に表示する場合は、あるディスプレイでは両方とも完全に表示され、別のディスプレ イでは重なりあって表示され、3 番目のディスプレイでは一方のダイアログの上に別のダイアログが置かれます。この結果、アプリケーショ ンの中のあるモードの警告メッセージがメインダイアログの下に隠れてしまい、アプリケーションがロック して見えることがあります。
以下のテストスクリプトの一部で、このような問題の解決方法を説明します。
if !IsVisible(open_file_dialog)
error The Open File dialog is off screen
endif
各種ディスプレイを処理する方法については、「表示式」を参照してください。
アプリケーションが各種ディスプレイ上で異なる動作をする場合は、テストもこれ に対応するように作成する必要があります。たとえば、ユーザーにディスプレイの品質が下がることを通知 する警告ダイアログがアプリケーションから表示される場合があります。
今度は、オプションメニューからのオプションの選択について考えてみます。標準 スクリプトが確実に選択を行うので、よいテストスクリプトの場合は、選択が行われたかどうかを検査しま す。
以下の例で、Sun WorkShop Visual の「コード生成」ダイアログで「言語」オプションが予想された値に設定されたかどうかをテストする方法 を示します。
if !languageOption->menuHistory:'cppButton'
message FAIL: Language option error.
printres languageOption->menuHistory
message expected cppButton
endif
それぞれの処理は、特定の visu_replay コマンド行オプションに対応します。
失敗に対しては、自分のスクリプト内にその処理を作成することが最善の方法です 。条件文を使用して、失敗時には正しいアクション (メッセージを出力するなど) をとってください。
上記以外で、テスト失敗の特定に役立つのが -v コマンド行オプションです。このオプションを使用すると、スクリプトからのコマンドは実行されたとおり に標準出力に表示されます。問題点を特定したら、スクリプトをさらに小さくして再度テストします。今度 は (任意のデバッガとともに) このスクリプトを使用して問題点を特定します。また、バグが修正されていることを証明するために、一連 の回帰テストにこのオプションを追加することもできます。
繰り返し使用されるアクション (ダイアログを開く、アプリケーションを起動する、テキストフィールドへ入力するなど) を定義するマクロを使用してテストスクリプトをモジュール化する方法については、「テストの方法」で説明しました。この方法によって、スクリプトはより簡単に手動で作成、 修正、検査することができます。
マクロを使用してスクリプトをモジュール化する方法を説明するために、例として 以下に Sun WorkShop Visual のテストスクリプトからの抜粋を示します。この短いスクリプトは以下のアクションを行います。
最上位スクリプトがより読みやすくなるように上記のテストを行うには、マクロプ リプロセッサ m4 を使用します。このプリプロセッサはすべての UNIX システムで使用することができます。
include(Defs.m4)
StartUp()
shell date
Palette(xd_XmDialogShell)
Palette(xd_XmForm)
VariableName(myform)
SaveDesignAs(mydesign.xd)
message Test Sequence Over
shell date
Finish()
前述のスクリプトの大部分がマクロ呼び出しで構成されています。構文中のキーワ ードについては、付録 A「Sun WorkShop Visual 再現機能の コマンド構文」を参照してください。
Defs.m4 というマクロ定義スクリプトは、以下のとおりです。
define(HandleExpectedWarning,
in warning_popup
push warning.OK)
define(StartUp,
if !IsPseudoColor
message Non PseudoColor display
HandleExpectedWarning()
endif)
define(Palette,
in ApplicationShell
push $1)
define(VariableName,
in ApplicationShell
multiclick nb_vn_t
type $1
key Return)
define(SaveDesignAs,
in ApplicationShell
cascade file_menu
select fm_menu.fm_saveas
in save_dialog_popup
doubleclick Text
type $1
push save_dialog.OK)
define(Finish,
in ApplicationShell
cascade file_menu
select fm_menu.fm_exit
if in save_changes_dialog
push xd_question.xd_question_cancel_b
endif)
次のコマンドは、Sun WorkShop Visual 再現機能に渡される最終スクリプトファイルを作成します。
m4 Test.in > Test.xds
ファイル Test.in が上位スクリプトです。 Test.xds は出力ファイルで、このファイルに展開されたマクロを持つ最終スクリプトが含まれます。
前述したファイルに入力し、次に m4 を使用して最終スクリプトファイルを作成し、この例をテストします。テストが終了したら、次のように Sun WorkShop Visual を使用し、 Test.xds を再生対象のスクリプトとして指定して Sun WorkShop Visual 再現機能を実行します。
visu_replay -f Test.xds visu
さらに一歩進んで、個々のファイルにSun WorkShop Visual のウィジェットパレット上のウィジェットの名前を定義し、次に「shell」や「form」などのより抽象的な 名前からウィジェット名が特定できるように「Palette」マクロを定義します。
define(shell, xd_XmDialogShell)
define(form, xd_XmForm)
アプリケーションが間接アプリケーションの場合は、コマンド行から Sun WorkShop Visual 再現機能を実行することにより、複数のアプリケーション名を指定することができます。
たとえば、次のコマンドでは、 AnApplication で指定したアプリケーションで dbx を実行します。
visu_replay -f MyScript dbx AnApplication
任意のデバッガを使用することができます。Sun WorkShop Visual 再現機能を使用すると、デバッグを開始したい位置にすばやく移動できます。デバッガに入るには、スクリ プトの末尾に移動するか、スクリプトに「ブレークポイント」を入力します。「ブレークポイント」とは、 その後にウィジェット名が続くキーワードです。指定されたウィジェットが活性化されると、アプリケーシ ョンはデバッガに入ります。
Sun WorkShop Visual 再現機能は、スクリプトに記録されたアクションはすぐにユーザーアクションとして認識できなければなら ないという方針に基づいています。
ユーザーとウィジェットとの対話方法 (マウスボタンの 1 つをクリックするなど)、またはキーボードからの入力内容など、Motif アプリケーション内で行われる大部分のアクションを記述することができます。この記述によって、Motif アプリケーションの記録および再現が非常に簡単になります。また、テストを行うユーザーもスクリプトを 理解、プログラミング、保守することが簡単になります。アプリケーションで使用される非標準ウィジェッ トについても同様です。
この方法がすぐに適用できない Motif ウィジェット (ウィジェット内での位置が重要なもの) も多数あります。それらのウィジェットの多く (スケール、スクロールバーなど) は、1 つの機能がそのウィジェットのすべてのインスタンスに対して機能します。描画領域あるいはその他のカス タムウィジェットでは、ウィジェットのインスタンスごとにまったく動作が異なる場合があります。
たとえば、記録用ソフトウェアは描画領域内のクリックを認識しますが、ユーザー はこのアクションを別の見方でとらえています。ユーザーはアプリケーションが描画領域に描画したオブジ ェクトと対話しています。しかし、これらのオブジェクトはアプリケーションのコード内にのみ現われます 。インタフェースの一部ではありません。
アプリケーションプログラマであれば、特定のカスタムウィジェットまたは描画領 域内でのクリックの意味が正確に分かるので、ウィジェットの記録と再現を行うユーザーが理解および使用 できるように、これらのアクションを記述するルーチンを簡単に作成することができます。
描画領域かそれ以外のカスタマイズされたウィジェットをプログラミングしている 場合は、ウィジェット内の (x,y) 座標にあるイベントを、特定のアクションに変換するコードがあらかじめ作成されています。Sun WorkShop Visual 再現が提供するインタフェースを使用してコンバータを登録すると、専用のルーチンを使用してテストを行 うことができます。
Sun WorkShop Visual 再現機能には 2 つのコンバータを設定する必要があります。1 つはある (x,y) 座標のイベントをアクションに変換する記録用コンバータで、もう 1 つはそのアクションを (x,y) 座標に変換する再現用のコンバータです。
変換ルーチンを使用すると、(x,y) 座標をユーザーとウィジェット自体の両方にとって意味のあるものにマップすることができます。
注 - 一部のウィジェットは、ウィンドウ (x,y) 座標とウィジェット内部の構造体との間の変換を簡単に行う方法 ( XmListYToPos 関数など) を提供しています。これは望ましい方法です。これ以外のウィジェットはウィジェットの状態の判断および 変更を行う方法を提供しています。たとえば、 XmScrollBarGetValues を使用してスクロールバー上のユーザーアクションを記録したり、 XmScrollBarSetValues を使用してそのアクションを再現します。イベントを実装することが難しい場合は、コンバータを使用して ウィジェットを直接プログラミングすることができます。
同じ機能がウィジェットクラス (他社のウィジェットなど) とカスタムウィジェット (Motif XmDrawingArea ウィジェットなど) の両方に使用されています。
以下の 2 つの節で、コンバータルーチンについて説明します。また、Motif XmList ウィジェットクラス用のコンバータの作成例を示します。
typedef int (*xdsXYToNameProc) (
Widget widget,
int x,
int y,
char** name_p,
char** attribute_p )
typedef int (*xdsNameToXyProc) (
Widget widget,
char* name,
char* attribute,
int* x_p,
int* y_p )
以下の例は Sun WorkShop Visual 再現機能のソースに対するのものです。この例はウィジェットのクラス (ここでは Motif XmList ウィジェットクラス) 用のコンバータを登録する方法を示したものです。XmList ウィジェットでのクリックが、そのリスト内の要素の特定インスタンスの選択に変換される様子を示してい ます。これは、Sun WorkShop Visual 再現機能が XmList ウィジェットに対して実際に使用する機能です。この機能の使用例を以下のスクリプトに示します。
in my_shell
push my_list_widget(`this line',1)
このスクリプトが再現されると、ウィジェット内の適切な (x,y) 座標でクリックがシミュレートされます。
この例のソースファイルは、メークファイルとともに $VISUROOT/src/examples/replay/cvtXm ディレクトリに用意されています。 $VISUROOT は、Sun WorkShop Visual のインストールディレクトリです。
サポートファイルは、共有オブジェクトが Sun WorkShop Visual 再現メカニズムと通信するための枠組みを提供します。これらのファイルを変更する必要はありません。 P>
この例では、XmList コンバータを含む motif2.c およびこれらのコンバータを登録するためのコードを組み込んでいる register.c について学習します。
この例では、Sun WorkShop Visual 再現のウィジェットセットを拡張する方法を 3 段階で説明します。
1.
xdsListXyToName()
(x,y) 位置を取得し、一対の名前/属性を返します。
2.
xdsListNameToXy()
一対の名前/属性を取得し、(x,y) 位置を返します。
3.
xdsRegister()
ウィジェットおよび関連するコンバータを Sun WorkShop Visual 再現に登録します。
重要なことは、コンバータコードの構造およびコンバータの登録方法であり、XmLis t コンバータの実装方法ではありません。
この関数は motif2.c にあり、(x,y) 座標を名前/属性対に変換します。ここでは、xdsXyToNameProc インタフェース定義の構造体を説明しています。この関数は Sun WorkShop Visual 再現が記録モードのときに使用されます。
int
xdsListXyToName( widget, x, y, namep, attrp)
Widget widget;
int x, y;
char ** namep;
char ** attrp;
{
extern Boolean XmStringCompare();
extern char * xdsCvtXmStringToString();
extern Boolean xdsCvtSetListError();
extern int xdsCvtListFailure();
extern Boolean xdsCvtGetXmListEntries();
extern int XmListYToPos();
static char name[255];
static char count[20];
int pos;
int len = 0;
int n;
int instance = 1;
XmString * list = (XmString*)0;
XmString item;
/* 要素を取得する */
if (!xdsGetXmListEntries1( widget,&list, &len)) {
return xdsListFailure();
}
/* XmListYToPos() を使用してリスト要素を取得する */
pos = XmListYToPos2( widget, (Position)y);
if (pos < 0 || pos > len) {
xdsCvtSetListError(LIST_OUT_OF_BOUNDS);
return xdsCvtListFailure();
}
item = list[--pos];
for (n = 0; n < pos; n++) {
if (XmStringCompare( item, list[n]) == True)
instance++;
}
/* 記述を作成する */
(void) sprintf ( count, "%d", instance);
(void) strcpy ( name, xdsXmStringToString3 (item));
*namep = name;
*attrp = count;
return 1;
}
この関数も motif2.c にあり、名前/属性対を (x,y) 座標に変換します。ここでは、 xdsNameToXyProc インタフェース定義の構造体を説明しています。この関数は xdsListXyToName() の補足関数です。Sun WorkShop Visual 再現機能の再生モードのときに使用されます。
int
xdsListNameToXy( widget, name, attr, xp, yp)
Widget widget;
char * name;
char * attr;
int * xp;
int * yp;
{
extern char * xdsCvtXmStringToString();
extern Boolean xdsCvtSetListError();
extern int xdsCvtListFailure();
extern int xdsCvtSetListItem();
extern Boolean xdsCvtGetXmListEntries();
Position x, y;
Dimension w, h;
int pos;
int len = 0;
int n;
char * s;
int instance = 1;
XmString * list = (XmString*)0;
XmString item;
if ((instance = atoi(attr)) == 0) {
xdsCvtSetListError(LIST_BAD_INSTANCE);
return xdsCvtListFailure();
}
instance--;
if (!xdsCvtGetXmListEntries( widget, &list, &len)) {
xdsCvtSetListError(LIST_EMPTY_LIST);
return xdsCvtListFailure();
}
for ( n = 0; n < len; n++) {
s = xdsCvtXmStringToString(list[n]);
if (strcmp( name, s) != 0)
continue;
if (instance--)
continue;
break;
}
if (n == len) {
xdsCvtSetListError(LIST_ELEMENT_NOT_FOUND);
return xdsCvtListFailure();
}
(void) xdsCvtSetListItem( widget, n+1);
if (!XmListPosToBounds4 ( widget, n+1, &x, &y, &w, &h)) {
xdsCvtSetListError(LIST_OUT_OF_BOUNDS);
return xdsCvtListFailure();
}
*xp = x + (w/2);
*yp = y + (h/2);
return 1;
}
この関数は、 register.c と呼ばれています。 motif2.c の 2 つのコンバータおよび XmScrollBar、XmScale、XmDrawingArea の各ウィジェット用のコンバータを登録します。
void
RegisterWidgets()
{
extern Boolean xdsRegister();
extern int xdsListNameToXy();
extern int xdsListXyToName();
extern int xdsScrollBarNameToXy();
extern int xdsScrollBarXyToName();
extern int xdsScaleNameToXy();
extern int xdsScaleXyToName();
extern int xdsDaNameToXy();
extern int xdsDaXyToName();
(void) xdsRegister( "XmList", xdsListNameToXy, xdsListXyToName);
(void) xdsRegister( "XmScrollBar", xdsScrollBarNameToXy, xdsScrollBarXyToName);
(void) xdsRegister( "XmScale", xdsScaleNameToXy, xdsScaleXyToName);
(void) xdsRegister( "XmDrawingArea", xdsDaNameToXy, xdsDaXyToName);
}
void RegisterThisListWidget(
Widget w;
{
xdsRegisterContextHandler(w, xdsListNameToXy, xdsListXyToName);
}
この関数は xdsSetup.h に定義されています。ここでは、 xdsRegisterContextHandler インタフェース定義の構造体を説明しています。
Boolean
xdsRegister( classname, name2xy, xy2name)
char * classname;
int_f name2xy;
int_f xy2name;
{
bool_f bf = xdsGetRegisterFunction();
if (!bf)
return False;
return (*bf)( classname, name2xy, xy2name);
}
提供されている Makefile は、共有オブジェクトを構築するよう構成されています。多数のオペレーティングシステムがサポートされ ています。これらのシステムをリストするには、次のように入力します。
make
共有オブジェクトは、メークファイルの OBJECT 行を次のように変更するだけで構築することができます。
OBJECT = cvt <クラス名>
クラス名には、ウィジェットクラスの接頭辞を指定します。この例では、ウィジェ ットクラスは XmList なので、次のように Xm 接頭辞を入力します。
OBJECT=cvtXm
共有オブジェクトを構築するには、 make <システム名> と入力します。たとえば、Solaris マシンの場合は、 make solaris と入力します。これで、 libcvtXm.so という共有オブジェクトが構築されます。
共有オブジェクトが構築されたら、そのオブジェクトを $VISUROOT/lib/xds というディレクトリにコピーまたはリンクします。これで、Sun WorkShop Visual 再現機能が必要に応じてこのオブジェクトを読み込むことができます。
コンバータを登録するためのソースファイルおよびメークファイルは、 $VISUROOT/src/examples/replay/cvtTemplate に用意されています。 $VISUROOT は、Sun WorkShop Visual のインストールディレクトリです。
前述の例は、ウィジェットクラスに関するものです。カスタマイズ可能なウィジェ ット (すなわち、Motif XmDrawingArea などのウィジェットの特定のインスタンス) の場合は、変換ルーチンを登録するための機能が Sun WorkShop Visual とともに提供されています。この機能を使用すると、Sun WorkShop Visual 再現機能がウィジェットのインスタンス (Motif であるかどうかに関わらず) の中で行なったユーザーアクションを記録および再現できるように、Sun WorkShop Visual 再現機能の動作をカスタマイズすることができます。
int_f _xdsRegisterFunction = (int_f)0;
Boolean
xdsRegisterContextHandler( widget, name2xy, xy2name)
Widget widget;
int_f name2xy;
int_f xy2name;
{
if (!_xdsRegisterFunction)
return False;
return (*_xdsRegisterFunction)( widget, name2xy, xy2name, True);
}
Boolean xdsRegisterContextHandler(
Widget widget,
xdsNameToXYProc name2xy,
xdsXYToNameProc xy2name)
Boolean xdsRemoveContextHandler( Widget widget)
このルーチンは、ウィジェットにおけるイベントの独自解釈を登録するためのもの です。以下の例に示すように、ウィジェットをコード内に作成した後は、いつでも xdsRegisterContextHandler を呼び出すことができます。
button1 = XmCreatePushButton ( shell1, "button1", al, ac );
xdsRegisterContextHandler(shell1, func1, func2)
Sun WorkShop Visual 再現機能は、再現時は func1 ルーチンを呼び出し、記録時は func2 ルーチンを呼び出します。
この機能は、ソースファイル ( client.c ) として、またはコンパイル済みライブラリモジュール ( libxdsclient.a ) として使用することができます。ソースファイルの場合はアプリケーションとともにコンパイルし、ライブ ラリモジュールの場合はアプリケーションと再リンクします。
Sun WorkShop Visual 再現機能のコマンドセットの使用目的は、ユーザーアクションを再現したり、アプリケーションのウィジェ ット階層やリソース設定に関するアプリケーションの状態を検査することです。使用できるコマンドセット はこれだけではありません。以下に示すようにこのコマンドセットを拡張して、必要に応じて独自のコマン ドを追加することもできます。
これまでに、Sun WorkShop Visual 再現メカニズムによって暗黙に読み込まれるユーザー定義モジュールの例を学習してきました。また、この ようなモジュールの構成および構築の方法についても学習しています。
import を使用すると、独自のコマンドのモジュールをスクリプトに明示的に読み込むことができます。一度モジュ ールを読み込むと、モジュール内のコマンドは user コマンドを使用して呼び出すことができます。本節では、このようなモジュールを構築する方法について説 明します。この手順は、前節で説明したものと共通点が多くあります。
1 つのコマンドを含むモジュールを構築する方法について説明します。このコマンドは、標準エラーにメッセ ージおよび現在のシェルウィジェットの名前を出力します。独自のコマンドを構成する際に、この例をテン プレートとして使用することができます。
コマンドのソースファイルは、メークファイル (Makefile) とともに
$VISUROOT/src/examples/replay/usertemplate
ディレクトリに用意されています。
$VISUROOT
は、Sun WorkShop Visual のインストールディレクトリです。
サポートファイルは、追加コマンドが Sun WorkShop Visual 再現メカニズムと通信するための枠組みを提供します。変更する必要があるファイルは、 xdsResources.h ファイルだけです。「 .xds 」という接頭辞が付いた残りのファイルは、決して変更しないでください。
モジュールを構築するには、メークファイル中の OBJECT 行を変更します。変更後、次のように入力して構築します。
make <システム名>
次に、 $VISUROOT/lib/xds ディレクトリに、共有オブジェクトをコピーまたはリンクします。
#include <stdio.h>
#include <X11/Xos.h>
#include <X11/Xlib.h>
#include <X11/Intrinsic.h>
void
exampleHalloWorld( shell, message)
Widget shell;
char * message;
{
if (!message)
message = "no message";
(void) fprintf ( stderr, "Widget %s says '%s'\n",XtName(shell), message);
}
この例にあるように、ユーザー定義関数は必ず以下の 2 つの引数をとります。
メッセージは、スクリプト内の user コマンド構文がある行のコマンドの後に続く文字列すべてです。以下のスクリプトの一部は、コマンドにア クセスし、使用する例を示したものです。
import usertemplate
in ApplicationShell
user HalloWorld I'm here
すべてのオブジェクトと Sun WorkShop Visual 再現メカニズムとの間のインタフェースは、標準の Xt リソース処理ルーチンを使用して実現されています。
注 - リソースの構造体については、『 X Toolkit Intrinsics Programming Manual 』(O'Reilly and Associates 刊) 第 4 巻の第 10 章などの文献を参照してください。
以下に示すように、新規コマンドの項目が xdsResources.h のリソース一覧に追加されます。
{
"HalloWorld", XtCCallback, XtRPointer, sizeof
(XtPointer), XtOffsetOf
(data_t,HalloWorld), XtRImmediate,
(XtPointer)exampleHalloWorld
}
リソースへのポインタは、このファイル内のデータ構造体に追加されます。
typedef struct {
int type;
XtPointer setValues;
XtPointer getValues;
XtPointer engineSetValues;
XtPointer engineGetValues;
/*-----------------------*/
XtPointer HalloWorld;
} data_t;
データ構造体のこの行より上の項目は、Sun WorkShop Visual 再現オブジェクトすべてに共通です。
extern void exampleHalloWorld();
これまでに説明したように、モジュールの構築は、メークファイルの OBJECT 行を変更するだけで実行できます。この例では、次のように変更します。
OBJECT=usertemplate
make solaris
最後に、構築した共有オブジェクトを $VISUROOT/lib/xds ディレクトリにコピーまたはリンクします。
cp libusertemplate.so $VISUROOT/lib/xds
自身で作成したアプリケーションを、そのアプリケーションのユーザーが Sun WorkShop Visual 再現機能を使用して録画および再現できるようにするには、次のようにします。
xdsAllowUserAccess()
Sun WorkShop Visual 再現機能の使用方法のヒントについては、「Sun WorkShop Visual 再現、捕獲機能」を参照してください。
4. XmListPosToBounds() - Motif 簡易関数のXmListPosToBounds() はリスト内の特定項目のウィンドウ境界ボックスを返します。このボックスを使用して、当該要素に対する クリックの考えられる (x, y) 座標を計算します。
サン・マイクロシステムズ株式会社 Copyright information. All rights reserved. |