このセクションでは、ユーザー ライブラリまたはシステム ライブラリで定義された外部シンボルのリストを作成する方法について説明します。C++test の Library Symbols Identification (LSI) がシンボル リストを自動的に取得できない場合、テスト オブジェクト/テスト用実行モジュールをビルドするときに、C++test はこの外部シンボル リストを使用できます。Wind River の VxWorks のための DKM テスト オブジェクトのビルドなど、単体テスト シナリオによってはこれが最も実行可能なソリューションです。また、LSI フェーズにおいてライブラリの自動特定やシンボルの抽出で問題が発生している場合、これは有効な回避策です。

このセクションの内容:

外部シンボル リストの書式

外部シンボル リストは XML に似たファイルです。LSI が理解できる構造で外部シンボル リストをラップします。このファイルの書式は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<LibrarySymbols tool="C++Test" formatVersion="1.0">
	   <Symbol name="some_symbol"/>
   <!-- ... --> 
</LibrarySymbols>

単体テスト用のコンパイラが使用するマングル手法に従って、すべてのシンボル名をマングルする必要があります。

外部シンボル リストの取得

外部シンボル リストを取得するための具体的な操作手順は、オペレーティング システム、コマンド シェル、利用可能なユーティリティといった要因によって異なります。 どの操作手順においても、外部シンボル リストを取得するには次の操作が必要です。

  • 適切なオブジェクト/ライブラリ/イメージからシンボル名をダンプします。コンパイラ出力の形式が一般的なオブジェクト形式である場合、オペレーティング システムのデフォルトの (nm ユーティリティに似た) バイナリ ユーティリティを使ってシンボル名をダンプできます。また高い確率で、コンパイラが提供する適切なユーティリティを使用する必要があります。  
  • ダンプした内容からグローバル シンボル名だけを抽出します。ローカル シンボル、未定義シンボル、シンボル アドレス、シンボル タイプ コード文字、ソース オブジェクト名、ライブラリ名などは除外します。この処理は、利用可能な場合、nm ユーティリティ独自のオプションを使って行うことができます。  
  • 抽出したグローバル シンボル名を、XML に似た構造にラップします ( 「外部シンボル リストの書式」を参照)。  

すべてのコンテキストに合う手法は存在しないため、ユーザーは自分の状況に最適な手法を決定する必要があります。 この外部シンボル リストの生成プロセスを助けるために、C++test には LSISymLstGen という Java アプリケーション (ソースとコンパイル済みバイナリの両方) が用意されています 。この Java アプリケーションは、nm に似たユーティリティ出力から、LSI のシンボル リストを生成します。このユーティリティ出力は、BSD 形式 (nm のデフォルト) または共通の POSIX (portability) 形式である必要があります (-p スイッチを nm および LSISymLstGen に渡します)。

LSISymLstGen がある場所は <C++test_install_dir>/engine/utils です。

シンボル リストを作成するには、次の 2 つのコマンドを作成します。

  • nm_tool -g -p --defined-only --no-demangle object_file > nm_out  
  • java -cp "C++test_install_dir/engine/utils" LSISymLstGen nm_out XML_sym_lst  

さらに、C++test には上記のコマンドを実行する Extract Library Symbols テスト実行フローと [Utilities] > [Extract Library Symbols] テスト コンフィギュレーションが用意されています。このテスト 実行フローを使用するには、まず編集が必要です。ほとんどの場合、"Path to external library/object to scan for symbols" テスト フロー プロパティを実際のオブジェクト/ライブラリ/イメージのパスに設定するだけで十分です。ただし、 "Symbols listing tool name" および "Symbols listing options" も調整したほうが良い場合があります (Symbols listing tool name は必須の場合があります。Wind River のソリューションでは必須です)。

デフォルトでは、このテスト コンフィギュレーションは、プロジェクトの C++test キャッシュにシンボル リストを作成しようとします。そのため、プロジェクトのキャッシュを消去するたびに、シンボル リストを再作成する必要があります。場合によっては、"Path to generated file with symbols" を変更して複数のプロジェクトに同じリストを一度に設定するか、キャッシュを削除するときにシンボル リストを消去しないようにする方が便利です。

JRE 実行モジュールへのパスを調整する必要がある場合、テスト実行フローの jre プロパティを変更することができます。

テスト実行フローを調整する方法の詳細については、 「テスト実行フローのカスタマイズ」を参照してください。

外部シンボル リストをロードするようにテスト実行フロー サンプルをカスタマイズする

テスト オブジェクト/テスト用実行モジュールをビルドするときにシンボル リストを使用するように C++test を設定するには、使用するテスト コンフィギュレーションから呼び出される適切なヘルパー サンプルに、変更を加える必要があります。 必要な変更は、LsiStep タグに libSymFile 属性を追加することだけです。

例:

<LsiStep libSymFile="XML_sym_lst" />

Wind River の DKM 用に含まれている、(補完的なテスト コンフィギュレーションに加えて) 数多くのテスト実行フロー サンプルは、すべて VxWorks イメージ シンボル ソースとして外部シンボル リストを使用します。また、[ビルトイン ] > [Utilities] > [Generate Stubs Using External Library Symbols] テスト コンフィギュレーションは、外部シンボル リストを使った自動スタブ生成に特化したテスト コンフィギュレーションです。

デフォルトでは、これらのテスト コンフィギュレーションは、C++test プロジェクトのキャッシュを検索して外部シンボル リストを探します。テスト フロー プロパティの "Path to file with external symbols list" を変更してこのデフォルト動作を変えることができます。

 

  • No labels