このセクションの内容:
VxWorks RTP プロジェクトのテスト
C++test は、VxWorks リアル タイム プロセス プロジェクトおよびダウンロード可能カーネル モジュール プロジェクトを直接テストすることができます。このセクションでは、VxWorks リアル タイム プロセス プロジェクトの設定方法について説明します。
前提条件
プロジェクトの設定を開始する前に、次の操作が必要です。
- C++test ランタイム ライブラリをビルドします
- リンカー オプションにライブラリを追加します。それには、プロジェクトのプロパティ設定画面を表示し、[Parasoft] > [C++test] > [ビルド設定] を選択します。そして、[リンカー オプション] で C++test ランタイム ライブラリへのパスを追加します。
- マルチスレッド アプリケーションのテストをサポートするようランタイム ライブラリをビルドするには、"
-DCPPTEST_THREADS=1
" を指定する必要があります。
単体テストの例
ここでは具体的に例をあげて Workbench から C++test を使って単体テストを実行する方法を説明します。プロジェクトの作成から単体テスト結果のレビューまで、単体テスト フレームワークのセットアップの全プロセスを説明します。C++test の Examples ディレクトリの Timer ソース コード (<C++test installation directory>/Examples/Timer) を使用します。
プロジェクトを新規作成する
プロジェクトを作成します。次の操作を行います。
- [ファイル] メニューの [New] > [VxWorks Real Time Process Project] をクリックします。
- プロジェクト名として「Timer」と入力します。
- 次の画面で [Flexible] ビルド サポートを選択します。
- ビルド コマンドラインに "-B" フラグを追加すると、オプションのスキャンが容易になります。詳細については 「重要な注意 - すべてのターゲットを強制的にビルドするには」を参照してください。
- ビルド仕様を選択します。この例では SIMPENTIUMgnu_RTP を使用します。
- プロジェクトのセットアップを完了します。
ソース ファイルをプロジェクトに追加する
テスト対象のプロジェクトにソース コードを追加します。ソース ファイルは、リンクされたディレクトリとして追加できます。
- プロジェクト ナビゲーターで Timer プロジェクトのノードを右クリックし、ショートカット メニューの [New] > [Folder] をクリックします。
- フォルダー名として「src」と入力します。
- [Advanced] をクリックします。
- [Link to folder in the file system] を選択します。
- [Browse] ボタンをクリックし、 <C++test Install Dir>/Examples/Timer ディレクトリを指定します。
- [Finish] ボタンをクリックします。
注意
リンクされたディレクトリとしてソース ファイルを追加する必要は必ずしもありません。Workbench で可能な任意の方法で追加できます。
ビルド ターゲットを定義する
プロジェクトのテスト ケースを生成する前に、プロジェクトを適切にセットアップしてビルド可能な状態にしなければなりません。次のように Wind River ビルド ターゲットを定義する必要があります。
- Application Development パースペクティブのプロジェクト ナビゲーターで、ビルド ターゲット ノードを右クリックし、ショートカット メニューの [New Build Target] をクリックします。
- [Build Target] パネルで、設定をデフォルトのままにして [Next] ボタンをクリックします (名前はプロジェクト名 [Timer] と同じであり、ビルド ツールは Linker です)。
- [Content Definition] パネルで、 src を選択して [Add Recursive] ボタンをクリックします。ビルド ターゲット定義に src ディレクトリ全体が追加されます。これはテスト プロセスのソース ベースになります。プロジェクト ナビゲーターの現在の内容が右側に表示されます。
- ビルド設定が終了したら [Finish] ボタンをクリックします。
- [プロジェクト] メニューの [Build Project] をクリックします。Standard Workbench ビルド処理が開始します。
重要な注意 ! C++test 生成ディレクトリをオリジナル ビルド プロセスに入れてはいけない
C++test を使って単体テストを実行するプロジェクトのためのビルドを構成している場合、 メイン プロジェクト ディレクトリの下に C++test 生成テスト コンポーネントが作成される点に注意してください。メイン プロジェクト ディレクトリの下の C++test 生成ディレクトリ ( tests やstubs など) を除外するようにビルド構成を行って、テスト コンポーネントがプロジェクト ビルドに入らないようにする必要があります。そうしないと、C++test がテスト ケースを生成した後にオリジナル アプリケーションのビルドを開始したときに、生成されたテスト ケースをコンパイルしようとしてビルドが高い確率で失敗します。
C++test 生成テスト コンポーネントは、テスト プロセス中に C++test が管理するコンポーネントです。オリジナル アプリケーションの一部としては設計されていません。
Standard ビルドをサポートするプロジェクトの場合、C++test はオリジナルのビルドから C++test 生成テスト コンポーネントを自動的に除外します。特に操作は必要ありません。Flexible ビルドをサポートするプロジェクトの場合は、自動的な除外はサポートされていないため、手動で除外する必要があります。
ビルドから C++test 生成ディレクトリを除外するには、次の操作を行います。
- 除外するディレクトリを選択して右クリックします。
- [Exclude from build target] をクリックします。
テスト ケースを生成する
プロジェクトを VxWorks リアル タイム プロセス (アプリケーション) にビルドできたら、テスト ケースの自動生成を開始できます。次の操作を行います。
- C++test パースペクティブを開きます。
- プロジェクト ナビゲーターで、テスト ケースを生成するリソースのノードを選択します。
- 完全なプロジェクトを選択するか、テスト可能な C/C++ ソース ファイル、ヘッダー ファイル、ディレクトリを選択してください。Flexible ビルド ターゲットの内容を表すノードを含め、他のプロジェクト項目の選択は現在のところサポートしていません。
- 次のいずれかの方法でテスト ケースの生成を開始します。
- [Parasoft] メニューの [テストの実行] をポイントして [ビルトイン] > [Unit Testing] > [Generate Unit Tests] テスト コンフィギュレーションを選択します。
- ツールバーの [実行] ボタンのプルダウン ボタンをクリックし、[ビルトイン] > [Unit Testing] > [Generate Unit Tests] テスト コンフィギュレーションを選択します。
C++test はコンパイル オプションをスキャンしてテスト ケースを生成します。C++test の [テスト進捗] ビューに生成サマリが表示されます。[テスト進捗] ビューを閉じると、新しい tests ディレクトリがプロジェクト ツリーに追加されたことがわかります。自動生成テスト ケースはこの tests ディレクトリの下にあります。
テストをビルドする
生成したテスト ケースは実行モジュール アプリケーションにビルドする必要があります。 このプロセスは C++test とその内部ビルダーによって完全に管理されます。デフォルトで、C++test には Wind River Workbench 環境で動作するように設定済みのテスト コンフィギュレーションが用意されています。[ビルトイン] > [Embedded Systems] > [Wind River Workbench] カテゴリにある次のテスト コンフィギュレーションです。
- Build VxWorks Test Executable - RTP (PassFS) 既存のテスト ケースを収集し、スタブ コンフィギュレーションを解析し、テスト インストゥルメントを準備し、テスト用実行モジュールをビルドし、Wind River の Pass-through File System (PassFS) 通信チャネルを介してテスト結果を送信しようとします ( つまり、テスト用実行モジュールは標準の ANSI C ファイル入出力関数を使ってファイル システムに結果を生成します。) このファイル通信チャネルは、VxWorks シミュレーター (VxSim) でのみ動作します。
- Build VxWorks Test Executable - RTP (Socket) 既存のテスト ケースを収集し、スタブ コンフィギュレーションを解析し、テスト インストゥルメントを準備し、テスト用実行モジュールをビルドして TCP/IP ソケット通信チャネルを介してテスト結果を送信しようとします。 (つまり、テスト用実行モジュールは 2 つのポートを開きます。1 つはテスト データ用のポート、もう 1 つはカバレッジ データ用のポートです。そして、このチャネルを使ってテスト結果を送信しようとします。)
- Build VxWorks Test Executable - RTP (TSFS) これは [Build VxWorks Test Executable - RTP (PassFS)] テスト コンフィギュレーションに似ていますが、Wind River の Target Server File System (TSFS) 通信チャネルを使用する点が異なります。「リアル」ターゲットでも使用されることがあります。
ファイル通信チャネルを使用する
ファイル通信チャネル (PassFS または TSFS のテスト コンフィギュレーション) を選択する場合、結果ファイルが生成されるパスの設定が必要なことがあります。デフォルトでは、C++test は次のパスを使って結果を格納します。
- TSFS の場合:
testLogFile="/tgtsvr/cpptest_results.tlog"
covLogFile="/tgtsvr/cpptest_results.clog" - PassFS の場合:
testLogFile="host:${cpptest:testware_loc}/cpptest_results.tlog" covLogFile="host:${cpptest:testware_loc}/cpptest_results.clog"
これらのパスを変更するには、次の操作を行います。
- 適切なテスト コンフィギュレーションを右クリックし、ショートカット メニューの [複製] をクリックします。
- 複製したテスト コンフィギュレーションを選択し、[実行] > [全般] タブをクリックします。
- [テスト実行フロー] で [カスタム フロー] を選択します。
- この設定を行うには、 Embedded Support ライセンス オプションが必要です。
- [テスト実行フロー] の [編集] ボタンをクリックします。
- [利用可能なビルトイン テスト実行フロー] から [Build test executable for VxWorks (RTP) - File Channel on PassFSs (license required)] または [Build test executable for VxWorks (RTP) - File Channel on TSFS (license required)] を選択して [XML を再現] ボタンをクリックします。
テスト実行フローが [カスタム フロー] ダイアログに表示されます。この時点で、通信チャネル定義を制御するフロー ステップを変更できます。
通常このステップは次のように定義されています。
<TestRunnerGenerationStep testSuiteConfigFile="${cpptest:testware_loc}/testsuites.xml" testrunnerCFile="${cpptest:testware_loc}/cpptest_testrunner.c" testrunnerCppFile="${cpptest:testware_loc}/cpptest_testrunner.cpp" testLogFile="/tgtsvr/cpptest_results.tlog" covLogFile="/tgtsvr/cpptest_results.clog" appendLogs="false" / >
使用しているシステムによって、パス形式または最終的なファイルの場所が異なる場合、 testLogFile 属性と covLogFile 属性の値を変更して、ここで設定を変更できます。ほとんどの場合、TSFS と PassFS のデフォルト値のままで問題ありません。
必要な変更がすべて終わったら、目的のテスト実行フローを定義したユーザー定義テスト コンフィギュレーションを実行することができます。テスト コンフィギュレーションの実行が終了すると、テスト用の実行可能なバイナリ ファイルが作成されます。このバイナリ ファイルをターゲット デバイスまたはシミュレーターで起動すると、テスト コンフィギュレーションの <TestRunnerGenerationStep> タグの定義に従って、結果ファイルが生成されます。
次のステップは、結果を収集して C++test の結果ビューにロードすることです。そのために、[ビルトイン] > [Utilities] > [Load Test Results (Files)] テスト コンフィギュレーションを利用できます。ただし、結果ファイルを指すようこのテスト コンフィギュレーションのパスを変更しなければならない場合があります。一般的に、テストのビルドに使用するテスト コンフィギュレーションの以下のフロー ステップで指定されたパスと、read logs file タグのパスとを確実に同期させる必要があります。
<TestRunnerGenerationStep testSuiteConfigFile="${cpptest:testware_loc}/testsuites.xml" testrunnerCFile="${cpptest:testware_loc}/cpptest_testrunner.c" testrunnerCppFile="${cpptest:testware_loc}/cpptest_testrunner.cpp" testLogFile="cpptest_results.tlog" covLogFile="cpptest_results.clog />
以下は [Load Test Results (Files)] テスト コンフィギュレーションのテスト実行フロー定義の一部です。
<ReadTestLogStep testLogFile="cpptest_results.tlog" timeoutInfoProperty="test_exec_timeouted" /> <ReadDynamicCoverageStep covLogFile="cpptest_results.clog" />
システムがテスト用の実行可能ファイルを自動的に実行できる場合、ビルドだけではなく実行ファイルの実行と結果の収集も行うよう、テスト バイナリをビルドするためのテスト実行フローを拡張することができます。そうすれば、テスト ループ全体を自動化できます。
結果が正常に Workbench にロードされたら、結果を解析し、レポートを生成し、適宜テスト ケースを変更することができます。 詳細については次のセクションを参照してください。
単体テストの詳細については 「テストの作成と実行」を参照してください。
ソケット通信チャネルを使用する
ソケット通信チャネルを選択する場合、テスト結果の送信に使用するホスト IP アドレスとポート番号の変更が必要なことがあります。
- [Build VxWorks Test Executable - RTP (Socket)] テスト コンフィギュレーションを右クリックし、ショートカット メニューの [複製] をクリックします。
- 複製した [ユーザー定義] > [Build Test Executable for VxWorks-RTP-SocketComm] を選択し、[実行] > [全般] タブをクリックします。
- [テスト実行フロー] で [カスタム フロー] を選択します。
- この設定を行うには、 Embedded Support ライセンス オプションが必要です。
- [テスト実行フロー] の [編集] ボタンをクリックします。
- [利用可能なビルトイン テスト実行フロー] から [Build test executable for VxWorks (RTP) - Socket (license required)] を選択して [XML を再現] ボタンをクリックします。
テスト実行フローが [カスタム フロー] ダイアログに表示されます。
この時点で、通信チャネル定義を制御するフロー ステップを変更できます。このステップは通常次のように定義されています。
<TestRunnerWithSocketsGenerationStep
testSuiteConfigFile="${cpptest:testware_loc}/testsuites.xml"
testrunnerCFile="${cpptest:testware_loc}/cpptest_testrunner.c"
testrunnerCppFile="${cpptest:testware_loc}/cpptest_testrunner.cpp"
resultsHost="127.0.0.1"
testLogPort="2567"
covLogPort="2568"
/ >
ネットワーク構成に合わせて、ホスト IP アドレス ( C++test を使用する開発環境が実行中のマシン) およびポート番号を変更します。
必要なすべての変更を加えたら、カスタマイズしたテスト コンフィギュレーションを実行できます。テスト コンフィギュレーションの実行が終了すると、テスト用実行モジュールのバイナリ ファイルが生成されます。テスト用実行モジュールを起動する前に、 [ビルトイン] > [Utilities] > [Load Test Results (Sockets)] テスト コンフィギュレーションを実行します。そしてターゲット デバイスまたはシミュレーターでテスト用実行モジュールを起動すると、テスト結果とカバレッジ データを送信するための 2 つのポートがオープンします。
[ビルトイン] > [Utilities] > [Load Test Results (Sockets)] テスト コンフィギュレーション
ソケット通信チャネルを介して結果を収集するには、テスト用実行モジュールを起動する前に [ビルトイン] > [Utilities] > [Load Test Results (Sockets)] テスト コンフィギュレーションを実行する必要があります。そうしないと、指定ポートでテスト結果の受信を待ち続けてテスト コンフィギュレーションがハングします。テスト結果の収集は、Java で作成された単純なリスニング エージェントによって実行されます。このリスニング エージェントは指定ポートをリッスンして指定ポートからファイルにデータを記述できます。 このリスニング エージェントのソース コードおよびコンパイルされたモジュールは次の場所にあります。
<C++test Install Dir>/engine/runtime/listeners/socket_listener
テスト結果が Workbench に正常にロードされたら、テスト結果の解析、レポートの生成、およびテスト ケースの変更を行うことができます。詳細については次のセクションを参照してください。
単体テストの詳細については 「テストの作成と実行」を参照してください。
テスト実行モジュールを実行し結果を読み込む
ビルドされたテストモジュールを実行するには、[ビルトイン] > [Embedded Systems] > [Wind River] > [Workbench] > [Load and Run VxWorks Test Executable (RTP)] テスト コンフィギュレーションを実行してから、[ビルトイン] > [Utilities] > [Load Test Results (Files)] テスト コンフィギュレーションを実行します。
アプリケーションをビルドし、アプリケーション モードで実行するには、ライブラリ シンボルの抽出を除くすべてのステップが含まれている [ビルトイン] > [Embedded Systems] > [Wind River] > [Workbench] > [Run VxWorks Application with Mem Monitoring - RTP] テスト コンフィギュレーションを実行します。PassFS 用と TSFS 通信用のコンフィギュレーションがあります。
VxWorks DKM プロジェクトのテスト
C++test には、VxWorks ダウンロード可能カーネル モジュール (DKM) のテストに特化した 2 つのテスト コンフィギュレーションが用意されています。
- [ビルトイン] > [Embedded Systems] > [Wind River] > [Workbench] > [Build VxWorks Test Module - DKM (PassFS)]
Wind River の Pass-through File System (PassFS) 通信を使ってテスト モジュールをビルドします。 このテスト コンフィギュレーションは、ctdt.c ファイルの生成を含め、ダウンロード可能カーネル モジュールの形式でテスト バイナリをビルドします。 - [ビルトイン] > [Embedded Systems] > [Wind River] > [Workbench] > [Build VxWorks Test Module - DKM (TSFS)]
Wind River の Target Server File System (TSFS) 通信を使ってテスト モジュールをビルドします。このテスト コンフィギュレーションは、ctdt.c ファイルの生成を含め、ダウンロード可能カーネル モジュールの形式でテスト バイナリをビルドします。
PassFS は、 VxWorks シミュレーター (VxSim) でのみ使用でき、ホストのファイル システムへの直接アクセスを提供します。TSFS はターゲット サーバーの機能を使ってホスト ファイル システムおよび Target Agent <-> Target Server WTX チャネルに通信のためにアクセスします。TSFS はリアル ターゲットでも使用できます。
Workbench に関連するすべてのテスト実行フローには、初期設定が必要なプロパティがあります。たとえば、使用したいツール チェーンや Wind River Shell 実行モジュールなどです。コメントに従って定義済みのオプションから選択することも、ニーズに合わせて値を再定義することもできます。テスト中に、最初の echo ステップによって、プロパティの設定をユーザーにリマインドするコンソール メッセージが表示されます。
注意
Windows ホストで PassFS 通信を使用する場合、結果ログのパスに接頭辞として host を付ける必要があります。TSFS 通信を使用する場合は /tgtsvr/ 接頭辞を付けます。
VxWorks の機能の詳細については Wind River Workbench のドキュメントを参照してください。
DKM プロジェクトは、簡単なテストを実行することも、完全な単体テストを実行することもできます。
簡単なテスト
このテストでは、スタブの自動生成および未解決シンボルの詳細レポートはできませんが、外部シンボル リストの生成が必要ありません。そのため、より少ない労力でテストを開始できます。
次の操作を行います。
- [Parasoft] メニューの [テスト コンフィギュレーション] をクリックします。
- [ビルトイン] > [Embedded Systems] > [Wind River] > [Workbench] > [Build VxWorks Test Module - DKM (PassFS または TSFS)] テスト コンフィギュレーションを複製します。
- 複製したユーザー定義テスト コンフィギュレーションの [実行] > [シンボル] タブをクリックします。
- [ライブラリ シンボル識別モード] を [オフ(すべてのシンボルが利用可能と推測)] に設定します。
- [適用] ボタンをクリックしてから [閉じる] ボタンをクリックします。
完全な単体テスト
完全な単体テストを実行できますが、テスト モジュールの作成時に外部シンボル リストが必要です。外部シンボル リストには、DKM 内部で使用される VxWorks イメージからのすべてのエクスポートあるいは定義されたカーネル スペース シンボルがなければなりません。
外部シンボル リストの作成方法の詳細については、「外部シンボル リストの作成」を参照してください。
この方法でテスト用実行モジュールをビルドするには、デフォルトの [ビルトイン] > [Embedded Systems] > [Wind River] > [Workbench] > [Build VxWorks Test Module - DKM (PassFS または TSFS)] テスト コンフィギュレーションを使用します。
テスト モジュールの実行とテスト結果
ビルドされたテスト モジュールを実行するには、[ビルトイン] > [Embedded Systems] > [Wind River] > [Load and Run VxWorks Test Object] テスト コンフィギュレーションを使用します。Wind River Shell を使ってテスト オブジェクトが起動されます。
テスト結果を読むには、[Utilities] > [Load Test Results (Files)] テスト コンフィギュレーションを使用します。
ヒント
期待されるテスト結果を得るには、テスト実行フローのカスタマイズが必要な場合があります。テスト実行フローの詳細については 「テスト実行フローのカスタマイズ」を参照してください。
アプリケーションをビルドし、アプリケーション モードで実行するには、ライブラリ シンボルの抽出を除くすべてのステップが含まれている [ビルトイン] > [Embedded Systems] > [Wind River] > [Workbench] > [Run VxWorks Application with Mem Monitoring - DKM] テスト コンフィギュレーションを実行します。PassFS 用と TSFS 通信用のコンフィギュレーションがあります。
エントリ ポイント名が main ではない場合、エントリ ポイントに合わせて設定を変更します。テスト コンフィギュレーションを修正し、C++test プロパティ パネルの [Other Settings] > [Advanced] オプションに "edg.pMainFunctionName <entry_name>
" を追加します。
テスト ケースのデバッグ
C++test はこの環境での直接的なテスト ケース デバッグをサポートしていません。
オリジナル/テスト対象プロジェクトに合った適切なデバッグ/起動構成を使ってテスト用実行モジュールをロードし、目的のテスト ケースに手動でブレークポイントを設定してください。