前へ 次へ 目次 文書セット ホーム


第 14 章

 

Sun WorkShop Visual 再現機能


はじめに

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 再現機能の コマンド構文」を参照してください。

Java アプリケーションの記録と再生

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 再現機能を使用する前に

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-1 「捕獲/再現」の入力要求ダイアログ

「コマンド」テキストボックスに名前を入力します。アプリケーションの名前また は保存場所が分からない場合は、「コマンド」というラベルが付いたボタンを押します。図 14-2 に示すような、「パス」スクロールリストを含むファイル選択ボックスが表示されます。

 

    図 14-2 「捕獲/再現」のファイル選択ボックス

「パス」というラベルが付いた第 2 のスクロールリストには、 PATH 環境変数で指定されている各ディレクトリが表示されます。 このリストから項目を選択すると、そのディレクトリの内容が「ファイル」リストに表示されます。

ダイアログの「ファイル」リストから項目を選択して「了解」ボタンを押すと、そ の項目は 「捕獲/再現」の入力要求ダイアログの「コマンド」フィールドに追加されます。このダイアログの「引数 」というラベルが付いたテキストボックスに、アプリケーションに対するオプションや引数を入力します。 「了解」ボタンを押すと、アプリケーションが Sun WorkShop Visual 再現を使用して実行されます。

ここでは、以下の 2 つの点に注意してください。

    1. 「Sun WorkShop Visual 再現」ダイアログはアプリケーションの一部であるため、アプリケーションを終了すると画面から消去され ます。

    2. Sun WorkShop Visual 再現機能はアプリケーションの実行内容を監視するだけです。再生モードで動作を再現するだけで、アプリ ケーションの動作には決して影響を与えません。

記録対象

Sun WorkShop Visual 再現機能は、特に移植性と明確な記述を行うことに重点を置いています。 Motif インタフェースを効率的にテスト実行するように設計されています。

Sun WorkShop Visual 再現機能は、アプリケーション内のウィジェット間の移動およびユーザーとウィジェットとの対話を詳細に 渡って記録します。以下の情報の記録および再生を行うことができます。

  • すべてのウィジェットに対するアクション
  • サブダイアログの表示および終了
  • キーボードアクセラレータ、修飾子の使用
  • すべてのキーボード入力 (テキスト、矢印キー、Delete など)
  • どのマウスボタンが押されたかを含むすべてのマウスボタン操作

Sun WorkShop Visual 再現機能は、汎用の X テスト用機構として設計されているわけではありません。したがって、すべてのアプリケーションの動作が Sun WorkShop Visual 再現で記録されるわけではありません。ただし、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 再現」ダイアログを示します。 

 

    図 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 再現」ウィンドウ上のボタンを使用して行います。

 

    図 14-4 「Sun WorkShop Visual 再現」ウィンドウのボタン

ボタンの説明は、以下のとおりです。

 

録画

選択したスクリプトの現在の位置から、アプリケーションに対して行なったユーザ ーアクションを記録します。スクリプトを停止した後でこのボタンを押すと、スクリプトはその位置から上 書きされます。スクリプトの最後でこのボタンを押すと、そのスクリプトに追加されます。

 

挿入

スクリプトが停止した位置に、アプリケーションに対して行なったユーザーアクシ ョンを記録します。スクリプト内のアクションは変更されません。

 

巻き戻し

選択したスクリプトを先頭まで巻き戻します。

    注 - スクリプトを正確に再生するには、録画開始時の状態にアプリケーションをリセッ トしなければならない場合があります。

 

 

停止

スクリプトの再生を停止します。

 

再生

スクリプトの現在の位置からスクリプトが停止されるか末尾に達するまで、選択し たスクリプトを再生します。

 

シングルステップ

スクリプト内の次のコマンドを再生します。

 

停止

記録または再生を一時停止します。このボタンを再度押すと、処理が続行されます 。

有効なボタンだけが選択可能です。無効なボタンはグレー表示されています。

スクリプトを作成する前は、押すことができるボタンは「録画」だけです。このボ タンを押すと「unnamed (名前未定)」のスクリプトが作成されます。スクリプトを作成したら、そのスクリプトの「巻き戻し」、「 再生」、「シングルステップ」を実行することができます。

スクリプトを停止または一時停止すると、「挿入」ボタンが有効になります。挿入 処理については、「スクリプトへの挿入」を参照してください。

スクリプトの作成および命名

「新規スクリプト」ボタンを押すと、空のスクリプトが作成されます。スクリプト の命名または名前変更を行うには、次のようにします。

  1. 「Sun WorkShop Visual 再現」ダイアログで関連するアイコンをクリックします。

  2. 「新規スクリプト」テキストフィールドにスクリプトの名前を入力し、Return キーを押します。

    既存のスクリプトの名前と同じ名前を入力すると、新しく命名されたスクリプトに は番号が付加されて元のスクリプトと区別されます。

    注 - 「Sun WorkShop Visual 再現」ダイアログ内にスクリプトがない場合は、「録画」を押すと自動的に「unnamed (名前未定)」スクリプトが新規に作成されます。

スクリプトの選択およびステータスインジケータ

現在選択しているスクリプトは、「Sun WorkShop Visual 再現」ダイアログ内で強調表示されます。

Sun WorkShop Visual 再現のステータスインジケータは、記録中か再生中かを表し、またスクリプト内での現在位置を示します。 ステータスインジケータが赤い場合は、記録中を示します。それ以外の場合は、再生中です。図 14-5 に、インジケータの表示状態としてあり得るものを示します。

 

    図 14-5 Sun WorkShop Visual 再現インジケータのステータス表示

ボタンパネルで最後に選択したボタンの上には、赤い線が表示されます。

モニター

「モニター」ボタンを押すと、記録中および再生中に行なったアクションのログが 表示されます。図 14-6 に示すように、記録個所または再生箇所の先頭および末尾を示すコメントは、Sun WorkShop Visual 再現機能によって自動的に挿入されます。

 

    図 14-6 Sun WorkShop Visual 再現機能の「モニター」ウィンドウ

追加コマンドの挿入

アプリケーション以外のコマンドおよびコメントも、アクションと同じようにスク リプトに追加することができます。追加するには、手動でスクリプトを編集するか Sun WorkShop Visual 再現インタフェースを使用して編集します。本節では、インタフェースからスクリプトを編集する方法を説 明します。

まず、追加コマンドを追加する位置でスクリプトを停止します。追加コマンドをス クリプトの先頭に追加するには、まずスクリプトを巻き戻します。スクリプト内の別の位置にコマンドを追 加する場合は、シングル ステップ実行してその位置まで移動します。

次に「コマンドを追加」というラベルが付いたボタンを押します。テキスト編集ウ ィンドウが表示され、追加コマンドまたはコメントを入力することができます。図 14-7に、このダイアログを示します。

 

    図 14-7 「コマンドを追加」ダイアログ

「コメントとして入力」トグルを設定すると、ダイアログの内容がコメントとして 処理されます。スクリプトでは、各行の行頭に「#」文字が付加されます。

「実行」ボタンを押すと、記録されているスクリプトとは無関係に「コマンドを追 加」ダイアログ内のコマンドだけが実行されます。コマンドが実行される様子は、「モニター」ウィンドウ を使用して確認します。コマンドが希望どおりに実行されている場合は、「追加」ボタンを押してそれらの コマンドをスクリプトに保存します。

さらにコマンドまたはコメントを追加入力する場合は、その前に「消去」を押して ください。「コマンドを追加」ダイアログの情報が削除されます。スクリプトの内容には影響しません。

再生速度の変更

「Sun WorkShop Visual 再現」ダイアログの「速い/遅い」スライダを使用すると、選択したスクリプトが再生される速度を変更す ることができます。デフォルトでは、スクリプトは最高速度で再生されます。

モード付きアプリケーションダイアログ

作成したアプリケーションでモード付きアプリケーションダイアログを使用してい る場合は、そのダイアログを閉じなければ 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 再現」ダイアログが表示されます。

    3. 「新規スクリプト」ボタンを押します。

    「unnamed (名前未定)」スクリプトが作成されます。

    4. 「新規スクリプト」テキストフィールドにスクリプトの名前を入力し、Return キーを押します。

    入力したとおりに、スクリプトの名前が変更されます。

    5. 「モニター」ボタンを押します。

    ダイアログが表示され、行なったすべてのアクションのログが表示されます。

    6. 図 14-8 に示す「録画」ボタンを押します。

     

    図 14-8 「録画」ボタン

    7. visu_config で以下の操作を行います。

    1. 「選択」テキストフィールドに「 one 」と入力し、Return キーを押します。
      • この名前が「ファミリ」リストに追加されます。

    2. 「選択」フィールドの「 one 」という名前をダブルクリックし、「 two 」と入力して Return キーを押します。
      • これで、「ファミリ」リストの項目は 2 つになります。

    3. 「ファミリ」リストの「 one 」をクリックし、「編集」ボタンを押します。
      • 「ファミリ」ダイアログが表示されます。

    4. 「選択」フィールドに「 WidgetOne 」と入力し、Return キーを押します。
      • この名前が「ウィジェットクラス」リストに追加されます。

    5. 「ウィジェットクラス」リストの「WidgetOne」をダブルクリックします。
      • 「ウィジェット」ダイアログが表示されます。

    6. 「ウィジェット」ダイアログの「閉じる」ボタンを押します。
    7. 「ウィジェットクラス」ダイアログの「閉じる」ボタンを押します。
    8. 「ファミリ」ダイアログの「編集」メニューから「停止リスト」オプションを選択します。
      • 「停止リスト」ダイアログが表示されます。

    9. 「停止リスト」ダイアログの「プルダウンメニュー」および「テキストフィールド 」というラベルが付いたトグルを押します。
    10. 「適用」ボタンを押し、その後で「閉じる」ボタンを押します。
    11. 「ファミリ」ダイアログのファイルメニューから「新規」を選択します。
      • 「変更を保存」警告ダイアログが表示されます。

    12. 「変更を保存」ダイアログの「いいえ」ボタンを押します。

    8. 「停止」ボタンを押します。

    「録画」ボタンおよび「巻き戻し」ボタンが有効になります。それ以外のボタンは すべて無効になります。

    アクションの記録を含むファイルが作成されました。このファイルは、いつでも再 生することができます。ここでは内容を確認するために、すぐに再生してみましょう。

    9. 「巻き戻し」ボタンを押します。

    「録画」、「挿入」、「再生」、「シングルステップ」の各ボタンが有効になりま す。

    10. 「再生」ボタンを押します。

    これまで記録した内容を見ることができます。「WorkShop Visual 再現」ダイアログの「速い/遅い」スライダを使用すると記録内容を再生する速度を変更することができま す。

    11. 「巻き戻し」ボタンを押します。

    12. 「シングルステップ」ボタンを押します。

    このボタンを使用すると、記録スクリプトの各コマンドを 1 ステップずつ実行することができます。このコマンドは、画面に「モニター」ウィンドウがあるとさらに詳 細に内容を確認することができます。各ステップが再生されるたびに、該当するログが「モニター」ウィン ドウに出力されます。

    13. visu_config を終了します。

    変更を保存するかどうかを尋ねるメッセージに対しては、「いいえ」を選択します 。アプリケーションが終了すると、記録内容の再生も終了し、「WorkShop Visual 再現」ダイアログも消去されます。これは、このダイアログが実際は visu_config プログラムの一部であるためです。

      注意 - XDS_KEEPDIR 環境変数を定義していない場合は、一時ディレクトリおよびその保存内容は、Sun WorkShop Visual 再現を終了すると自動的に削除されます。 XDS_KEEPDIR 環境変数を定義すると、一時ディレクトリとその保存内容は /tmp/XDS_SAVE に保存されます。作成した内容を保存したい場合は、名前を持ったディレクトリで作業してください (以下の内容を参照してください)。

スクリプトの内容

前述の例によって以下のスクリプトが作成されました。学習例で実行したステップ ごとに注釈が付いています。このスクリプトで、Sun WorkShop Visual 再現の構文の約 90 % を紹介します。

 

    注 - 作成したファイルは、正確にはこのとおりではない場合があります。多少異なる順 序でアクションを実行した場合や、戻って入力ミスを訂正した場合があるためです。これらはすべて記録さ れています。

スクリプトへの挿入

スクリプトの先頭または途中 (たとえば、シングルステップ実行中) にアクションを挿入することができます。

    注 - 「モニター」ウィンドウを開いていると、スクリプト内での現在の位置が正確にわ かります。

スクリプトにアクションを追加するには、以下の作業を行います。

  • スクリプトの先頭にいる場合は「挿入」ボタンを押す
  • スクリプトの途中にいる場合は「停止」ボタンを押し、次に「挿入」ボタンを押す< /LI>

いずれの場合も、続けてアプリケーションを使用します。

アプリケーションで行うことが、すべて既存のスクリプトの現在の位置に挿入され る点を除けば、「挿入」ボタンを押すことは「録画」ボタンを押すことと同じです。挿入モードではないと きに「録画」ボタンを押すと、スクリプトの内容が上書きされます。

    注 - アクションをスクリプトに挿入する際は、挿入後もそのスクリプトは続けて実行可 能である必要があります。続行できない場合は、再生はその位置で停止してしまいます。

コマンド行からの記録および再生

Sun WorkShop Visual 再現機能は、独立したアプリケーションとして提供されています。記録スクリプトおよび再生スクリプトを 両方ともコマンド行から実行することができます。

Sun WorkShop Visual 再現機能を使用したスクリプトの記録

Sun WorkShop Visual 再現機能 (ユーザーアクションの記録に使用する場合) は、 visu_record という独立したアプリケーションとして提供されます。

ツールに関する基本情報を表示するには、次のように入力します。

visu_record -x

次の行は、 visu_record の使用例です。

visu_record -f MyRecordScript AnApplication

MyRecordScript は、内容を記録したスクリプトが保存されるファイル名です。この引数を指定する必要はありません。指定 しないと、スクリプトは標準出力に書き込まれます。 AnApplication は、記録するアプリケーションの名前です。 -i フラグを指定すると、ツールを対話形式で使用できます。この場合、「Sun WorkShop Visual 再現機能のインタフェース」で示した 「WorkShop Visual 再現」 ダイアログが表示されます。

Sun 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 再現機能の幅広い機能を紹介するために、例として挙げています。

繰り返しデモの作成

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 など) または使い慣れたプログラミング言語を使用して、細分化された各スクリプトを展開することができます。 この方法で、以下のようなスクリプトを構築することができます。

StartApplication()

OpenFile(foo.c)

CloseApplication()

次に、プリプロセッサ、インタプリタ、コンパイラのうちのいずれかがこれらの細 分化スクリプトを完全な 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

テスト失敗時の対処

テストに失敗した場合にとる方法は、次の 3 つがあります。

  • テストは中止するが、アプリケーションはそのままの状態にする
  • テストを中止し、アプリケーションを終了する
  • テストを強制終了し、テスト予定の中の次のテストを実行する

それぞれの処理は、特定の visu_replay コマンド行オプションに対応します。

  • -user-on-error - アプリケーションは終了しない
  • -exit-on-error - アプリケーションを終了する
  • -skip-on-error - 次のテストまでスキップする

失敗に対しては、自分のスクリプト内にその処理を作成することが最善の方法です 。条件文を使用して、失敗時には正しいアクション (メッセージを出力するなど) をとってください。

上記以外で、テスト失敗の特定に役立つのが -v コマンド行オプションです。このオプションを使用すると、スクリプトからのコマンドは実行されたとおり に標準出力に表示されます。問題点を特定したら、スクリプトをさらに小さくして再度テストします。今度 は (任意のデバッガとともに) このスクリプトを使用して問題点を特定します。また、バグが修正されていることを証明するために、一連 の回帰テストにこのオプションを追加することもできます。

テストマクロの使用

繰り返し使用されるアクション (ダイアログを開く、アプリケーションを起動する、テキストフィールドへ入力するなど) を定義するマクロを使用してテストスクリプトをモジュール化する方法については、「テストの方法」で説明しました。この方法によって、スクリプトはより簡単に手動で作成、 修正、検査することができます。

マクロを使用したスクリプト例

マクロを使用してスクリプトをモジュール化する方法を説明するために、例として 以下に Sun WorkShop Visual のテストスクリプトからの抜粋を示します。この短いスクリプトは以下のアクションを行います。

    1. Sun WorkShop Visual の起動

    2. シェルおよびフォームを含むデザインの作成

    3. フォームに対する変数名の指定

    4. ファイル名を指定したデザインの保存

    5. 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 再現機能を使用したデバッグ

アプリケーションが間接アプリケーションの場合は、コマンド行から Sun WorkShop Visual 再現機能を実行することにより、複数のアプリケーション名を指定することができます。

たとえば、次のコマンドでは、 AnApplication で指定したアプリケーションで dbx を実行します。

visu_replay -f MyScript dbx AnApplication

任意のデバッガを使用することができます。Sun WorkShop Visual 再現機能を使用すると、デバッグを開始したい位置にすばやく移動できます。デバッガに入るには、スクリ プトの末尾に移動するか、スクリプトに「ブレークポイント」を入力します。「ブレークポイント」とは、 その後にウィジェット名が続くキーワードです。指定されたウィジェットが活性化されると、アプリケーシ ョンはデバッガに入ります。

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 ウィジェットクラス用のコンバータの作成例を示します。

イベントから名前または属性への変換ルーチン

名前

xdsXyToNameProc

-

イベントから名前/属性の記述への変換に使用される関数のインタフェース定義

形式

typedef int (*xdsXYToNameProc) (
	Widget widget,
	int    x,
	int    y,
	char**  name_p,
	char** attribute_p )

入力内容

widget

ルーチンを使用するウィジェット

x

イベントの x 座標

y

イベントの y 座標

name_p

ウィジェットの一部を識別する文字列への (戻り) ポインタ

attribute_p

名前に追加する文字列 ( center left right など) への (戻り)
ポインタ

用法

ルーチンは失敗すると 0 を、成功すると 1 を返します。 name_p および attribute_p に割り当てられた文字列は、Sun WorkShop Visual 再現機能によっては解放されません。コピーが行われるため、静的記憶域を使用することができます。

ルーチンが失敗すると、エラーが報告されます。

名前または属性からイベントへの変換ルーチン

名前

xdsNameToXYProc

-

名前/属性の記述からイベントへの変換に使用される関数のインタフェース定義

形式

typedef int (*xdsNameToXyProc) (
	Widget widget,
	char*  name,
	char* attribute,
	int*  x_p,
	int*  y_p )

入力内容

widget

ルーチンを使用するウィジェット

name

ウィジェットの一部を識別する文字列

attribute

名前に追加する文字列 ( center left right など)

x_p

x 座標結果への (戻り) ポインタ

y_p

y 座標結果への (戻り) ポインタ

用法

ルーチンは失敗すると 0 を、成功すると 1 を返します。

注意事項

再現したい結果をウィジェット上に直接プログラムすることが非常に簡単な場合も あります。たとえば、リソース値の設定や簡易関数の呼び出しなどによってプログラムする場合がそうです 。ただし、このような場合は一連のイベントを正確に模倣するのは非常に困難です。その際には、このルー チンで処理することができます。

ただし、成功を返して、(x,y) 座標を負の値に設定する必要があります。通常は、ウィジェット内のクリック動作をシミュレートすると、 結果の座標を正数と見なします。

以下の例は Sun WorkShop Visual 再現機能のソースに対するのものです。この例はウィジェットのクラス (ここでは Motif XmList ウィジェットクラス) 用のコンバータを登録する方法を示したものです。XmList ウィジェットでのクリックが、そのリスト内の要素の特定インスタンスの選択に変換される様子を示してい ます。これは、Sun WorkShop Visual 再現機能が XmList ウィジェットに対して実際に使用する機能です。この機能の使用例を以下のスクリプトに示します。

in my_shell
		push my_list_widget(`this line',1)

このスクリプトが再現されると、ウィジェット内の適切な (x,y) 座標でクリックがシミュレートされます。

この例を実習すると、以下の 3 点が可能になります。

  • 他社のウィジェットを統合する
  • 変換機能を使用し、 widget(name,attribute) 表記を理解する
  • XmList ウィジェットクラスの実装方法を理解する

この例のソースファイルは、メークファイルとともに $VISUROOT/src/examples/replay/cvtXm ディレクトリに用意されています。 $VISUROOT は、Sun WorkShop Visual のインストールディレクトリです。

このディレクトリの内容は、以下のとおりです。

ファイル

説明

Makefile

異なるプラットフォームに共有オブジェクトを構築することができる

README

共有オブジェクトの構築方法を説明する

motif*.c

変換ルーチン

register.c

登録ルーチン

xds*

サポートファイル

サポートファイルは、共有オブジェクトが Sun WorkShop Visual 再現メカニズムと通信するための枠組みを提供します。これらのファイルを変更する必要はありません。

この例では、XmList コンバータを含む motif2.c およびこれらのコンバータを登録するためのコードを組み込んでいる register.c について学習します。

この例では、Sun WorkShop Visual 再現のウィジェットセットを拡張する方法を 3 段階で説明します。

    1. イベント (x, y) から名前/属性対への変換: xdsXYToNameProc

    2. 一対の名前/属性からイベント (x, y) への変換: xdsNameToXYProc

    3. コンバータの登録: xdsRegisterContextHandler

関連する 3 つのルーチンは以下のとおりです。

    1. xdsListXyToName()
    (x,y) 位置を取得し、一対の名前/属性を返します。

    2. xdsListNameToXy()
    一対の名前/属性を取得し、(x,y) 位置を返します。

    3. xdsRegister()
    ウィジェットおよび関連するコンバータを Sun WorkShop Visual 再現に登録します。

重要なことは、コンバータコードの構造およびコンバータの登録方法であり、XmLis t コンバータの実装方法ではありません。

xdsListXyToName()

この関数は 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;
}

xdsListNameToXy()

この関数も 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;
}

xdsRegister()

この関数は、 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);
}

この関数がアプリケーションの中で呼び出される必要があります。

    注 - _xdsRegisterFunction 関数のポインタ変数は 0 に設定されています。これは、アプリケーションが Sun WorkShop Visual 再現機能を使用しないで実行される場合は、ルーチンは常にリターンし、アプリケーションでは何も行わな いことを意味します。アプリケーションを Sun WorkShop Visual 再現機能とともに実行する場合は、変数は Register ハンドラを指すよう設定されるので、このルーチンが呼び出されます。

コンバータを登録するルーチンについては、以下で説明します。

コンバータの登録

名前

xdsRegisterContextHandler

-

コンバータの登録に使用する関数のインタフェース定義

形式

Boolean xdsRegisterContextHandler(
	Widget widget,
	xdsNameToXYProc name2xy,
	xdsXYToNameProc xy2name)
Boolean xdsRemoveContextHandler( Widget widget)

入力内容

widget

ルーチンを使用するウィジェット

name2xy

再現用の変換関数へのポインタ

xy2name

記録用の変換関数へのポインタ

機能説明

このルーチンは、ウィジェットにおけるイベントの独自解釈を登録するためのもの です。以下の例に示すように、ウィジェットをコード内に作成した後は、いつでも xdsRegisterContextHandler を呼び出すことができます。

	button1 = XmCreatePushButton ( shell1, "button1", al, ac );
	xdsRegisterContextHandler(shell1, func1, func2)

Sun WorkShop Visual 再現機能は、再現時は func1 ルーチンを呼び出し、記録時は func2 ルーチンを呼び出します。

この機能は、ソースファイル ( client.c ) として、またはコンパイル済みライブラリモジュール ( libxdsclient.a ) として使用することができます。ソースファイルの場合はアプリケーションとともにコンパイルし、ライブ ラリモジュールの場合はアプリケーションと再リンクします。

この機能はアプリケーション自体には影響せず、アプリケーション内に残しても悪 影響はありません。

まとめ

Sun WorkShop Visual 再現ウィジェットセットを拡張するには、以下の作業を行います。

  • (x,y) から名前/属性へのコンバータを作成する
  • 名前/属性から (x,y) へのコンバータを作成する

ウィジェットクラスの場合は、以下の作業を行います。

  • コンバータを登録する
  • 共有オブジェクトを構築し、 $VISUROOT/lib/xds ディレクトリにコピーまたはリンクする

個々のウィジェットには、以下の作業を行います。

  • xdsRegisterContextHandler を呼び出して、ウィジェットを特定の関数に関連付ける
  • client.c を使用してアプリケーションを構築するか、 libxdsclient.a ライブラリとリンクする

提供されている examples ディレクトリの内容を参考にして、コンバータの記述、登録、構築を行なってください。

独自の Sun WorkShop Visual 再現機能コマンドの追加

概要

Sun WorkShop Visual 再現機能のコマンドセットの使用目的は、ユーザーアクションを再現したり、アプリケーションのウィジェ ット階層やリソース設定に関するアプリケーションの状態を検査することです。使用できるコマンドセット はこれだけではありません。以下に示すようにこのコマンドセットを拡張して、必要に応じて独自のコマン ドを追加することもできます。

  • 再現セッションのさまざまな位置で、画面ダンプを出力する場合
  • ウィジェット階層に対して別の種類の一貫性検査を行う場合
    Doug Young の widgetlint ライブラリとのインタフェースをとることなどは、その一例です。
  • 特定のデバッグ対象の問題に対してプローブまたはパッチを挿入する場合
    これは、ストリップされ最適化されたバイナリのように、デバッガの機能を完全に利用することが不可能な 場合に最も役に立ちます。

これまでに、Sun WorkShop Visual 再現メカニズムによって暗黙に読み込まれるユーザー定義モジュールの例を学習してきました。また、この ようなモジュールの構成および構築の方法についても学習しています。

import を使用すると、独自のコマンドのモジュールをスクリプトに明示的に読み込むことができます。一度モジュ ールを読み込むと、モジュール内のコマンドは user コマンドを使用して呼び出すことができます。本節では、このようなモジュールを構築する方法について説 明します。この手順は、前節で説明したものと共通点が多くあります。

1 つのコマンドを含むモジュールを構築する方法について説明します。このコマンドは、標準エラーにメッセ ージおよび現在のシェルウィジェットの名前を出力します。独自のコマンドを構成する際に、この例をテン プレートとして使用することができます。

コマンドのソースファイルは、メークファイル (Makefile) とともに
$VISUROOT/src/examples/replay/usertemplate ディレクトリに用意されています。 $VISUROOT は、Sun WorkShop Visual のインストールディレクトリです。

このディレクトリの内容は、以下のとおりです。

ファイル

説明

Makefile

異なるプラットフォームに追加コマンドモジュールを構築することができる

README

コマンドモジュールの構築方法を説明する

interface.c

本節で説明する追加コマンドのコードを含む

xds*

サポートファイル

サポートファイルは、追加コマンドが Sun WorkShop Visual 再現メカニズムと通信するための枠組みを提供します。変更する必要があるファイルは、 xdsResources.h ファイルだけです。「 .xds 」という接頭辞が付いた残りのファイルは、決して変更しないでください。

モジュールを構築するには、メークファイル中の OBJECT 行を変更します。変更後、次のように入力して構築します。

make <システム名>

次に、 $VISUROOT/lib/xds ディレクトリに、共有オブジェクトをコピーまたはリンクします。

interface.c ファイルの内容は、次のとおりです。

#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 つの引数をとります。

  • shell - 現在のシェルウィジェット (Sun WorkShop Visual 再現によって引き渡されます)
  • message - 文字列

メッセージは、スクリプト内の user コマンド構文がある行のコマンドの後に続く文字列すべてです。以下のスクリプトの一部は、コマンドにア クセスし、使用する例を示したものです。

import usertemplate
	in ApplicationShell
		user HalloWorld I'm here

この場合、メッセージの文字列は「 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
}

上記コードで重要な項目は、次の 3 つです。

  • "HalloWorld" はリソース名である
  • XtOffsetOf(data_t, HalloWorld) はデータ構造体における関連項目からのオフセットである
  • (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 再現コマンドセットに追加するには、以下のようにします。

    1. 関連関数を interface.c ファイルに追加します。

    2. 項目を xdsResources.h のリソース一覧に追加します。

    3. xdsResources.h にデータ構造体への関数ポインタを追加します。

    4. xdsResources.h に関数の外部宣言を追加します。

    5. 必要に応じて、メークファイルの OBJECT 行を変更します。

    6. モジュールを構築します。

    7. 構築したモジュールを $VISUROOT/lib/xds ディレクトリにコピーまたはリンクします。

構築するモジュールの数には制限はありません。また、それらのモジュールはいつ でもスクリプトに読み込むことができます。

開発したアプリケーションの録画と再現の許可

自身で作成したアプリケーションを、そのアプリケーションのユーザーが Sun WorkShop Visual 再現機能を使用して録画および再現できるようにするには、次のようにします。

Sun WorkShop Visual 再現機能の使用方法のヒントについては、「Sun WorkShop Visual 再現、捕獲機能」を参照してください。


1. xdsGetXmListEntries() - リスト内の要素を返します。これは XmList の要素を取り出す簡単なルーチンです。

2. XmListYToPos() - Motif 簡易関数の XmListYToPos (widget,y) が必要な変換をすべて行います。イベントの y 座標を取得し、リスト内の位置を返します。

3. xdsXmStringToString() - XmString を String に変換するルーチンです。

4. XmListPosToBounds() - Motif 簡易関数のXmListPosToBounds() はリスト内の特定項目のウィンドウ境界ボックスを返します。このボックスを使用して、当該要素に対する クリックの考えられる (x, y) 座標を計算します。


前へ 次へ 目次 文書セット ホーム

サン・マイクロシステムズ株式会社
Copyright information. All rights reserved.