このセクションでは、C++test ランタイム ライブラリをビルドして使用する方法について説明します。
ホスト ( C++test がインストールされている環境) 以外でテストを実行するには、クロス コンパイラを使ってランタイム ライブラリをビルドしなければなりません。テストをホストでだけ実行する場合は、C++test にはホスト ベースのテスト用のビルド済みライブラリが用意されているため、ランタイム ライブラリのビルドは不要です。
C++test は、テスト実行モジュールの準備フェーズの一部として自動的にランタイム ライブラリをビルドできます。C++test ランタイム ライブラリのカスタム ビルドを用意したい場合を除いて、C++test ランタイム ライブラリを手動で準備する要はありません。
このセクションの内容:
このセクションでは、キーワードを使用して完全なパスを表します。キーワードの定義は次のとおりです。 <C++test_runtime_root> = <C++test Install Dir>/engine <C++test_runtime_sources> = <C++test Install Dir>/engine/runtime/src <C++test_includes> = <C++test Install Dir>/engine/runtime/include |
C++test ランタイム ライブラリは、C のソース ファイルとヘッダー ファイルの形で C++test に付属しています。ランタイム ライブラリのソース ファイルは次のディレクトリにあります。
<C++test Install Dir>/engine/runtime/
ほとんどの場合、C++test を自動的にランタイム ライブラリをビルドすることができます。必要に応じて、make ユーティリティを使って、またはサポートされるプラットフォームのための定義済み make 構成を使って、ランタイム ライブラリをビルドできます (詳細については 「make を使って C++test ランタイム ライブラリをビルドする」を参照)。C++test には、一般的な IDE に対応した、ランタイム ライブラリのビルドを容易にする特別なプロジェクト ファイルが用意されています。
なお、ランタイム ライブラリはターゲットごとにビルドする必要があるので注意してください。したがって、複数のアーキテクチャについてプロジェクトをビルドする場合、高い確率で アーキテクチャごとに 1 つ、複数の C++test ランタイム ライブラリをビルドする必要があるでしょう。
ランタイム ライブラリ ソースには、すべての公式にサポートされる組込みプラットフォーム対応の構成マクロだけでなく、下位レベルの関数ベースの構成も含まれます。これらのマクロは、IDE でビルド構成に合わせて適切に設定する必要があります。
一般的な方法は次の手順のとおりです。
、<C++test Install Dir>/engine/runtime/projects
ディレクトリにある構成済みの IDE プロジェクトを使って、ランタイム ライブラリをビルドします。 絶対パスを使用します。
C++test のインストゥルメントは、テスト オブジェクトのリンク時に解決しなければならない数多くのシンボルを参照します。これらのシンボルは、C++test ランタイム ライブラリで提供されています。
C++test には、ビルド済みでフル機能の共有ランタイム ライブラリが付属しています。ただし、このランタイム ライブラリはリッチ ホスト プラットフォームをターゲットに作成されたものです。テストが実行される組込みプラットフォームの数の多さ、そしてその機能と制限事項を考えると、 通常、異なる組込み環境でビルドを実行するために、ランタイム ライブラリを適切に調整する必要があります。そのため、ランタイム ライブラリの pure-C ソースも用意されています。
C++test ランタイム ライブラリは、ターゲット プラットフォームで利用できる機能をサポートするように構成することも、利用できない機能をブロックするように構成することも可能です。デフォルトの構成はフル機能であり、場合によっては、( 特に、コンパイル時または実行時にクラッシュする場合には、)面倒な機能をブロックする必要があります。使用するプラットフォームの長所と短所をよく知っている組込み開発者であれば、適切に構成したライブラリをビルドし、そのパスをリンカー コマンドラインにアペンドできます。
ランタイム ライブラリのソースは次のディレクトリにあります。
<C++test Install Dir>/engine/runtime/src
ランタイム ライブラリをビルドするために必要なヘッダー ファイルは次の場所にあります。
<C++test Install Dir>/engine/runtime/include
たとえば、Windows 版 C++test 9.6 であれば、ランタイム ソース コードの場所は通常次のディレクトリです。
C:\Program Files\ParaSoft\C++test9.6\engine\runtime\src
そして対応するインクルード ファイルの場所は次のディレクトリになります。
C:\Program Files\ParaSoft\C++test9.6\engine\runtime\include
<C++test Install Dir> にあるファイルは、絶対に変更しないでください。ソースを別のディレクトリにコピーし、この新しいディレクトリのパスをプロジェクト プロパティの [ランタイム ライブラリ ソース] に追加してください (詳細については 「 プロジェクト レベルまたはファイル レベルでのオプションの設定」 を参照)。 「C++test ランタイム ライブラリのビルド」 の説明にあるように、ランタイム ライブラリの自動ビルド機能はこのディレクトリを使ってビルドを実行します。 |
C++test ランタイム ディストリビューションは、<C++test Install Dir>/engine/runtime/ ディレクトリにある次のサブディレクトリまたはファイルから構成されます。
src/ C ソース ファイルがあるディレクトリ
*.vcproj ランタイム ライブラリをビルドするための Microsoft Visual Studio プロジェクト ファイル
ランタイム ディストリビューションの C ソース コードは、次のサブ ディレクトリまたはファイルに分かれています。
target ディレクトリには、さまざまなプラットフォーム、アーキテクチャ、コンパイラで利用できる複数のビルド構成があります。ターゲット構成は、ランタイム ソースファイルをコンパイルするために Makefile が使用する変数 (たとえば CC や CFLAGS など) を定義するほか、コンパイル済みソースからランタイム ライブラリを作成するために Makefile が使用する変数 (LIBTOOL や LIBTOOL_FLAGS など) を定義します。「make を使って C++test ランタイム ライブラリをビルドする」を参照してください。
C++test では、テスト用実行モジュールの準備フェーズの一部として、テスト用ランタイムを自動的にビルドすることができます。自動でビルドする方法を推奨します。ほとんどの場合、C++test ランタイム ライブラリを手動で用意する必要はありません。
場合によっては、C++test ランタイム ライブラリのカスタム ビルドを用意したいこともあります。 <C++test Install Dir>/engine/runtime ディレクトリの Makefileまたは .vcproj ファイルの1 つを使って C++test ランタイム ライブラリをビルドすることができます。または、新しいプロジェクトを IDE で作成し、必要なランタイム ソースをすべてプロジェクトに追加し、IDE のデバッガーを使ってC++test ランタイム ライブラリをビルドすることもできます。任意に独自の IDE プロジェクトを作成することもできます。
基本的に、ランタイム ライブラリをビルドするには、通信チャネルを選択し、Makefile があるディレクトリで IDE のビルダーまたは make を実行します。また、デフォルトの構成が問題を引き起こす場合、あるいはコンパイラとターゲット プラットフォーム用のデフォルト構成が存在しない場合、コンパイラとプラットフォーム特有の構成を変更しなければならないことがあります (「C++test ランタイム ライブラリの構成」を参照してください)。
C++test ランタイムの自動ビルドには次のテスト実行ステップを使用します。
<BuildRuntimeLibStep additionalFlags="<build options>" />
このテスト実行ステップは、テスト対象プロジェクトの環境 (コンパイラの実行ファイル、ビルド オプション) を使って、C++test ランタイム ライブラリ ソースで発見されたすべてのソース ファイルをコンパイルします。コンパイルされたオブジェクトはテスト用実行モジュールにリンクされます。additionalFlags 属性を使ってビルド オプションを追加することができます。この属性の指定は任意です。
テスト実行フローの一部として C++test が単体テスト ランタイムをビルドする前に、必ず [ビルド設定] > [リンカー] オプションから C++test ランタイム ライブラリを削除してください。 |
手動でランタイム ライブラリをビルドするための最初のステップは、ランタイムが使用する通信チャネルの実装から 1 つを選択することです。C++test ランタイム ディストリビューションには次の通信チャネルの実装があります。
make コマンドラインに適切なCHANNEL_TYPE パラメーターを追加して、通信チャネルの実装を選択することができます。
または、make ツールではなく IDE を使用する場合、次の定義の中の 1 つをコンパイラ オプションに追加できます。
Makefile があるディレクトリで make コマンドを呼び出すと、gcc コンパイラによってランタイム ソースがコンパイルされ、ライブラリ ツールを使って C++test ランタイム ライブラリが作成されます。コンパイラとライブラリ ツールを変更するには、make コマンドラインでターゲット構成を指定する必要があります。
例: make TARGET_CFG=WR_DKM_gcc3_4_simlinux_VxWorks6_4.mk
C++test ランタイム ディストリビューションでは次の構成を利用することができます。これらの構成は <C++test Install Dir>/engine/runtime/target/ ディレクトリの下にあります。
ターゲット構成は、C++test ランタイム ライブラリのビルド時に使用される次の変数の定義を提供します。
名前 | デフォルト | 説明 |
---|---|---|
CC | gcc | C++test ランタイム ソースをコンパイルするために使用されるコンパイラの実行ファイル。 |
CFLAGS | コンパイル時に使用されるフラグ。 | |
CC_OUT_DIR_FLAG | コンパイル成果物を格納するディレクトリと共に使用されるフラグ。 | |
CC_OUT_FLAG | -o | 出力ファイル名と共に使用されるフラグ。$(CC_OUT_FLAG)"<output-file-name>" がコンパイラ コマンドラインに追加されます。 |
OBJ_EXT | o | 出力ファイル名を作成するときに使用される、オブジェクト ファイルの拡張子。 |
LIBTOOL | ar | コンパイルされたソースからライブラリを作成できる実行ファイル。 |
LIBTOOL_FLAGS | -ruv | C++test ランタイム ライブラリを作成するときにライブラリ ツールと共に使用されるフラグ。 |
LIBTOOL_OUT_FLAG | 出力ファイル名と共に使用されるフラグ。 $(LIBTOOL_OUT_FLAG)"<output-file-name>" がライブラリ ツールのコマンドラインに追加されます。 | |
LIB_PREFIX | lib | これらの値は、C++test ランタイム ライブラリの名前を作成するときに使用されます。 $(LIB_PREFIX)$(LIB_NAME).$(LIB_EXT) |
LIB_NAME | cpptestruntime | |
LIB_EXT | a |
LD、LDFLAGS、LD_OUT_FLAG、および OUT_EXT も、利用可能な構成によって定義されます。ただし、C++test ランタイム ライブラリをビルドするために必須ではありません。make ファイルからのテスト ターゲットが呼び出されるときにテスト用実行モジュールを単純にビルドするためにだけ使用されます。
独自のターゲット構成を作成するには、ターゲットを最もよく表現している既存のターゲット構成をコピーし、必要に応じて変更します。独自のターゲット構成を使って C++test ランタイム ライブラリをビルドするには、make コマンドラインに TARGET_DIR パラメーターを追加します。
make TARGET_DIR=<directory with my target configuration> TARGET_CFG=MyTargetConfig.mk
ランタイム ライブラリが作成されるディレクトリを変更することもできます (デフォルトは ./build ディレクトリです)。変更するには、make コマンドラインに OUT_DIR パラメーターを追加します。
例: make OUT_DIR=<output directory for my C++test runtime library> ...
ビルドの実行は、C++test のインストール先ディレクトリで行うことも、C++test ランタイム ソース ファイルをコピーして別の場所で行うこともできます。その場合は、C++test のインクルード ファイルがある場所を必ずパスに設定してください。パスを設定するには、make ファイル中の CPPTEST_INC_DIR 変数の値を絶対パスで設定します。
例: CPPTEST_INC_DIR=/usr/local/C++test/engine/runtime/include
マルチ スレッドをサポートするユーザー定義のランタイム ライブラリを作成するには、コンパイラのコマンドラインに -DCPPTEST_THREADS_ENABLED=1 を追加します。 |
制約事項はターゲット プラットフォームによって異なります。そのため、C++test ランタイム ライブラリは異なる環境に合わせて容易に構成できるように設計されています。マクロ定義を設定して C++test ランタイム ライブラリをコンパイル時に構成できます。ターゲットの制約が標準的な制約ではない場合、ランタイム ソース コードの変更が必要なこともあります。
ランタイム ライブラリのビルドに使用される、<C++test Install Dir>/engine/runtime/include にあるインクルード ファイル は、生成されたテスト ハーネス (C++test によって自動生成されるテスト ソース ファイル) によっても使用されます。インクルード ファイルを変更する場合は注意して作業してください。小さな変更でもホスト ベース テストを「破損」する可能性があります。通常安全な方法は、プリプロセッサ条件命令 (#ifdef...#endif) を使ってターゲット固有の変更を行うことです。 |
利用可能なコンパイラ構成は、<C++test Install Dir>/engine/runtime/include/config
ディレクトリにあります。このディレクトリには cpptest_portinfo.h
ヘッダー ファイルもあり、このヘッダー ファイルは C++test ランタイム ライブラリのビルド時にどのコンパイラ構成を使うかを決定します。コンパイラ構成ヘッダー ファイルは、ターゲット プラットフォームにランタイムを適応させるマクロを定義します。そのほかに、コンパイラ構成ヘッダー ファイルは、ターゲット プラットフォームでサポートできない C++test の機能を無効にするマクロも定義します。無効にできる機能の一覧については、ヘッダー ファイル cpptest_features.h
を参照してください。
ほとんどの場合、構成マクロの値を変更する必要があるときに、構成ファイルを変更したり新規作成したりする必要はありません。ターゲット構成ファイルの CFLAGS 変数に (または、ランタイムのビルドに IDE を使用している場合はコンパイラ オプションに)、マクロの値を必要な値にセットする 適切な -D オプションを追加することができます。
利用可能な一般的なマクロ定義は次の表のとおりです。 注意 ! 指定されるデフォルトは、コンパイラとターゲット環境によって異なります。
マクロ名 | 詳細 |
---|---|
CPPTEST_EXPORT, CPPTEST_IMPORT | Windows プラットフォーム用に DLL をビルドするとき、__declspec(dllexport) および __declspec(dllimport) に展開されます。 これらは、関数/データを DLL との間でインポート/エクスポートするための Microsoft 固有の拡張子です |
CDECL_CALL | Microsoft コンパイラを使ってビルドするときに、__cdecl に展開されます。これは呼び出し規則のための Microsoft 固有の拡張子です。 |
CPPTEST_WCHAR_ENABLED | 1 を設定した場合、ランタイム ライブラリは wchar 型をサポートしてビルドされます。 |
CPPTEST_SETJMP_ENABLED | 1 を設定した場合、テスト ケースの実行中に例外がスローされたときにリカバーのためにシグナル処理ルーチンが使用されます。その場合、C++test はテスト ケース実行の結果として例外を記録し、テスト ケースの実行を続けようとします。 |
CPPTEST_USE_ANSI_SETJMP | 1 を設定した場合、シグナル処理のためにlongjmp および setjmp 関数が使用されます。 |
CPPTEST_USE_UNCAUGHT_EXCEPTION_CHECKING | 1 を設定した場合、キャッチされない例外の処理に uncaught_exception 関数が使用されます。 |
CPPTEST_USE_STD_NS | C++test が std 名前空間を使うべきでない場合、またはコンパイラが名前空間をサポートしていない場合、0 に設定します。 |
CPPTEST_TIME_MODE | このマクロは、時間の測定のためにどの関数を使用するかを制御します。設定できる値の一覧については cpptest_time.h ヘッダー ファイルを参照してください。 |
C++test の機能を有効/無効にできる、利用可能なマクロ定義は次の表のとおりです。
名前 | 詳細 |
---|---|
CPPTEST_C_STREAMS_REDIRECT_ENABLED | 1 に設定すると、c ストリーム (stdin、stdout、 stderr) のリダイレクトが有効になります。無効にするには 0 を設定します。 |
CPPTEST_CPP_STREAMS_REDIRECT_ENABLED | 1 に設定すると、cpp ストリームのリダイレクトが有効になります。無効にするには 0 を設定します。 |
CPPTEST_USE_WSTREAMS | 1 に設定すると、cin、cout、cerr、clog の代わりに、wcin、wcout、wcerr、wclog が使用されます。 |
CPPTEST_EXCEPTIONS_ENABLED | 1 に設定すると、例外処理が有効になります。無効にするには 0 を設定します。 |
CPPTEST_SPECIAL_STD_EXCEPTIONS_HANDLING_ENABLED | 1 に設定すると、ほかの例外とは別に std::exception が処理されます。 |
CPPTEST_DATA_SOURCES_ENABLED | 1 に設定すると、データ ソース機能が有効になります。無効にするには 0 を設定します。 |
CPPTEST_CSV_DATA_SOURCE_ENABLED | 1 に設定すると、CSV データ ソース機能が有効になります。無効にするには 0 を設定します。 |
CPPTEST_USE_SETUP_FOR_C_SUITES | 1 に設定すると、 C 言語のテスト スイートで setUp および tearDown 関数を使用できます。 |
CPPTEST_THREADS_ENABLED | 1 に設定すると、スレッドのサポートが有効になります。無効にするには 0 を設定します。 |
このセクションの内容:
ファイル通信チャネル
ソケット通信チャネル
RS232 通信チャネル
ファイル通信チャネルは、標準のファイル I/O 操作を利用してテスト結果を保存します。テスト結果用とカバレッジ結果用の 2 つのデータ ストリームがあります。次の 3 種類の実装があります。
CppTestTransportFile.c のモードでは、テスト中に生成された各データ パケットは、直ちにファイルに保存されます。実際の物理的な書き込みを行うかどうかはオペレーティング システム次第です。
CppTestTransportFileSplit.c のモードは、CppTestTransportFile.c のモードと同様に、プレーン ファイルの I/O 書き込みを使用します。ただし、CppTestTransportFileSplit.c のモードでは、データ パケットは一連の複数のファイルに保存されます。各ファイルの最大サイズを指定するには、CPPTEST_MAX_ALLOWED_NUMBER_OF_BYTES_PER_FILE マクロを使用して値を設定します。デフォルトのサイズは 2000000000 バイト (2 GB) です。生成されるファイル名には番号が付けられます (例: 'cpptest_results.clog', 'cpptest_results.clog.0001', 'cpptest_results.clog.0002')。生成された結果を C++test にロードする方法については、「ReadDynamicCoverageStep」および「ReadTestLogStep」テスト実行フロー ステップの説明を参照してください。
CppTestTransportFileBuffered.c のモードでは、小さなデータ パケットの書き込み頻度を減らすために、中間メモリ バッファーが利用されます。小さなデータの塊を書き込む方が、結合されたより大きなデータを書き込むよりも コストが高い環境の場合、このモードを使用するべきです。中間メモリ バッファーのサイズは FILE_COMMUNICATION_BUFFER_SIZE 定義を使って決定できます。バッファー サイズが大きければ大きいほど、書き込み操作の頻度が下がります。
ソケット通信チャネルは、TCP/IP ソケットを利用してテスト結果を保存します。2 つのソケットがオープンされます。1 つはテスト結果用、もう 1 つはカバレッジ結果用です。次の 2 種類の実装があります。
TCP/IP ソケットを介して発せられるデータは、ソケット リスナーの助けを借りてキャプチャするべきです。ソケット リスナーは C++test に付属する単純なユーティリティ プログラムであり、<C++test install dir>/ engine/runtime/listeners/socket_listener ディレクトリにあります。ソケット リスナーは次のパラメーターを取ります。
名前 | 詳細 |
---|---|
| 通信チャネルの仕様。結果をリッスンするポート番号についての情報とこのポートでキャプチャされたデータを保存するファイルについての情報。 |
| 同期化に使用されるファイルへのパス。ソケット リスナーはこのパスを使って 2 つの同期化ファイルを作成します。
|
| 結果を待機するタイムアウト。この時間を過ぎるとプログラムは停止します。 |
| ヘルプ情報を表示します。 |
シリアル通信モジュールは、 シリアル通信だけが利用可能なデバイスに対するテスト結果の転送を処理するために設計されています。 シリアル通信の実装は、次の 2 つの部分から構成されます。
次の 2 つの通信モードを利用することができます。
シリアル リンクを介して送られるデータは、パッケージに分割されます。パッケージは下記のように表現されます。
これはロー モードの単純なフレームの例です。
0 | 1 | 2 | | data size + 3 | data size+4
STX (1 byte) |CHANNEL ID|Count|Data (data size) | 0 | ETX (1 byte).
-------------------------------- MAX 255 ---------------------------------------
これはセーフ モードの単純なフレームの例です。
0 | 1 | 2 | | data size + 3 | data size+4
STX (1 byte) |CHANNEL ID|Count|Data (data size) | Checksum (1 byte) | ETX (1 byte).
-------------------------------- MAX 255 -----------------------------------------------
使用されているシンボルの意味は次の表のとおりです。
シンボル | 説明 |
---|---|
STX (0x02) | テキストの開始 (Start of text) |
ETX (0x03) | テキストの最後 (End of text ) |
EOT (0x04) | 送信の最後 (End of transmission) |
ENQ (0x05) | 問い合わせ (Enquiry) |
ACK (0x06) | 肯定回答 (Affirmative acknowledgement) |
NAK (0x15) | 否定回答 (Negative acknowledgment) |
セーフ モードのチェックサムは、排他的 OR で計算されます。ロー モードの場合、チェックサムは計算されず、すべてのフレームにゼロ値が送られます。
データの最大量のデフォルトは、250 バイトに設定されます。この値は MAX_PACKET_SIZE マクロを使って変更できます。
セーフ モードでは、可用性について問い合わせるためにクライアントが ENQ を送ります。ACK を受け取るまでクライアントは送信を開始できません。ACK を受け取ると、クライアントは別のフレームを送ります。各フレームは ACK によってホスト マシンに確認されます。最後に、クライアントは EOT を送ります。それに応答して、ホストは ACK を送り、送信を完了します。チェックサムが計算されるのはセーフ モードだけです。通常のモードでは値は常に 0 です。
ロー モードでは、送信は一方向だけです。ターゲット プラットフォームは、どのデータ送信段階でも ACK を待たずにデータを発信します。
シリアル通信の別の実装を追加するには、次の操作が必要です。
<C++test Install dir>/engine/runtime/src/transport ディレクトリに、カスタム シリアル通信の実装を記述した新規ファイルを追加します。次のテンプレートに従ってください。
#define CPPTEST_RUNTIME_IMPLEMENTATION #include "cpptest_portinfo.h" #ifdef CPPTEST_USE_RS232_MYPLATFORM_COMMUNICATION #include "CppTestTransportRS232Common.h" int localRsInitInternalSerial(CppTestStreamParameters *par) { return RS_OK; } int localRsUninitInternalSerial(CppTestStreamParameters *par) { return RS_OK; } int localRsSendInternalByte(CppTestStreamParameters *par, unsigned char byte, unsigned char *is_send) { return RS_OK; } int localRsSendInternalStr(CppTestStreamParameters *par, unsigned char *bytes, int *nBytes) { return RS_OK; } int localRsRecvInternalByte(CppTestStreamParameters *par, unsigned char *pByte, unsigned char *is_recv) { return RS_OK; } int localFlushInternalRS(CppTestStreamParameters *par) { return RS_OK; } void localSetStop(int *stop_bit, int result) { } void localSetParity(int *parity, char *result) { } void localRsSleep(unsigned int msec) { } #endif |
Struct CppTestStreamParameters: typedef struct { char serial_device[16]; Device name (COM1, /dev/ttyS0, cua0 etc). Depend on platform int baud_rate; Device speed int byte_size; Byte size int parity; Parity int stop_bit; Stop bit int timeout; Timeout between two operations. long max_timeout; If exceeded tranmision broken. } CppTestStreamParameters; |
ランタイム ライブラリを使って新しい実装を統合するには、次の操作を行います。
"CHANNEL_CONFIG_MACRO=-DCPPTEST_USE_RS232_MYPLATFORM_COMMUNICATION"
include/cpptest_portinfo.h
ファイルで、次の行を置き換えます。 置き換える箇所:
#if !defined(CPPTEST_USE_FILE_COMMUNICATION) && \ !defined(CPPTEST_USE_FILE_BUFFERED_COMMUNICATION) && \ ... !defined(CPPTEST_USE_RS232_STM32F103ZE_COMMUNICATION) && \ ... !defined(USE_CUSTOM_COMMUNICATION_CHANNEL) # define CPPTEST_USE_FILE_COMMUNICATION #endif |
置換後の内容:
#if !defined(CPPTEST_USE_FILE_COMMUNICATION) && \ !defined(CPPTEST_USE_FILE_BUFFERED_COMMUNICATION) && \ ... !defined(CPPTEST_USE_RS232_STM32F103ZE_COMMUNICATION) && \ !defined(CPPTEST_USE_RS232_MYPLATFORM_COMMUNICATION) && \ ... !defined(USE_CUSTOM_COMMUNICATION_CHANNEL) # define CPPTEST_USE_FILE_COMMUNICATION #endif |
-DCPPTEST_USE_RS232_MYPLATFORM_COMMUNICATION
を追加します。 <BuildRuntimeLibStep additionalFlags="-DCPPTEST_USE_RS232_MYPLATFORM_COMMUNICATION" />
シリアル リンクを介してターゲットから発せられるデータは、シリアル ポート リスナーの助けを借りてキャプチャするべきです。シリアル ポート リスナーは C++test に付属する単純なユーティリティ プログラムであり、<C++test install dir>/engine/runtime/listeners/rs232_listener ディレクトリにあります。シリアル ポート リスナーは次のパラメーターを取ります。
パラメーター | 説明 |
---|---|
-d (--device) COM,SPEED,PARITY,STOP,BYTE_SIZE. | 使用するデバイス。 |
-sf (--syncfile) <sync file> | 同期化するファイル名。 |
-cn (--channel) number<mode>@<file path> | 通信チャネル。C++test はテスト ログとカバレッジ ログの 2 つのチャネルを使用します。バイナリ モードは "b"、テキスト モードは "t" です。デフォルトはテキスト モードです。 |
-to (--timeout) <timeout in second> | 結果を待機するタイムアウト時間。この時間を過ぎると、プログラムは停止します。 |
-fi <file_name> | ファイル モード。バイナリ ファイルから結果を読み込みます。すべての RS232 設定が無視されます。 |
-rm (--rawmode) | ロー モード (ACK とチェックサムなし)。転送が非セーフ モードで使用された場合、このオプションは必須です。 |
-v (--verbose) | 冗長モード。 |
リスナーが送信のチェックサムの計算および ACK の送信を行うかどうかは、実行モード (セーフまたはロー) によります。
テストまたはアプリケーションの実行中にランタイム ライブラリに渡されるすべてのデータは、ランタイム ライブラリが正しく初期化される場合にだけ、処理され、解釈され、 通信ストリームに渡されます。ランタイム ライブラリが初期化されない場合または終了処理された場合、カバレッジ、単体テスト メッセージ、アサーション、実行時違反といったデータは無視されます。
ランタイム ライブラリは CppTest_InitializeRuntime() 関数の 1 回目の呼び出しの最中に初期化されます。この関数はランタイム ライブラリ モジュールを初期化し、メッセージとカバレッジ データのための通信チャネルをオープンします。デフォルトでは、CppTest_InitializeRuntime() 関数はできるだけ早く呼び出されます。C++ コードがあるプロジェクトでは、グローバル オブジェクトのコンストラクターが呼び出される前に呼び出されます。C のプロジェクトでは、main() 関数の先頭で呼び出されます。ランタイム ライブラリは CppTest_FinalizeRuntime() 関数の 1 回目の呼び出しの最中に最終化されます。この関数は、ランタイム ライブラリ モジュールを終了処理し、通信チャネルをクローズします。この関数は、グローバル オブジェクトのデストラクターが呼び出された後に自動的に呼び出されます。C プロジェクトでは、main() 関数を抜ける前に呼び出されます。
さらに、テスト ハーネスの実行で初期化と終了処理のために実装できる特別な関数が 2 つあります。
この関数は、CppTest_InitializeRuntime 関数の先頭で、C++test ランタイム ライブラリ モジュールの初期化よりも前に呼び出されます。
この関数は、CppTest_FinalizeRuntime の最後で、テスト結果の通信チャネルがクローズした後に呼び出されます。
これらの関数は通常、プロジェクトが早期に初期化コードを実行する必要がある場合に使用されます。たとえば、ハードウェア固有の初期化コード (たとえばウォッチドッグ タイマー) や、実行シーケンスにおいて、非常に早期の実行が期待されるタイプの初期化などです。
単体テストの実行時、オリジナル プロジェクト中に存在する初期化コードは、実行から除外されます。なぜなら、オリジナル アプリケーションのエントリ ポイント (通常 main 関数) は、C++test によって自動生成されたテスト ハーネスのエントリ ポイントで置換されるからです。これが、CppTest_Initialize/Finalize 関数によって初期化/終了処理コードをフックする必要がある理由です。 アプリケーション メモリ エラー チェック モードでは、対照的に、C++test 固有の関数の形式でハードウェア初期化コードを提供する必要は通常ありません。なぜなら、アプリケーション監視モードではアプリケーションのエントリ ポイントを C++test が置換しないため、オリジナルの初期化コードがこの目的で呼び出されるべきだからです。ただし、アプリケーション監視モードで C++test 固有の初期化/終了処理を行う必要がある場合は、同様に CppTest_Initialize/Finalize 関数を使用できます。 |
CppTest_Initialize および CppTest_Finalize 関数は、直接プロジェクトに追加できます。また、プロジェクトに属さないソース ファイルに置くこともできます。ソース ファイルは、オリジナル プロジェクトの一部ではないディレクトリで、テスト コンフィギュレーションで指定した場所に一致するディレクトリに配置する必要があります。
この関数の定義を提供すると、C++test はテストの準備中に関数定義を検出し、テスト実行モジュールの開始の初期段階で関数定義の呼び出しを生成します。
C++test には、CppTest_Initialize および CppTest_Finalize の関数スケルトンを自動的に実装するための専用ウィザードが用意されています。ウィザードを使わずに手動でこれらの関数を追加することもできます。
[ランタイム - カスタム イニシャライズ & ファイナライズ] ウィザードにアクセスするには、次の操作を行います。
設定を適応すると、指定した場所にソース ファイルが生成されます。このソース ファイルには以下の空の定義があります。
カスタムの初期化/終了処理コードを追加してこれらの関数を拡張できます。
C++test ランタイム ライブラリは次の外部シンボルを使用します。