このセクションの内容
C/C++test のマルチメトリクス カバレッジ解析機能は、スタンドアロンアプリケーションやライブラリを C/C++test の外で実行した際のコード カバレッジをモニターできます。
C/C++testには、以下のコンポーネントからなるスタンドアロンのカバレッジ パッケージが付属しています。
[INSTALL_DIR]/cpptestcc
- ビルド プロセスに統合し、カバレッジデータを収集できるようアプリケーションをインストゥルメントするカバレッジツールです。[INSTALL_DIR]/engine/coverage/runtime
- インストゥルメントされたアプリケーションに統合する必要があるカバレッジランタイム ライブラリです。cpptestcc
によるカバレッジの収集は、以下の 3 つのフェーズで行われます。
cpptestcc
ツールをビルドに統合し、アプリケーションをインストゥルメントする。cpptestcc
のクイックスタートcpptestcc
を実行できるよう、PATH
システム変数に [INSTALL_DIR]
へのパスを追加します。--
を区切り文字としたコンパイラコマンドの接頭辞としてcpptestcc
実行モジュールを含めます。 例:元のコンパイル コマンド ライン
cc -I app/includes -D defines -c source.cpp |
変更後のコンパイル コマンド ライン
cpptestcc -compiler gcc_7 -line-coverage -- cc -I app/includes -D defines -c source.cpp |
cpptestcc ツールを利用するには、少なくとも以下のパラメーターがコマンドラインに設定されている必要があります。- コンパイラ識別子 - カバレッジメトリクス (例: その他のオプションについては、「Command Line Reference for cpptestcc」を参照してください。 |
元のコンパイル コマンド ライン
lxx -L app/lib app/source.o somelib.lib -o app.exe |
変更後のコンパイル コマンド ライン
lxx -L app/lib app/source.o somelib.lib [INSTALL_DIR]/engine/coverage/runtime/lib/cpptest.lib -o app.exe |
カバレッジ ランタイムのライブラリが共有 (動的ロード) ライブラリとしてリンクされる場合、インストゥルメントされたアプリケーションの開始時にカバレッジ ツールのライブラリを確実にロードできるようにする必要があります。それには、通常、 |
C/C++test には、Window および Linux のネイティブ アプリケーション用にビルド済みのカバレッジ ランタイム ライブラリが付属しています。クロスプラットフォームおよび組み込みテストの場合は、[INSTALL_DIR]/engine/coverage/runtime のソースからランタイム ライブラリをビルドする必要があります。詳細は「カバレッジ ランタイム ライブラリ」を参照してください。 |
cpptestcc
は .cpptest/cpptestcc
フォルダーを作成します。ここには、重要なカバレッジ関連データ (「カバレッジ マップ」) が保存されます。デフォルトでは、フォルダーは現在のコンパイルの作業ディレクトリに作成されます。-workspace <path>
オプションを使用してデフォルトの場所を変更できます。詳細は「Command Line Reference for cpptestcc」を参照してください。 cpptest_results.clog
ファイルにカバレッジ データ (「カバレッジ ログ」) が保存されます。Load Application Coverage テスト コンフィギュレーションは、.cpptest/cpptestcc
フォルダーと cpptest_results.clog
ファイルの両方がデフォルトの場所にあると仮定します。場所をカスタマイズするには、テスト コンフィギュレーションの実行の詳細オプション ([実行] > [全般] > [実行の詳細]) で以下のように設定します。
- Coverage map files root location - デフォルト: ${project_loc}/.cpptest/cpptestcc
- Coverage log files - デフォルト: ${project_loc}/*.clog
デフォルトでは、Load Application Coverage テスト コンフィギュレーションは、すべてのサポート対象カバレッジ メトリクスの情報をロードしようとします。サポート対象カバレッジ メトリクスのリストをカスタマイズするには、 [実行] > [全般] > [実行の詳細] > [インストゥルメント モード] > [インストゥルメント機能]> [C/C++ コード カバレッジ メトリクス] に移動し、レポートしたいメトリクスを選択します。
コンパイル コマンドラインで
cpptestcc
ツールに対して有効に指定したメトリクスと一貫性を保つよう推奨します。
cpptestcc
コマンド ライン リファレンス 次のコマンドを実行すると、利用可能なオプションがコンソールに表示されます:
cpptestcc -help
以下のオプションがあります。
-compiler <name|path>コード解析およびインストゥルメンテーションに使用するコンパイラ構成の名前を指定します。「コンパイラ」でサポート対象コンパイラの一覧を参照するか、 例:
設定ファイルの書式 (-psrc を参照): -list-compilersサポート対象のすべてのコンパイラ コンフィギュレーション名を出力します。 設定ファイルの書式 (-psrc を参照): -include <file|pattern> and -exclude <file|pattern>指定されたパターンに一致するすべてのファイルをインストゥルメントのスコープに含めたり、スコープから除外します。 最終的なフィルタリングは、すべての include/exclude を指定された順序で適用した結果によって決まります。 次のワイルドカードがサポートされています。
シェルが
設定ファイルの書式 (-psrc を参照): 例 1:サンプル プロジェクト レイアウト:
プロジェクトのレイアウトが上記のとおりである場合、下記のコマンドは
例 2:サンプル プロジェクト レイアウト:
プロジェクトのレイアウトが上記のとおりである場合、下記のコマンドはヘッダー ファイルだけをインストゥルメントします (ソース ファイルはインストゥルメントされません)。
-ignore <pattern>処理時に無視されるソース ファイルを指定します。指定されたパターンに一致するファイルは、コンパイルはされますが、パースもインストゥルメントもされません。
次のワイルドカードがサポートされています。
シェルが
設定ファイルの書式 (-psrc を参照): 例:
-line-coverage行カバレッジ メトリクスの収集を有効にします。 ランタイム カバレッジの結果は、コード実行と同時に結果ログに書き込まれます。これによってテスト対象コードの実行時間にオーバーヘッドが加わりますが、アプリケーションがクラッシュした場合でもカバレッジ データが収集されることを保証できます。 設定ファイルの書式 (-psrc を参照): -optimized-line-coverage最適化された行カバレッジの収集を有効にします。 ランタイム カバレッジの結果はメモリに格納され、アプリケーションの終了後またはユーザーが要求したときに結果ログに書き込まれます。これによってパフォーマンスが向上しますが、アプリケーションがクラッシュした場合は結果が失われます。 設定ファイルの書式 (-psrc を参照): -function-coverage関数カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -optimized-function-coverage最適化された関数カバレッジの収集を有効にします。設定ファイルの書式 (-psrc を参照):
-statement-coverageステートメント カバレッジの収集を有効にします。設定ファイルの書式 (-psrc を参照):
-optimized-statement-coverageステートメント カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -block-coverageブロック カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -optimized-block-coverage最適化されたブロック カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -path-coverageパス カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -decision-coverage判断文 (Decision) カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -optimized-decision-coverage最適化された判断文 (Decision) カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -simple-condition-coverage単純条件カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -optimized-simple-condition-coverage最適化された単純条件カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -mcdc-coverageMC/DC カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -call-coverageコール カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -optimized-call-coverage最適化されたコール カバレッジの収集を有効にします。 設定ファイルの書式 (-psrc を参照): -coverage-early-initアプリケーションのエントリ ポイント先頭でカバレッジ モジュールの初期化を有効にします。 設定ファイルの書式 (-psrc を参照): -coverage-auto-finalizationこのオプションがオンの場合、アプリケーション終了時に自動的にカバレッジの収集を終了します。このオプションはデフォルトでオンです。 設定ファイルの書式 (-psrc を参照): -optimized-coverage-corruption-detection最適化されたカバレッジで破損検出アルゴリズムを有効にします。 設定ファイルの書式 (-psrc を参照): -template-coverageテンプレート クラスおよび関数のカバレッジ収集を有効にします。 設定ファイルの書式 (-psrc を参照): -workspace <path>コード解析およびインストゥルメント時にコードの構造に関する情報が保存されるカスタム ディレクトリを指定します。 デフォルトでは、情報は現在のコンパイルの作業ディレクトリに保存されます。コンパイルで複数の作業ディレクトリを使用する場合、すべてのカバレッジ データが同じ場所に保存されるよう、カスタム ディレクトリを指定することを推奨します。 設定ファイルの書式 (-psrc を参照):
|
カバレッジ ランタイム ライブラリは、アプリケーション実行時にカバレッジ情報を出力するためにソース コード インストゥルメンテーションによって使用されるヘルパー関数およびサービスのコレクションです。インストゥルメントされたアプリケーションは、ライブラリなしではリンクできません。テスト対象プロジェクトのタイプによって、異なる方法でランタイム ライブラリを最終的なテスト可能バイナリにリンクすることができます。
インストゥルメントされたコードに基本的なサービスを提供するほか、ライブラリはコード カバレッジ ソリューションを特定の開発環境向けに調整するためにも使用されます。たとえば、テスト対象の組み込みデバイスと開発ホストの間でカバレッジ結果を送受信するために非標準的なトランスポートをサポートする場合などです。
C/C++test にはランタイム ライブラリのビルド済みのバージョンが付属しています。これらのバージョンは、C/C++test がインストールされているのと同じプラットフォームでの使用に適しています。多くの場合、ネイティブで開発されたアプリケーションは、ランタイム ライブラリのビルド済みのバージョンを使用してコード カバレッジを収集できます。
クロスプラットフォームのアプリケーションを開発するユーザーは、適切なクロス コンパイラおよび場合によってはリンカーを使用してカバレッジ ランタイム ライブラリのカスタム ビルドを用意する必要があります。C/C++test にはコード カバレッジ ランタイム ライブラリのソース コードが付属しています。
カバレッジ ランタイム ライブラリのカスタム ビルドの準備に必要なプロセスは、通常は、カバレッジ ランタイム ライブラリのソース コードをコンパイルすることだけです。状況によっては、一部のソース コードをインストールしてコード カバレッジを特定の開発プラットフォーム向けに変更する必要がある場合もあります。このプロセスについては、後のセクションで説明します。
C/C++test には以下のバイナリ ファイルが含まれています。
Windows (x86 および x86-64)
ファイル | 説明 |
---|---|
[INSTALL_DIR]/engine/coverage/runtime/lib/cpptest.a | Cygwin GNU GCC で使用される 32 bit 版のインポート ライブラリです。リンク コマンド ラインに追加します。 |
[INSTALL_DIR]/engine/coverage/runtime/lib/cpptest64.a | Cygwin GNU GCC コンパイラで使用される 64 bit 版のインポート ライブラリです。リンク コマンド ラインに追加します。 |
[INSTALL_DIR]/engine/coverage/runtime/lib/cpptest.lib | Microsoft Visual C++ コンパイラで使用される 32 bit 版のインポート ライブラリです。リンク コマンド ラインに追加します。 |
[INSTALL_DIR]/engine/coverage/runtime/lib/cpptest64.lib | Microsoft Visual C++ コンパイラで使用される 64 bit 版のインポート ライブラリです。リンク コマンド ラインに追加します。 |
[INSTALL_DIR]/engine/coverage/runtime/bin/cpptest.dll | 32 bit 版の動的リンク ライブラリです。PATH 環境変数に [INSTALL_DIR]/engine/coverage/runtime/bin を追加します。 |
[INSTALL_DIR]/engine/coverage/runtime/bin/cpptest64.dll | 64 bit 版の動的リンク ライブラリです。PATH 環境変数に[INSTALL_DIR]/engine/coverage/runtime/bin を追加します。 |
Linux (x86 および x86-64)
ファイル | 説明 |
---|---|
[INSTALL_DIR]/engine/coverage/runtime/lib/libcpptest.so | 32 bit 版の共有ライブラリです。リンク コマンド ラインに追加します。LD_LIBRARY_PATH に [INSTALL_DIR]/engine/coverage/runtime/lib を追加します。 |
[INSTALL_DIR]/engine/coverage/runtime/lib/libcpptest64.so | 64 bit 版の共有ライブラリです。リンク コマンド ラインに追加します。LD_LIBRARY_PATH に [INSTALL_DIR]/engine/coverage/runtime/lib を追加します。 |
あらかじめ用意されていない形式のランタイム ライブラリを使用する必要がある場合、特定の開発環境の要件に合わせたカバレッジ ランタイム ライブラリのカスタム ビルドを用意します。詳細については「ランタイム ライブラリのカスタマイズ」を参照してください。
カバレッジ ランタイム ライブラリをテスト対象アプリケーションと統合するリンク プロセスでは、通常はリンカー コマンド ラインの変更が必要であり、場合によっては実行環境の変更も必要です。このセクションでは、C/C++test に付属しているビルド済みのバージョンを使用する場合にリンク プロセスを変更する方法を説明します。
Windows Cygwin GNU GCC コンパイラ用の静的ライブラリの場合
Microsoft Visual C++ コンパイラ用の動的リンク ライブラリの場合
ビルド スクリプトを変更し、リンカー コマンド ラインの任意の場所にカバレッジ ランタイム ライブラリを指定します。できればすべてのオブジェクト ファイルの後に指定します。例:
$(LXX) $(PRODUCT_OBJ) $(OFLAG_EXE)$(PROJ_EXECUTABLE) $(LXXFLAGS) $(SYSLIB) $(EXECUTABLE_LIB_LXX_OPTS) [INSTALL_DIR]/engine/coverage/runtime/lib/cpptest.lib |
PATH
環境変数に [INSTALL_DIR]/engine/coverage/runtime/bin
ディレクトリが追加されており、テスト対象プログラムを開始したときにライブラリをロードできることを確認します。cpptest.dll
(またはcpptest64.dll
) ファイルを実行モジュールと同じディレクトリ、またはテスト対象アプリケーションの起動時に動的リンク ライブラリを検索するその他の場所にコピーすることを検討するとよいでしょう。
GNU GCC コンパイラ用共有ライブラリの場合
ビルド スクリプトを変更し、リンカー コマンド ラインの任意の場所にカバレッジ ランタイム ライブラリを指定します。できればすべてのオブジェクト ファイルの後に指定します。例:
$(LXX) $(PRODUCT_OBJ) $(OFLAG_EXE)$(PROJ_EXECUTABLE) $(LXXFLAGS) $(SYSLIB) $(EXECUTABLE_LIB_LXX_OPTS) -L [INSTALL_DIR]/engine/coverage/runtime/lib -lcpptest |
-L [INSTALL_DIR]/engine/coverage/runtime/lib
and -lcpptest
オプションが追加されていることに注意してください。
LD_LIBRARY_PATH
環境変数に [INSTALL_DIR]/engine/coverage/runtime/lib
を追加します。以下の条件に当てはまる場合、ランタイム ライブラリをカスタマイズする必要がある可能性があります。
C/C++test に付属しているランタイム ライブラリのソース コードは、[INSTALL_DIR]/engine/coverage/runtime
ディレクトリにあります。次の表は、使用方法の説明です。
コンポーネント | 説明 |
---|---|
include | ライブラリのインクルード ファイルがあるディレクトリです。 |
src | ライブラリのソース ファイルがあるディレクトリです。 |
Makefile | ランタイム ライブラリのビルド用に提供されている基本的な Makefile です。 |
target | 最も一般的に使用される開発環境用にランタイム ライブラリ ビルドを準備するためのコンパイラ固有のオプションを含む Makefile インクルード ファイルのセットがあるディレクトリです。 |
channel | サポート対象の通信チャネル用構成を含む Makefile インクルード ファイルのセットがあるディレクトリです。 |
ランタイム ライブラリはさまざまな通信チャネル経由でのデータ収集をサポートしています。使用される通信チャネルは開発環境に依存します。多くの場合、結果を 1 つまたは複数のファイルに格納するのが適切ですが、TCP/IP ソケットまたは RS232 による転送が必要な場合もあります。特定の通信チャネルを有効にするには、ライブラリのソース ファイル cpptest.c
をコンパイルするときに専用のマクロに値を設定します。値を設定するには、コンパイル コマンド ラインに -D<MACRO>
を追加します。次の表は、通信チャネル制御マクロの一覧です。
チャネル | 説明 |
---|---|
CPPTEST_NULL_COMMUNICATION | 空の実装です。このチャネルを有効にすると、結果は送信されません。初回のテスト ビルドおよびデバッグに適しています。 |
CPPTEST_FILE_COMMUNICATION | ファイルベースの実装です。ANSI C のファイル I/O インターフェイスが使用されます。このチャネルを有効にすると、結果はローカル ドライブのファイルに書き込まれます。 次の詳細設定マクロがあります。
|
CPPTEST_SPLIT_FILE_COMMUNICATION | ファイルベースの実装です。ANSI C のファイル I/O インターフェイスが使用されます。このチャネルを有効にすると、結果はローカル ドライブのファイルに書き込まれます。 以下のマクロを使ってこのチャネルを設定できます。
一連のすべてのファイルが同じディレクトリに置かれるようにします。
|
CPPTEST_UNIX_SOCKET_COMMUNICATION | TCP/IP ソケット ベースの実装です。POSIX API が使用されます。このチャネルを有効にすると、結果は指定された TCP/IP ポートに送信されます。次の詳細設定マクロがあります。
|
CPPTEST_WIN_SOCKET_COMMUNICATION | 上記と同じですが、MS Windows API が使用されます。 |
CPPTEST_UNIX_SOCKET_UDP_COMMUNICATION | CPPTEST_UNIX_SOCKET_COMMUNICATION と同じですが、UDP ベースの実装です。 |
CPPTEST_RS232_UNIX_COMMUNICATION | RS232 ベースの実装です。POSIX API が使用されます。このチャネルを有効にすると、結果は指定された RS232 システム デバイスを経由して送信されます。次の詳細設定マクロがあります。
|
CPPTEST_RS232_WIN_COMMUNICATION | CPPTEST_RS232_UNIX_COMMUNICATIONと同じですが、MS Windows API が使用されます。 |
CPPTEST_RS232_STM32F103ZE_COMMUNICATION | STM32F103x USART ベースの実装です。STM Cortex ライブラリ インターフェイスが使用されます (ST/STM32F10x/stm32f10x.h ヘッダー ファイルが必要です)。 |
CPPTEST_HEW_SIMIO_COMMUNICATION | Renesas HEW シミュレーター固有の実装です。 |
CPPTEST_LAUTERBACH_FDX_COMMUNICATION | Lauterbach TRACE32 ベースの実装です (FDX が使用されます)。 |
CPPTEST_ITM_COMMUNICATION | ARM CoreSight ITM ユニット ベースの通信です。CMSIS ヘッダー ファイルが必要です。 |
CPPTEST_CUSTOM_COMMUNICATION | カスタム実装のための空のテンプレートを有効にします。 |
提供されている Makefile でカバレッジ ランタイム ライブラリをビルドする場合、[INSTALL_DIR]/engine/coverage/runtime/channel
ディレクトリにある make 設定ファイルを使用できます。
お使いの開発環境に合う通信チャネルの実装がない場合、カスタム実装を使用できます。次の手順は、ランタイム ライブラリをカスタマイズして通信チャネルのカスタム実装を使用する方法を説明しています。
[INSTALL_DIR]/engine/coverage/runtime/src/cpptest.c
のコピーを作成して編集用にファイルを開きます。セクション 1.13 "Custom Communication Implementation" の場所を探します。
カスタム通信の実装セクションには、4 つの異なるメソッドのための空のテンプレートがあります。
関数 | 説明 |
---|---|
void cpptestInitializeStream(void) | この関数は通信チャネルの初期化を行います。たとえば、ソケットの作成および接続や、UART デバイスの初期化などを行います。 |
void cpptestFinalizeStream(void) | この関数は、通信チャネルの後処理を行います。たとえば、TCP/IP ソケットのクローズなどを行います。 |
| この関数は、データ バッファーからのサイズ バイトを送信します。 |
void cpptestFlushData(void) | この関数は、データをフラッシュします。フラッシュの意味は、トランスポートタイプによって異なります。一部の実装では、あまり意味がない可能性もあります。その場合、関数は空のままにしておきます。 |
cpptest.c
をコンパイルします。"-DCPPTEST_CUSTOM_COMMUNICATION"
ランタイム ライブラリはマルチスレッド アプリケーションをサポートします。POSIX、Windows、および VxWorks API がサポートされます。特定のマルチスレッド API のサポートを有効にするには、cpptest.c
をコンパイルするときにコンパイル コマンド ラインに -D<MACRO>
を追加します。次の表は、マルチスレッド API サポート制御マクロの一覧です。
マクロ | 説明 |
---|---|
CPPTEST_NO_THREADS | 空の実装です。カバレッジ ランタイムはマルチスレッド アプリケーションと共に使用できません。 |
CPPTEST_WINDOWS_THREADS | Windows のマルチスレッド API 実装です。 |
CPPTEST_UNIX_THREADS | POSIX のマルチスレッド API 実装です。 |
CPPTEST_VXWORKS_THREADS | VxWorks のマルチスレッド API 実装です。 |
サポート対象外のマルチスレッド API を使用するマルチスレッド アプリケーションと共に C/C++test のカバレッジ エンジンを使用する場合、お使いのマルチスレッド API と共に動作するようランタイム ライブラリをカスタマイズできます。それには、次の手順を行う必要があります。
[INSTALL_DIR]/engine/coverage/runtime/src/cpptest.c
のコピーを作成して編集用にファイルを開きます。セクション 2.5 "Custom Communication Implementation" の場所を探します。
カスタム通信の実装セクションには、4 つの異なるメソッドのための空のテンプレートがあります。
関数 | 説明 |
---|---|
static int cpptestLock(void) | この関数は、カバレッジ ツール ランタイム ライブラリ内の処理が同期されることを保証します。あるスレッドがランタイム ライブラリ サービスへのアクセスをロックした場合、その間はアトミックな処理が行われ、他のスレッドがランタイム ライブラリ サービスを使用できないことを意味します。ロックが解放されると、他のスレッドがランタイム ライブラリ サービスを使用できるようになります。 |
static int cpptestUnlock(void) | ランタイム ライブラリ サービスを解放します。 |
お使いの環境の要件に合わせてこれらのメソッドを実装します。
コンパイル コマンド ラインに次のマクロ定義を付加して cpptest.c
をコンパイルします。"-DCPPTEST_CUSTOM_THREADS"
生成されたオブジェクトファイルでは不十分な場合、要求に合わせてさらにファイルを処理できます (共有ライブラリを作成するなど)。
ランタイムのビルド プロセスを簡略化するため、C/C++test には簡単な Makefile が付属しています (「Library Source Code Structure」を参照)。しかし、ソース コードがすでにビルド プロセス用に最適化されているため、多くの場合、付属の make ファイルは必要ありません。常に必要なステップは、cpptest.c
ソース ファイルのコンパイルだけです。生成されたオブジェクト ファイルをさらに処理する必要があるかどうかは、個々の開発環境や、ランタイム ライブラリを共有ライブラリとして提供するかなどの要件によります。
[INSTALL_DIR]/engine/coverage/runtime
をローカル ディレクトリにコピーします。次のコマンド ラインを呼び出すと、単一のオブジェクト cpptest.<OBJ_EXT>
を含むサブディレクトリ build
が作成されます。それを使用してインストゥルメントされたアプリケーションとリンクできます。
make TARGET_CFG=<target config file name> CHANNEL_FILE=<channel config file name> |
コマンドは次のようになります。
make TARGET_CFG=gcc-static.mk CHANNEL_FILE=channel/unix-socket.mk |
チャネル タイプを指定することもできます。
make TARGET_CFG=gcc-static.mk CHANNEL_TYPE=unix-socket |
カバレッジ ランタイム ライブラリのユーザー ビルドをセットアップするには、次の操作を行います。
[INSTALL_DIR]/engine/coverage/runtime/src/cpptest.c
から任意の場所に cpptest.c ファイルをコピーします。-I
) に次の値を含めます。-I[INSTALL_DIR]/engine/coverage/runtime/include
-D
) を追加します。 例: -DCPPTEST_FILE_COMMUNICATION -DCPPTEST_NO_THREADS