このセクションでは、テスト セッションからカバレッジ情報を生成する方法と実行のオーバーヘッドを最小化するために設定を変更する方法について説明します。

カバレッジ解析の有効化と無効化

コード カバレッジ情報を収集するには、[実行] タブでインストゥルメントの設定を行う必要があります。C++test では、オプションを設定して、テスト対象コードの実行中に収集するカバレッジ メトリクスを選択できます。詳細については 「カバレッジの種類 」を参照してください。

たとえば組込みテストなどでパフォーマンスの問題がある場合、すべてのコード カバレッジの監視を無効にすることもできます。カバレッジ解析の制御については 「[実行] タブ - テストの実行方法を定義する」を参照してください。

コード カバレッジの情報は、単体テストの実行から収集するだけでなく、C++test によってビルドされた、カバレッジの監視に特化したアプリケーションの手動テスト実行から収集することもできます。

コード カバレッジ解析のオーバーヘッド

デフォルトでは、テスト対象コードの実行中に生成されたコード カバレッジの情報は、直ちに C++test に送られ、正しい結果が保証されます。たとえばテスト実行がクラッシュする場合、クラッシュが発生する時点までのカバレッジ情報はすべて有効です。この手法のデメリットは、実行時間のオーバーヘッドが比較的大きいことです。ただし、単体テストの実行のオーバーヘッドはほとんどの場合に無視できます。結果的に、デフォルトのカバレッジ モードを推奨します。

ただし、テスト対象コード実行中のカバレッジ データ転送 (デフォルト モード) に関連する実行時間のオーバーヘッドは、アプリケーション レベル テスト (アプリケーション機能テスト) からのカバレッジ情報の収集にとって許容されない場合があります。たとえば、組込みシステムのアプリケーション ロジックに影響するアプリケーションのタイミングに依存する処理にカバレッジ インストゥルメントが影響するのは極めてよくあることです。

デフォルトのコード カバレッジ実行時間のオーバーヘッドが許容できない場合、ユーザーは特別な最適化されたモードを有効にしてアプリケーション レベルの機能テストからカバレッジを収集できます。最適化されたモードでは、以下のことが行われます。

  • カバーされる C/C++ 言語構造についての情報を格納するために、専用のメモリ バッファーが使用されます。  
  • カバレッジ データはアプリケーションの終了時に送られます。機能テストの実行中に送られるのではありません。  
  • カバーされる C/C++ 言語命令についての情報を格納するために、コード インストゥルメントは最低限必要な機械語命令を実行します。  
  • したがって、オーバーヘッドを最小化するために、ホストとターゲットの間でファスト リンクを保証する必要はありません。  

アプリケーション カバレッジ監視のためのカバレッジ メトリクスの最適化

特別な最適化されたカバレッジ インストゥルメント モードは、アプリケーション レベル テストだけを対象とします。単体テストでは使用できません。最適化されたカバレッジ モードを有効にするには、テスト コンフィギュレーションの [実行] タブの [C/C++ コード カバレッジの詳細オプション] を使用します。詳細については 「[実行] タブ - テストの実行方法を定義する」 で説明しています。

[C/C++ コード カバレッジの詳細オプション] では次のことを実行できます。

  • 「より小さいテスト対象コードの実行時間のオーバーヘッド」または「より少ない RAM メモリでのオーバーヘッド」を選択する。  
  • カバレッジ メモリ バッファーを初期化する。  
  • カバレッジ データ バッファーの破損を防止する。  

最適化されたコード カバレッジの監視セッションを実行するには、専用の初期化関数および終了関数を呼び出す必要があります。

 

 

void CppTest_InitializeRuntime(void)
void CppTest_FinalizeRuntime(void)

 

C 言語のアプリケーションの場合、デフォルトではこれらの関数は main 関数の先頭と最後で呼び出されます。C++ 言語のアプリケーションの場合は、この目的のために追加された、特別なグローバル オブジェクトのコンストラクターおよびデストラクターから呼び出されます。

アプリケーションに main 関数が存在しないか、あるいはアプリケーションがグローバル オブジェクトのコンストラクションとデストラクションをサポートしない場合は、アプリケーションの起動と終了の間の適切な場所で初期化関数と終了関数の呼び出しを手動で挿入できます。

  • No labels