このセクションでは、C++test のクロス プラットフォーム テストの処理と要件について説明します。サポート対象環境での C++test の使用に関する詳細は、「サポートされる環境」を参照してください。
このセクションの内容:
C++test のクロス プラットフォーム テスト
クロス プラットフォーム テストを利用すると、ホストで生成/拡張した C++test 単体テスト ケースを 1 つ以上のターゲットで実行できます (ホストは、C++test がインストールされている開発環境です。ターゲットは、組込みデバイス、シミュレーター/エミュレーター、またはソフトウェアを移植する他のプラットフォームです)。この機能は、組込みデバイスまたは別のプラットフォームで使用するためにクロス コンパイルするコードをテストするのに特に有効です。
ターゲット ベースの単体テストを実行するための一般的な手順は次のとおりです。
- C++test でテストするプロジェクトを開くか、またはインポートします。
- 環境で必要とされるコンパイラ/リンカー フラグを C++test ビルド オプションに追加します。
- テスト用実行モジュールをビルドします。
- テスト生成を実行する、ビルトインまたはユーザー定義のテスト コンフィギュレーションを使って、テスト ケースを生成します (たとえば [Generate Unit Tests] テスト コンフィギュレーションなど)。
- テスト用実行モジュールをビルドするユーザー定義テスト コンフィギュレーションを作成します。たとえば、スタブの使用を無効にし、テスト実行フローをカスタマイズして、結果ログ ファイルの書き込み先を指定できます。
- 作成したユーザー定義テスト コンフィギュレーションを実行して、テスト用実行モジュールをビルドします。
- テスト用実行モジュールをターゲットに移動します。
- ターゲット上でテスト用実行モジュールを実行します。
- ホスト環境からテスト結果にアクセスできるようにします。そして、[Utilities] > [Collect Results] のいずれかのテスト コンフィギュレーションを実行して、C++test GUI から解析結果を参照します。
各手順の詳細については以降のセクションで説明します。
サポートされる環境
- ホスト開発環境:
- OS: Windows、Linux
- コンパイラ: GNU GCC 2.95.x - 3.4.x (Windows), GNU GCC 2.95.x - 4.1x (Linux), Green Hills MULTI v4.0.x Native (Windows), Green Hills MULTI v5.1.x Embedded V800 (Windows), Microsoft Visual Studio (Windows), Sun CC コンパイラ
- 組込み環境 ( 下記のみに限定されない):
- ARM RVDS 3.0, 3.1, 4.0, 4.1
- Embedded Linux
- Green Hills MULTI
- IAR Embedded Workbench for ARM (starting from 5.3x)
- QNX Development Environment 6.3, 6.4, 6.5
- Renesas High-performance Embedded Workshop 4
- Texas Instruments Code Composer 3.1, 3.3, 4.x, 5.x, 6.0
- Wind River Tornado 2.x
- Wind River Workbench 2.6 または 3.0-3.3
サポートされるコンパイラの詳細については「サポートされる環境」を参照してください。
全般的ストラテジー
C++test は、拡張可能なテスト ケースを自動的に生成して、効率的かつ包括的な組込みテストを阻む障害を取り除きます。この自動生成テスト ケースは、ホスト、シミュレーター、および実際のターゲット環境で実行してコードの堅牢さと機能テストの結果を検証できるほか、カバレッジ メトリクスを取得できます。また、実行中のアプリケーションをモニターし、メモリの問題を検出したりコード カバレッジを追跡することもできます。
ホスト環境では、開発者は単体テストテスト ケースおよび API テスト ケースを自動的に生成できます。このテスト ケースはコーナー ケース条件に対する予想外の機能レスポンスを特定します。異なるコンフィギュレーションを使って、生成されたテストは現行のソフトウェアの動作をメソッド/関数レベルでキャプチャします。このテスト スイートは、機能テストのために必要に応じて拡張できるほか、回帰テスト用に自動的に構成することも、ホストで実行することもできます ( このとき、ターゲットの依存関係はカスタマイズ可能なスタブによって自動的に置き換えられます)。
また、このテスト スイートをクロス コンパイルしてターゲット環境で実行できます。ターゲット テストの結果はファイルに保存して後で C++test GUI にロードして評価および解析できます。 テスト結果は TCP/IP ソケットを介して自動的に C++test GUI に送ることも可能です。判断文 (Decision) カバレッジ、単純条件カバレッジ、MC/DC カバレッジを含め、すべてのテストについてカバレッジ メトリクスが収集されます。C++test GUI には、さまざまなホスト デバッガーのサポート、スタック トレースのレポート、コール シーケンスのレポート、テスト ケース結果の詳細な表示といった、テスト ケースのデバッグ作業を容易にするためのさまざまな機能が用意されています。
オリジナル アプリケーションは、メモリ関連の問題を検出するためにインストゥルメントしたり、既存のメモリのバグを特定するためにクロス コンパイルしてターゲット上で起動したり、コード カバレッジを収集したりすることもできます。このカバレッジ データは単体テストのカバレッジ データと統合できます。
テスト用実行モジュールをビルドする
テスト用実行モジュールは、インストゥルメントされたソース コードを中心に構築されたテスト ハーネスと C++test ランタイム ライブラリから構成されます。
ホスト ベースのテストの場合、C++test に付属のビルド済みの C++test ランタイム ライブラリが使用されます。
ターゲット ベースのテストの場合は、 クロス コンパイルされた C++test ランタイム ライブラリが必要です。C++test は自動的にランタイム ライブラリのビルドを準備します。ただし、標準ではないカスタマイズが必要な場合は、ユーザーが手動でランタイム ライブラリのビルドを準備し、 クロスコンパイラを使ってテスト ハーネスのソース コードをビルドする必要があります ( 詳しい手順については 「C++test ランタイム ライブラリのビルド」を参照してください)。クロス コンパイルしたテスト ハーネスとランタイム ライブラリを、標準の OS 関数を持つライブラリを使ってリンクします ( C++test ランタイム ライブラリで使用される外部関数の一覧については 「C++test ランタイム ライブラリが使用するシンボル」を参照してください)。
テスト ハーネスのクロス コンパイルおよび C++test ランタイム ライブラリへのリンクは、通常 C++test が自動的に実行するため、C++test でクロス コンパイラを適切に定義する必要があります。 ( 「C++test ランタイム ライブラリのビルド」 および 「カスタム コンパイラを使用するテストの設定」を参照してください。) このプロセスはユーザーとのやり取りを必要としません。
次の図は、テスト用実行モジュールのビルド プロセスを表したものです。
テスト用実行モジュールを実行して結果を収集する
テスト用実行モジュール をターゲット環境にデプロイしたら、このテスト用実行モジュールを実行してテスト結果を収集します。テスト用実行モジュールを起動するには、ユーザーまたはシステムが main 関数を呼び出します。理想的には、ユーザーの環境がテスト用実行モジュールをデプロイおよび実行するプロセスを自動化するべきです。この場合、このプロセスは C++test によって管理されるテスト実行フロー定義の一部になることができます。
ファイル通信をサポートする設定で C++test ランタイム ライブラリをビルドした場合、テスト結果は結果ファイルに送られます。
ソケット通信チャネルまたは RS232 通信チャネルをサポートする設定で C++test ランタイム ライブラリをビルドした場合、結果はユーザー指定のリスニング エージェントに送られます。
ファイル通信チャネルから結果を収集する
テスト用実行モジュールを起動すると、初期化ルーチンが 2 つのファイルを作成します。1 つはテスト結果用のファイルであり 1 つはカバレッジ結果用のファイルです。カバレッジを無効にしている場合はテスト結果用のファイルだけが作成されます。これらのファイルはターゲット環境のローカル ファイル システム上に作成されます。一部の環境ではファイルをハード ドライブに格納できます。他の環境では、フラッシュ メモリに基づいて実装された入出力などを持つこともあります。C++test ランタイム ライブラリは ANSI 標準の I/O 関数を使ってファイル コミュニケーション チャネルを管理します。テストの実行中、次の図にあるようにアサーションがファイルにログとして記録されます。
テストが完了した後に C++test GUI で結果を参照するには、取得したテスト ログをホストに転送して戻す必要があります。ログ ファイルの詳細については「テスト実行フローのカスタマイズ」を参照してください。
ソケット通信から結果を収集する
ビルドされるテスト用実行モジュール は、ソケット通信チャネルをサポートします。テストの開始時に 2 つの TCP/IP ソケットがオープンされます。1 つはテスト結果を送信するためのものであり、もう 1 つはカバレッジ結果を送信するためのものです。カバレッジを無効に設定している場合、1 つのソケットだけがオープンされます。
ソケット通信を介して結果を収集するには、指定ポートでリッスンしてホスト マシンのファイルにデータを書き込むことができるリスニング エージェントが必要です。C++test にはリスニング エージェントは用意されていません。しかし、GNU Netcat などのオープン ソースのエージェントを使用できます。
テストの実行が完了すると、リスニング エージェントは結果ファイルを送信します。ファイル通信の場合と同じように C++test GUI で結果を参照できます。
次の図は、ソケット ベースの通信プロセスを表したものです。
シリアル通信から結果を収集する
シリアル通信チャネルをサポートするようテスト用実行モジュールをビルドした場合、シリアル接続はテスト用実行モジュールの開始時に初期化され、テスト データがターゲットからリスニング エージェントに送られます。これはホスト マシンで開始されます。リスニング エージェントはテスト データをカバレッジデータから分離し、別のファイルに保存します。その後、ファイル ベースの通信と同様に、ユーザーは C++test GUI に結果を読み込んで参照することができます。
次の図は、シリアル通信のプロセスを表したものです。
ターゲットでの単体テストのためのテスト実行フローの自動化
ユーザー定義のテスト実行フローを定義すれば、デフォルトの C++test テスト実行フローを実行できない開発環境でもテストの自動化を実現できます。たとえば組込み/クロス プラットフォーム開発では、テスト ハーネス、クロス コンパイラを使ったハーネスのビルド、ターゲット デバイスでのデプロイと起動、ホスト マシンへのテスト結果のダウンロード、およびテスト結果の C++test への読み込みが必要です。カスタム実行フローは、OS で起動可能な外部ユーティリティを 起動するために使用できます。たとえば、make、FTP ユーティリティ、ターゲット通信マネージャーなどです。
「テスト実行フローのカスタマイズ」 では、カスタム実行フローを使ってターゲットでのテストを自動化する方法について説明しています。自動化のためのワークフローは次のとおりです。
- テスト ハーネスを準備します。 ( ユーザー ソース コードのインストゥルメント、テスト ケースの生成と収集)
- テスト ハーネスをビルドします。
- テスト用実行モジュールをターゲット デバイスにデプロイします。
- テストを自動的に実行するかテストが実行されるのを待ちます。
- テストの結果とカバレッジをホスト マシンにダウンロードし、C++test で読み込みます。