この記事では、TestStandユーザインタフェースアプリケーションを設計および開発するためのベストプラクティスについて説明します。
TestStandはモジュール式アーキテクチャを使用して設計されており、特定の目的を持つ個別コンポーネントを利用しているため、システム全体の開発と保守を簡素化することができます。
ユーザインタフェースはモジュール式TestStandアーキテクチャ内のコンポーネントの1つです
ユーザインタフェースコンポーネントは、開発者とテストオペレータがテストシステムでシーケンスを作成したり、実行したりするためのメカニズムを提供します。モジュール式アーキテクチャでは、UIと基になるTestStandアプリケーションの間に明確な境界が必要です。これには次の利点があります。
TestStandユーザインタフェースはTestStand Engine APIと通信して、テスト実行の状態の取得、シーケンスの作成と編集、設定の構成など、さまざまな機能を実行します。TestStandは、一連のユーザインタフェースコントロールと、独自のTestStandユーザインタフェースをすばやく作成できる個別のUI APIも提供しています。
TestStandユーザインタフェース(UI)コントロールは、アプリケーションがテストシーケンスを表示、実行、およびデバッグするために必要な一般的な機能を実装する一連のActiveXコントロールです。これらのActiveXコントロールは、ユーザインタフェースのタスクを処理するためにユーザインタフェースがTestStand APIと対話するときに必要なソースコードの量を大幅に削減します。プロパティページを使用するか、利用可能なプロパティとメソッドを呼び出して、これらのコントロールを構成できます。LabVIEW、CVI、C#、またはVB.NETでのTestStand UIコントロールの使用方法の詳細については、「TestStand UI Controls」ヘルプトピックを参照してください。
TestStand UIコントロールは、マネージャコントロールと表示コントロールの2組のユーザインタフェースコントロールを提供しています。
マネージャコントロールは、TestStand APIを呼び出して、ファイルのロード、実行の起動、シーケンスと実行情報の取得などのタスクを実行します。マネージャコントロールは、ユーザがログインしたとき、実行がブレークポイントに到達したとき、ユーザが表示しているファイルやシーケンスを変更したときなど、アプリケーションイベントが発生したときにも通知します。マネージャコントロールは実行時は非表示になっています。
表示コントロールは、現在の実行ステータスを表示する実行表示コントロールなどの情報をユーザに表示します。表示コントロールを使用すると、ボタンコントロールを使用してテストを実行するなど、UIを操作することもできます。 表示コントロールがどのように機能するかを定義するには、マネージャコントロールに接続する必要があります。 この接続は、マネージャコントロールの接続方法を使用して実装されます。コントロールを接続すると、表示コントロールの動作を管理する内部ロジックがマネージャコントロールによって自動的に処理されます。 接続するマネージャコントロールと表示コントロールの種類、および表示コントロールの目的の動作に応じて、表示接続、リスト接続、コマンド接続、および情報ソース接続を作成できます。
TestStand UI表示コントロールをマネージャコントロールに接続して、その動作を定義します。
さまざまなプログラミング環境におけるTestStand UIコントロールの使用方法の詳細については、「TestStand User interface Controls」ヘルプトピックを参照してください。 また、UIコントロールの接続デモを使用して、作成可能な接続の動作を確認することもできます。
さらに、プログラミング環境でネイティブに用意されているコントロールをTestStand UIコントロールとともに使用できます。ネイティブコントロールを使用する場合、ユーザインタフェースAPIを使用して、マネージャコントロールと直接通信し、TestStand関連の機能を実装できます。TestStand APIを直接呼び出すアプリケーションの作成の詳細については、ネイティブコントロールを使用したTestStand UIの構築の例を参照してください。
TestStandでは、ユーザインタフェースの構築に役立ついくつかのサンプルとコンポーネントを提供しています。ユーザインタフェースのサンプルは、カスタムユーザインタフェースを開発するための開始点として使用できます。TestStandには、これらのアプリケーションで使用される一般的な機能を実装するユーザインタフェースコンポーネントも同梱されており、お使いのアプリケーションで再利用できます。
TestStandには、LabVIEW、Labwindows™/CVI™、C#、VB.netなどのサポートされているプログラミング言語で、シンプルおよびフル機能を備えたユーザインタフェースアプリケーションのサンプルが付属しています。TestStandは、サポートされている各プログラミング言語でこれらのサンプルのソースコードを提供しています。このソースコードは、カスタムユーザインタフェースを開発するための開始点として使用することも、そのまま使用することもできます。
シンプルなユーザインタフェースは、最小限の情報を表示し、メニューバーは含まれていません。また、これはデプロイされたテストシステムのテストオペレータ用のインタフェースとして用意されています。フル機能のユーザインタフェースは、より多くの情報を表示し、メニューバーを含みます。また、デバッグ機能を備えています。 フル機能のユーザインタフェースには、TestStandシーケンスエディタなど、テストシーケンスを作成および変更できる編集モードもあります。
シンプルなユーザインタフェースのサンプルは、TestStand UIコントロールを使用した開発方法を学び始める場合に最適です。 LabVIEW、LabWindows/CVI、またはC#の実装の場合、ソースコードとその機能の詳細説明については、以下のガイドを参照してください。
テストシステムのユーザインタフェースを開発するにあたっては、アプリケーションを操作するすべてのユーザの目的とニーズを考慮することが重要です。 テストシステムユーザは一般的に、次の役割に分類できます。
テストシステムユーザ向けの適切なユーザインタフェースを計画および設計する際に、フレームワーク開発者の役割を引き受けたとします。 その場合、TestStand UIコントロールを使用して、ユーザの要件に基づいてユーザインタフェースを完全にカスタマイズできます。たとえば、テストオペレータは、テストを開始して結果を確認できればよい場合があります。 ただし、テスト開発者は、シーケンスファイルの作成と編集へのフルアクセスを保持している必要があります。
TestStandに含まれているフル機能のUIサンプルやシーケンスエディタなど、シーケンスファイルの作成と編集を可能にするフル機能のユーザインタフェースをテスト開発者に提供できます。 テストオペレータに対しては、テストを開始するためのボタンと、テスト結果を示すインジケータのみを表示するシンプルなユーザインタフェースを設計して、オペレータがテストを正常に実行できるようにすることができます。 より複雑なUIをオペレータに提供すると、オペレータに追加のトレーニングを行う必要があり、使用可能な機能が原因でエラーが発生しやすくなり、問題となる場合があります。
TestStand UIコントロールを使用してUIを開発することで、フル機能のUIからシンプルなUIにシームレスに移行できます。どちらのUIも、TestStandエンジン、シーケンス、プロセスモデルなどのコンポーネントに基づいて構築されており、これらのコンポーネントは両方のUIで共有されています。
シーケンスエディタなどのフル機能のUIやシンプルなオペレータUIは同じテストコードをシームレスに操作可能
個別のユーザインタフェースを作成するだけでなく、TestStandユーザ管理を使用して、単一のユーザインタフェースアプリケーションで利用できる機能をカスタマイズすることもできます。 このアプローチは、さまざまな役割が同じテスト実行に取り組んでいる場合に適しています。 たとえば、テストの失敗のトラブルシューティングを担当する技術者は、通常はオペレータに表示されない、実行の表示やテストレポートなどの診断データにアクセスする必要があります。 技術者用に別のUIアプリケーションを用意すると、そのアプリケーションから現在の実行情報にアクセスできないため、問題となる場合があります。 これに対処するには、上級ユーザに対して追加の表示のロックを解除する単一のユーザインタフェースを作成できます。 たとえば、TestStandのフル機能のユーザインタフェースは、Ctrl-Shift-Alt-Insertを使用して編集モードに変更して、上級ユーザにシーケンスを変更する機能を提供できます。
フル機能UIサンプルは、オペレータモードでも編集モードでを実行可能です
TestStandユーザマネージャのユーザを定義すると、TestStand UIコントロールは、現在のユーザの権限に基づいて、その状態を自動的に有効または無効にします。Engine.CurrentUserHasPrivilege TestStand APIメソッドを使用して、ユーザ権限に基づいてカスタム動作を定義することもできます。たとえば、ユーザインタフェースの特定の部分を非表示または表示することができます。ユーザと権限の定義の詳細については、「Managing Users」ヘルプトピックを参照してください。
TestStandユーザインタフェースを開発するときは、UIに実装されているものと、テストシステムの他のコンポーネントとの区別を明確にすることが重要です。 このセクションでは、一般的なテストシステムの機能と、それを実装するTestStandアーキテクチャ内の場所について説明します。
多くの場合、テストシステムでは、テストの実行を開始する前にアクションを実行する必要があります。たとえば、テストハードウェアを初期化して、それがキャリブレートされていることを検証したり、ユーザ権限をチェックしてユーザインタフェースを初期化したりする必要がある場合があります。
これらの機能を処理するには、フロントエンドコールバックシーケンスファイルのLoginLogoutシーケンスを使用できます。 このシーケンスは、デフォルトではTestStandの起動時にTestStand UIアプリケーションマネージャコントロールによって実行され、デフォルトでユーザにログインダイアログを表示します。 このシーケンスに機能を追加すると、次のような利点があります。
LoginLogoutシーケンスに加えて、フロントエンドコールバックで追加のシーケンスを定義して、別の機会に呼び出される機能を実装できます。 これらの追加シーケンスについては、Engine.CallFrontEndCallbackEx()メソッドを使用して、必要なときにシーケンスを呼び出すためのコードをユーザインタフェースに追加する必要があります。 この方法は、フロントエンドコールバックがTestStandによって自動的にロードおよびアンロードされることから、シーケンスファイルへの参照を管理する必要がないため便利です。
多くの場合、テストシステムは、テストと連携して機能する個別のツールまたはアプリケーションを利用します。 たとえば、データベース構成ユーティリティや解析アプリケーションを起動する場合があります。 これらの機能をユーザインタフェースアプリケーションのモジュールとして構築するのではなく、スタンドアロンツールを埋め込むことでシステムをモジュール化し、カスタムツールメニュー項目からそれらへのアクセスを提供できます。 ツール(Tools)→カスタマイズ(Customize)メニューを使用して、シーケンスエディタからツールメニューをカスタマイズできます。カスタマイズダイアログでは、新しいツールメニュー項目を追加して動作を構成できます。
ツールメニューが実装されているユーザインタフェースに機能を追加するカスタムツールを作成する
変更は別の構成ファイルに保存されるため、すべてのユーザインタフェースには、作成した同じカスタムエントリが表示されます。 詳細については、「Customize Tools Menu Dialog Box」ヘルプトピックを参照してください。
ユーザインタフェースは、ユーザがシーケンスの実行を開始する方法を提供する必要がありますが、UIがシーケンスファイルに直接統合されていないことが重要です。 ユーザがテストを開始できるようにするには、現在ロードされているシーケンスの実行エントリポイントを呼び出すボタンを作成します。これには、シーケンスを直接実行したり、シングルパスやテストUUTなどのプロセスモデルエントリポイントを使用したりすることが含まれます。 ユーザインタフェースには、シーケンス実行の前後に実行される機能を含めてはなりません。代わりに、プロセスモデルを通じてこの機能を実装します。
プロセスモデルでは、ユーザがプロセスモデル設定を構成できるようにする構成エントリポイントを定義することもできます。すべてのモデル設定が、直接ユーザインタフェースを介してではなく、これらのエントリポイントから構成されていることを確認する必要があります。プロセスモデルに機能をビルドすることにより、TestStandユーザインタフェースアプリケーションおよびシーケンスエディタで機能を利用できるようになります。
プロセスモデルの使用の詳細については、TestStandプロセスモデルをカスタマイズするためのベストプラクティスドキュメントを参照してください。
ユーザインタフェースをテストシーケンスファイルやプロセスモデルなどのテストシステムの他のコンポーネントから切り離すことが重要であるとともに、ユーザインタフェースがこれらのコンポーネントと効果的に通信する必要があります。 このセクションでは、このモジュール性を維持しながら、これらのコンポーネント間の通信に使用できるアプローチについて説明します。
テストの実行中、テストシステムは、実行中のテストや現在のテスト結果など、実行の現在の状態を示すフィードバックをオペレータに提供する必要があります。一般に、実行ビューやレポートビューなどのTestStand UIコントロールを使用して、そうした情報を表示できます。これらのコントロールをマネージャコントロールに接続すると、常に更新されて、エンジンで管理されている現在の実行状態が表示されます。
場合によっては、テストに関するより具体的な情報を表示することが必要になります。 実行シーケンスまたはコードモジュールは、そうした情報を表示するためにユーザインタフェースに渡すか、ユーザインタフェースにアクションを実行するように指示する必要があります。統合せずにこの情報を通信するために、UIメッセージを使用して通信を実装できます。通信手段として代わりにシーケンスファイルプロパティまたはUI変数を使用すると、シーケンスファイルとユーザインタフェースの間に不要な依存関係が作成されます。たとえば、シーケンスでファイルグローバルを更新してから、ユーザインタフェースでグローバルのステータスを確認すると、グローバルとUIが統合されます。 UIメッセージは次の2つの理由で推奨されています。
UIメッセージの使用の詳細については、「Using TestStand User Interface Messages (UI Messages)」を参照してください。
UIメッセージには、メッセージの目的を示すメッセージIDが含まれています。 TestStandでは、いくつかのUIメッセージIDが定義されています。これにより、メッセージがエンジンによって自動的に送信されるか、TestStandユーザインタフェースコントロールによって自動的に処理されるかが定められています。 たとえば、メッセージID UIMsg_EndExecution(値4)は、実行の終了後にエンジンによって送信されます。 マネージャコントロールは、これらのUIメッセージの多くを個別のイベントとして公開します。この場合、UIメッセージイベントハンドラを直接使用するのではなく、ApplicationManager EndExecutionイベントのハンドラを定義できます。
その他のUIメッセージはデフォルトのプロセスモデルによって投稿されます。たとえば、UIMsg_ModelState_Identified(値:32)は、UUTのシリアル番号を識別した後にプロセスモデルによって投稿されます。 さらに、Thread.PostUIMessageEx TestStand APIメソッドを使用して、コードモジュール、テストシーケンス、またはプロセスモデルから定義済みまたはカスタムのUIMessageを投稿できます。
UIメッセージIDまたはイベントコードのリストについては、「UIMessageCodes」ヘルプトピックをご覧ください。
チャートやヒストグラムのデータの更新などのカスタム操作用に独自のUIMessageを定義できます。カスタムUIMessageを定義するときは、UIMsg_UserMessageBaseのイベントコード以降の一意のイベントコードを指定します。カスタムUIMessageを投稿するときは、定義されたイベントコードと表示するデータを渡します。UIメッセージには、postUIMessageExメソッドを呼び出すときに指定する数値、文字列、またはActiveXデータのデータフィールドがあります。ユーザインタフェースでUIメッセージに応答するハンドラを定義すると、このデータはイベントコールバックのパラメータとして公開されます。
ユーザインタフェースによるUIメッセージの処理方法を定義するには、2つのアプリケーションマネージャイベントのいずれかにイベントコールバックを追加して、UIメッセージが処理されたときにユーザ定義コードを実行するようにオペレータインタフェースを構成します。
ユーザインタフェースのイベントハンドラの定義については、TestStandヘルプの「Handling Events」トピックを参照してください。
場合によっては、ユーザインタフェースからテストシーケンスに情報を通信する必要があります。 ただし、シーケンスとUIの間の通信は、シーケンスがデータを変更できる状態になるように、常にシーケンスから始める必要があります。 これを実現するため、シーケンスはカスタムコードを含むUIメッセージを投稿して、通信可能であることを示すことができます。UIMessageを投稿するときに、同期パラメータをTrueに設定して、ユーザインタフェースがメッセージを処理するまで実行を待機するようにします。ユーザインタフェースは、UIMessageを処理するときに、SequenceContextオブジェクトを取得し、プロセスモデルのローカル変数などの特定の変数を書き込みまたは読み取ります。
多くの場合、UIは、ユーザがテスト関連のデータを指定するのに最適な場所ではありません。 たとえば、データがプロセスモデルのタスクに関連している場合、デフォルトのメニューからアクセスできる構成エントリポイントを変更または作成する方が適しています。
UIメッセージのポストして処理する方法を示すサンプル (UIメッセージを使用してユーザインタフェースからデータを収集するなど) は、製品内のHandling UI Messagesサンプルを参照してください。