このセクションでは、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 でビルド構成に合わせて適切に設定する必要があります。
一般的な方法は次の手順のとおりです。
- 用意されている makefile を使うか
、<C++test Install Dir>/engine/runtime/projects
ディレクトリにある構成済みの IDE プロジェクトを使って、ランタイム ライブラリをビルドします。 - 生成された .a ファイルをプロジェクト プロパティの [Parasoft] > [C++test] > [ビルド設定] > [リンカー オプション] に設定します。
絶対パスを使用します。
- 最適な選択肢は、なんらかの固定の場所にライブラリ ファイルを置き、複数のユーザーが変更することなくライブラリ ファイルをポイントできるようにすることです。
- ランタイム ライブラリに対する環境変数の使用もサポートされています。
全般的な情報
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 ソース ファイルがあるディレクトリ
- listeners/ 指定の通信チャネルで単純なユーティリティとして使用できるソケット リスナーとシリアル リスナーがあるディレクトリ
- target/ Makefile によって使用されるターゲット構成があるディレクトリ
- tests/ 1 つのクイック テストがあるディレクトリ
- Makefile ランタイム ライブラリをビルドするための Makefile
- *.vcproj ランタイム ライブラリをビルドするための Microsoft Visual Studio プロジェクト ファイル
ランタイム ディストリビューションの C ソース コードは、次のサブ ディレクトリまたはファイルに分かれています。
- src/common/ 文字列操作などのための共通ユーティリティ関数があるディレクトリ
- src/transport/ 通信チャネルの実装があるディレクトリ
- src/presentation/CppTestMessagePlain.c 結果レポートのためのプレーン テキスト層
- src/ テスト ケースの実行のための機能があるディレクトリ
- src/CppTestCoverage.c カバレッジ レポート処理のためのユーティリティ関数
target ディレクトリには、さまざまなプラットフォーム、アーキテクチャ、コンパイラで利用できる複数のビルド構成があります。ターゲット構成は、ランタイム ソースファイルをコンパイルするために Makefile が使用する変数 (たとえば CC や CFLAGS など) を定義するほか、コンパイル済みソースからランタイム ライブラリを作成するために Makefile が使用する変数 (LIBTOOL や LIBTOOL_FLAGS など) を定義します。「make を使って C++test ランタイム ライブラリをビルドする」を参照してください。
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 ランタイム ディストリビューションには次の通信チャネルの実装があります。
- ファイル通信
- src/transport/CppTestTransportFille.c
- src/transport/CppTestTransportFileSplit.c
- src/transport/CppTestTransportFileBuffered.c
- TCP/IP ソケット
- src/transport/CppTestTransportUnixSocket.c UNIX ソケットに基づいた通信チャネル
- src/transport/CppTestTransportWinSocket.c Windows ソケットに基づいた通信チャネル
- Serial link (rs232)
- src/transport/CppTestTransportRS232Common.c
- src/transport/CppTestTransportRS232Common.h
- src/transport/CppTestTransportRS232Unix.c UNIX シリアル ポート API に基づいた通信チャネル
- src/transport/CppTestTransportRS232Win32.c Windows シリアル ポート API に基づいた通信チャネル
- src/transport/CppTestTransportRS232STM32F103ZE.c STM32F103 MCU UART のための通信チャネル
make コマンドラインに適切なCHANNEL_TYPE パラメーターを追加して、通信チャネルの実装を選択することができます。
- CHANNEL_TYPE=file ファイル通信を選択します (デフォルト)
- CHANNEL_TYPE=file-buffered バッファーされる書き込み操作を伴うファイル通信
- CHANNEL_TYPE=file-split: 設定された最大サイズに従って一連のファイルにデータを分割するファイル通信
- CHANNEL_TYPE=unix-socket UNIX ソケット通信を選択します
- CHANNEL_TYPE=win-socket Windows ソケット通信を選択します
- CHANNEL_TYPE=win-rs232 Windows シリアル通信を選択します
- CHANNEL_TYPE=unix-rs232 UNIX シリアル通信を選択します
- CHANNEL_TYPE=win-stm32f103ze-rs232 STM32F103 MCU uart 通信を選択します
または、make ツールではなく IDE を使用する場合、次の定義の中の 1 つをコンパイラ オプションに追加できます。
- CPPTEST_USE_FILE_COMMUNICATIONS
- CPPTEST_USE_FILE_SPLIT_COMMUNICATIONS
- CPPTEST_USE_FILE_BUFFERED_COMMUNICATION
- CPPTEST_USE_UNIX_SOCKET_COMMUNICATION
- CPPTEST_USE_WIN_SOCKET_COMMUNICATION
- CPPTEST_USE_RS232_WIN_COMMUNICATION
- CPPTEST_USE_RS232_UNIX_COMMUNICATION
- CPPTEST_USE_RS232_STM32F103ZE_COMMUNICATION
- CPPTEST_USE_CUSTOM_COMMUNICATION
make を使って C++test ランタイム ライブラリをビルドする
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/ ディレクトリの下にあります。
- ARM_armcc1_2_ADS1_2.mk
- ARM_armcc3_0_RVDS3_0.mk
- ARM_armcc3_1_RVDS3_1.mk
- ARM_armcc3_1_uV3.mk
- ARM_armcc4_0_RVDS4_0.mk
- ARM_armcc5_0.mk
- ICCARM5_3.mk
- MSMobile.mk
- QNX_2_9.mk
- QNX_3_3.mk
- QNX_4_2.mk
- QNX_4_4.mk
- ST20_os20.mk
- ST40_os21.mk
- TIARM_4.9.mk
- TIARM_5.1.mk
- TIARM_5.1_eabi.mk
- TIARM_5.1_gcc.mk
- TIC2000_4.1.mk
- TIC2000_5.2.mk
- TIC6000_5.1.mk
- TIC6000_6.0.mk
- WR_DKM_dcc5_5_simlinux_VxWorks6_4.mk
- WR_DKM_dcc5_5_simnt_VxWorks6_4.mk
- WR_DKM_dcc5_5_simsparc_VxWorks6_4.mk
- WR_DKM_dcc5_6_simlinux_VxWorks6_6.mk
- WR_DKM_dcc5_6_simnt_VxWorks6_6.mk
- WR_DKM_dcc5_6_simsparc_VxWorks6_6.mk
- WR_DKM_gcc3_4_simlinux_VxWorks6_4.mk
- WR_DKM_gcc3_4_simnt_VxWorks6_4.mk
- WR_DKM_gcc3_4_simsparc_VxWorks6_4.mk
- WR_DKM_gcc4_1_simlinux_VxWorks6_6.mk
- WR_DKM_gcc4_1_simnt_VxWorks6_6.mk
- WR_DKM_gcc4_1_simsparc_VxWorks6_6.mk
- WR_RTP_dcc5_5_simpentium_VxWorks6_4.mk
- WR_RTP_dcc5_5_simsparc_VxWorks6_4.mk
- WR_RTP_dcc5_6_simpentium_VxWorks6_6.mk
- WR_RTP_gcc3_4_simpentium_VxWorks6_4.mk
- WR_RTP_gcc3_4_simsparc_VxWorks6_4.mk
- WR_RTP_gcc4_1_simpentium_VxWorks6_6.mk
- eVC4_0_arm.mk
- eVC4_0_mips.mk
- eVC4_0_sh.mk
- eVC4_0_x86.mk
- gcc-shared.mk
- gcc-static.mk
- msvc-shared.mk
- msvc-static.mk
ターゲット構成は、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 ランタイム ライブラリをコンパイル時に構成できます。ターゲットの制約が標準的な制約ではない場合、ランタイム ソース コードの変更が必要なこともあります。
注意
ランタイム ライブラリのビルドに使用される、<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 種類の実装があります。
- src/transport/CppTestTransportFile.c プレーン ファイルの I/O 書き込み
- src/transport/CppTestTransportFileSplit.c: プレーン ファイルの I/O 書き込み。設定された最大サイズに従って一連のファイルにデータを分割する
- src/transport/CppTestTransportFileBuffered.c バッファーされた書き込み操作
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 種類の実装があります。
- src/transport/CppTestTransportUnixSocket.c UNIX/Linux ベースのシステム用
- src/transport/CppTestTransportWin32Socket.c Windows ベースのシステム用
ソケット リスナー
TCP/IP ソケットを介して発せられるデータは、ソケット リスナーの助けを借りてキャプチャするべきです。ソケット リスナーは C++test に付属する単純なユーティリティ プログラムであり、<C++test install dir>/ engine/runtime/listeners/socket_listener ディレクトリにあります。ソケット リスナーは次のパラメーターを取ります。
名前 | 詳細 |
---|---|
| 通信チャネルの仕様。結果をリッスンするポート番号についての情報とこのポートでキャプチャされたデータを保存するファイルについての情報。 |
| 同期化に使用されるファイルへのパス。ソケット リスナーはこのパスを使って 2 つの同期化ファイルを作成します。
|
| 結果を待機するタイムアウト。この時間を過ぎるとプログラムは停止します。 |
| ヘルプ情報を表示します。 |
RS232 通信チャネル
シリアル通信チャネルの実装
シリアル通信モジュールは、 シリアル通信だけが利用可能なデバイスに対するテスト結果の転送を処理するために設計されています。 シリアル通信の実装は、次の 2 つの部分から構成されます。
- 共通レイヤー -- データのパッケージ、フレームのフォーミュレート、および送信の正しさの検証に関係します。実装は CppTestTransportRS232Common.c および CppTestTransportRS232Common.h ファイルで提供されます。
- ターゲット固有の部分 -- 物理的な COM ポートとのやり取りに関係します。セットアップおよび送信の関数の実装を持ちます。C++test では、Windows ベースのターゲットと UNIX ベースのターゲット用にこのレイヤーの実装の例が用意されています。STM32103ZE Cortex-M3 チップ (Keil uVision3) の単純な Bare-Metal の実装も用意されています。
ロー モードとセーフ モード
次の 2 つの通信モードを利用することができます。
- ロー モード -- データは検証されずにホスト マシンに送られます。このモードは安定した環境に推奨します。
- セーフ モード -- パケットごとにチェックサムが計算されます。チェックサムが不正な場合、送信は停止します。このモードを有効にするには、コンパイル フラグ - DCPPTEST_RS232_SAFE_MODE=1 を追加します。
シリアル リンクを介して送られるデータは、パッケージに分割されます。パッケージは下記のように表現されます。
これはロー モードの単純なフレームの例です。
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
- 次の関数を実装します。
- int localFlushInternalRS(CppTestStreamParameters *par); 内部シリアル ポート バッファーを消去する。CppTestStreamParameters は下記で説明。
- int localRsInitInternalSerial(CppTestStreamParameters *par); 初期シリアル ポート。
- int localRsSendInternalByte(CppTestStreamParameters *par, unsigned char byte, unsigned char *is_send); 1 バイトを送信する。パラメーターは par (下記で説明) および送信するバイトと結果。
- int localRsSendInternalStr(CppTestStreamParameters *par, unsigned char *bytes, int *nBytes); nBytes バイトを送信する。パラメーターは par (下記で説明)、バイト、送信するバイト、および送信された nBytes。
- int localRsRecvInternalByte(CppTestStreamParameters *par, unsigned char *pByte, unsigned char *is_recv); 1 バイトを受け取る。パラメーターは par (下記を参照) および受け取ったバイトの結果。
- int localRsUninitInternalSerial(CppTestStreamParameters *par); Close シリアル ポート。
- void localSetStop(int *stop_bit, int result); ストップ ビット送信パラメーターを設定する。
- void localSetParity(int *parity, char *result); パリティ送信パラメーターを設定する。
- char *localGetErrorText(void); バッファーを返す。エラーがある場合はエラー テキストも返す。
- void localRsSleep(unsigned int msec); Sleep の実装。
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 ディレクトリで、myplatform-rs232.mk という新しいファイルを挿入します。このファイルに次の行を追加します。
"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
- パラメーター CHANNEL_TYPE=myplatform-rs232 を使ってライブラリをビルドします。
- Runtime Library Auto Build ステップを使用する場合、次のいずれかの操作を行います。
- C++test プロジェクトのコンパイラ フラグに
-DCPPTEST_USE_RS232_MYPLATFORM_COMMUNICATION
を追加します。 - Runtime Auto Build ステップのテスト実行フローに次のフラグを追加します。
<BuildRuntimeLibStep additionalFlags="-DCPPTEST_USE_RS232_MYPLATFORM_COMMUNICATION" />
- C++test プロジェクトのコンパイラ フラグに
RS232 リスナー
シリアル リンクを介してターゲットから発せられるデータは、シリアル ポート リスナーの助けを借りてキャプチャするべきです。シリアル ポート リスナーは 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 つあります。
void CppTest_Initialize(void)
この関数は、CppTest_InitializeRuntime 関数の先頭で、C++test ランタイム ライブラリ モジュールの初期化よりも前に呼び出されます。
void CppTest_Finalize(void)
この関数は、CppTest_FinalizeRuntime の最後で、テスト結果の通信チャネルがクローズした後に呼び出されます。
これらの関数は通常、プロジェクトが早期に初期化コードを実行する必要がある場合に使用されます。たとえば、ハードウェア固有の初期化コード (たとえばウォッチドッグ タイマー) や、実行シーケンスにおいて、非常に早期の実行が期待されるタイプの初期化などです。
注意: 単体テストとアプリケーション検証での CppTest_Initialize/Finalize の使用
単体テストの実行時、オリジナル プロジェクト中に存在する初期化コードは、実行から除外されます。なぜなら、オリジナル アプリケーションのエントリ ポイント (通常 main 関数) は、C++test によって自動生成されたテスト ハーネスのエントリ ポイントで置換されるからです。これが、CppTest_Initialize/Finalize 関数によって初期化/終了処理コードをフックする必要がある理由です。
アプリケーション メモリ エラー チェック モードでは、対照的に、C++test 固有の関数の形式でハードウェア初期化コードを提供する必要は通常ありません。なぜなら、アプリケーション監視モードではアプリケーションのエントリ ポイントを C++test が置換しないため、オリジナルの初期化コードがこの目的で呼び出されるべきだからです。ただし、アプリケーション監視モードで C++test 固有の初期化/終了処理を行う必要がある場合は、同様に CppTest_Initialize/Finalize 関数を使用できます。
CppTest_Initialize および CppTest_Finalize 関数の追加
CppTest_Initialize および CppTest_Finalize 関数は、直接プロジェクトに追加できます。また、プロジェクトに属さないソース ファイルに置くこともできます。ソース ファイルは、オリジナル プロジェクトの一部ではないディレクトリで、テスト コンフィギュレーションで指定した場所に一致するディレクトリに配置する必要があります。
- テスト コンフィギュレーションを開きます。
- [実行] > [シンボル] タブをクリックします。
- [次の場所で発見されたファイルのシンボルも使用] フィールドで、ソース ファイルがあるフォルダーを指定します。
- [適用] ボタンをクリックします。
この関数の定義を提供すると、C++test はテストの準備中に関数定義を検出し、テスト実行モジュールの開始の初期段階で関数定義の呼び出しを生成します。
注意: テスト対象ソースと追加のソースに対してスタブ インストゥルメントを有効化する必要があります
CppTest_Initialize と CppTest_Finalize のスケルトン作成
C++test には、CppTest_Initialize および CppTest_Finalize の関数スケルトンを自動的に実装するための専用ウィザードが用意されています。ウィザードを使わずに手動でこれらの関数を追加することもできます。
[ランタイム - カスタム イニシャライズ & ファイナライズ] ウィザードにアクセスするには、次の操作を行います。
- [ファイル] メニューの [新規] > [その他] をクリックします。
- [C++test] > [ランタイム - カスタム イニシャライズ & ファイナライズ] を選択し、[Next] をクリックします。
- ソース ファイルの名前と場所を指定します。ウィザードは、テスト コンフィギュレーション設定の [次の場所で発見されたファイルのシンボルも使用] フィールドで指定した値と同期されるはずです (「CppTest_Initialize および CppTest_Finalize 関数の追加」を参照)。
- ドロップダウン リストからファイル タイプ (C または C++) を選択し、[終了] をクリックします。
設定を適応すると、指定した場所にソース ファイルが生成されます。このソース ファイルには以下の空の定義があります。
- void CppTest_Initialize(void)
- void CppTest_Finalize(void)
カスタムの初期化/終了処理コードを追加してこれらの関数を拡張できます。
ヒント
- ランタイム ライブラリの初期化が早すぎ、アプリケーション検証の問題が発生する場合、ランタイム ライブラリの自動初期化を無効にすることができます。無効にするには、詳細オプションの testrunner.earlyRuntimeInitialization および CppTest_InitializeRuntime() の呼び出しをソース コードの適切な位置で使用します。#ifdef PARASOFT_CPPTEST を使ってこの呼び出しを保護することを推奨します。testrunner.earlyRuntimeInitialization の詳細については 「インストゥルメントの詳細オプション」 を参照してください。
- ランタイム ライブラリを早く終了処理するために、CppTest_FinalizeRuntime() を直接ソース コード中に置くことができます。この関数が呼び出された後、カバレッジ、単体テスト メッセージ、アサーション、実行時違反といったデータは無視されます。
C++test ランタイム ライブラリが使用するシンボル
C++test ランタイム ライブラリは次の外部シンボルを使用します。
- close
- dup
- dup2
- exit
- fclose
- fflush
- fopen
- fprintf
- fputc
- free
- fwrite
- getenv
- malloc
- memcmp
- memcpy
- memset
- mkstemp
- open
- perror
- pthread_exit
- pthread_mutex_destroy
- pthread_mutex_init
- pthread_mutex_lock
- pthread_mutex_unlock
- pthread_self
- read
- siglongjmp
- signal
- sprint
- stdout
- strcmp
- strcpy
- strlen
- strncmp
- strstr
- tolower
- vprintf
- vsprintf
- write
注意
- CPPTEST_USE_ANSI_SETJMP を 1 に設定した場合、次のシンボルがシステム ライブラリから参照されます。
- longjmp
- setjmp
- CPPTEST_USE_ANSI_SETJMP を 0 に設定した場合、次のシンボルが代わりに使用されます。
- siglongjmp
- sigsetjmp
- CPPTEST_TIME_MODE を CPPTEST_TIME_ANSI に設定した場合、次のシンボルがシステム ライブラリから参照されます。
- time
- CPPTEST_TIME_MODE を CPPTEST_TIME_GETTIMEOFDAY に設定した場合、次のシンボルがシステム ライブラリから参照されます。
- gettimeofday
- CPPTEST_TIME_MODE を CPPTEST_TIME_TIMEB に設定した場合、次のシンボルがシステム ライブラリから参照されます。
- ftime
- CPPTEST_TIME_MODE を CPPTEST_TIME_TICKLIB に設定した場合、次のシンボルがシステム ライブラリから参照されます。
- tickGet
- sysClkRateGet
- CPPTEST_USE_FILE_COMMUNICATION を設定した場合、次のシンボルがシステム ライブラリから参照されます。
- fopen
- fclose
- fputc
- fwrite
- fflush
- CPPTEST_USE_UNIX_SOCKET_COMMUNICATION を設定した場合、次のシンボルがシステム ライブラリから参照されます。
- socket
- gethostbyname
- htons
- inet_addr
- connect
- close
- send
- CPPTEST_USE_WIN_SOCKET_COMMUNICATION を設定した場合、次のシンボルがシステム ライブラリから参照されます。
- WSAStartup
- socket
- gethostbyname
- htons
- inet_addr
- connect
- closesocket
- shutdown
- WSACleanup
- send
- CPPTEST_C_STREAMS_REDIRECT_ENABLED または CPPTEST_CPP_STREAMS_REDIRECT_ENABLED を設定した場合、次のシンボルがシステム ライブラリから参照されます。
- dup
- dup2
- _get_osfhandle
- perror
- strstr
- unlink
- write
- open
- close
- GetTempFileName (_WIN32)
- GetTempPath (_WIN32)
- mkstemp (!_WIN32)