このセクションでは、 C++test を使って自動生成テスト ケース、ユーザー定義テスト ケース、CppUnit テスト ケースを実行する方法について説明します。
このセクションの内容
テスト ケースの実行
C++test は、あらゆる有効な C++test テスト ケースおよびレガシー CppUnit テスト ケースを実行してカバレッジ情報をレポートできます。
テスト ケースを実行するための一般的な手順は次のとおりです。
- 「回帰テストと例外検出のためのテスト ケースの生成」で説明されている手順に従ってテスト ケースを生成します。
- (オプション) 見つからない関数定義のためのスタブを自動生成する場合は、[ビルトイン] > [Generate Stubs] テスト コンフィギュレーションを使用するか、このテスト コンフィギュレーションを元にしたユーザー定義テスト コンフィギュレーションを使用します。 注意 ! これは、定期的に実行されるコマンドライン テストには推奨しません。
- スタブを生成する方法と自動生成スタブをカスタマイズする方法については 「スタブの追加と変更」 を参照してください。
- (オプション) 自動生成スタブとテストがコンパイル可能かどうかをテストの実行前にチェックしたい場合、[ビルトイン] > [Unit Testing] > [Build Test Executable] テスト コンフィギュレーション (またはこのテスト コンフィギュレーションを元にしたユーザー定義テスト コンフィギュレーション) を実行してトライアル ビルドを実行します。注意 ! これは、定期的に実行されるコマンドライン テストには推奨しません。
- 「トライアル ビルド」を参照してください。
[ビルトイン] > [Unit Testing] > [Run Unit Tests] テスト コンフィギュレーション (またはこのテスト コンフィギュレーションを元にしたユーザー定義テスト コンフィギュレーション) を実行します。
ヒント - [テスト ケース エクスプローラー] ビューからのテスト実行
[テスト ケース エクスプローラー] ビューから直接テストを実行することができます (このビューを表示するには、[Parasoft] > [ビューの表示] > [テスト ケース エクスプローラー] をクリックします)。[テスト ケース エクスプローラー] ビューで、テストしたいリソース (プロジェクト、フォルダー、テスト スイート、テスト ケース) を選択して右クリックし、ショートカット メニューの [テスト履歴] または [テスト] からテスト コンフィギュレーションを実行します。
実行されたテストは、結果ステータスによって色分けされて表示されます。失敗したテストは赤で、成功したテストは緑で表示されます。
- テスト ケースの実行結果をレビューして対処します。
- 詳細については、「単体テストの結果のレビューと処理」 を参照してください。
- (オプション) 必要に応じてテスト実行の設定を調整します。
- 詳細については、「[実行] タブ - テストの実行方法を定義する」 を参照してください。
cpptestcli によるコマンドライン モードでの回帰テストの実行
定期的にコマンドライン モードで回帰テストを実行するには、単純に [ビルトイン] > [Unit Testing] > [Run Unit Tests] テスト コンフィギュレーション (またはこのテスト コンフィギュレーションを元にしたユーザー定義テスト コンフィギュレーション) を実行するべきです。
例:
cpptestcli -data /path/to/workspace -resource "ProjectToTest" -config team://ExecuteTests -publish
トライアル ビルド
C++test では、テストを実行せずにテスト用実行モジュールのトライアル ビルドを作成できます。トライアル ビルドにはテスト ケースとユーザー スタブが含まれます。この機能を利用して、自動生成スタブとテストがコンパイル可能かどうかをチェックできます。トライアル ビルドは、テスト対象のプロジェクトにテスト ケースがまだない場合でも可能です。
トライアル ビルドを実行する方法としては、[ビルトイン] > [Unit Testing] > [Build Test Executable] テスト コンフィギュレーションを実行することを推奨します。
スタブの自動生成とカスタマイズ
[ビルトイン] > [Generate Stubs] テスト コンフィギュレーションの (またはこのテスト コンフィギュレーションをベースにしたユーザー定義テスト コンフィギュレーション) を実行すると、見つからない関数定義と変数定義のためのカスタマイズ可能なスタブ (またはスタブ テンプレート) が自動的に生成されます。「Executing Test Cases」の説明にもあるように、推奨する方法は、テスト ケースを実行する前に、まずテスト ケースを生成し、[Generate Stubs] テスト コンフィギュレーションを実行し、 [Build Test Executable] テスト コンフィギュレーションを実行することです。
スタブを生成するテスト コンフィギュレーションを使ってテストを実行すると、C++test は指定の場所にスタブ ファイルを作成します。完全なスタブ定義を自動生成できない場合は、スタブ テンプレートが作成され、ユーザーは return 文を入力したりインクルード ディレクティブを追加したりしてカスタマイズできます。完全なスタブとスタブ テンプレートは別々のファイルに保存されます。
自動生成スタブは、他にユーザー スタブもオリジナル スタブもない場合にだけ使用されます。
自動生成スタブとスタブ テンプレートはカスタマイズできます。詳細については 「スタブの追加と変更」を参照してください。スタブまたはスタブ テンプレートをカスタマイズした場合は、C++test がスタブ/スタブ テンプレートを認識するように解析を再度実行する必要があります。
スタブを生成するユーザー定義テスト コンフィギュレーションを作成するには、次の操作を行います。
- [Parasoft] メニューの [テストコンフィギュレーション] をクリックします。
- [ビルトイン] > [Unit Testing] > [Generate Stubs] テスト コンフィギュレーションを右クリックし、ショートカット メニューの [複製] をクリックします。複製されたテスト コンフィギュレーションが「ユーザー定義」カテゴリの下に追加されます。
- [ユーザー定義] > [Generate Stubs] テスト コンフィギュレーションを選択します。
- [実行] タブの [シンボル] タブをクリックします。
- (オプション) 生成されたスタブをデフォルトの ${project_loc}/stubs/autogenerated 以外の場所に保存したい場合、[自動生成スタブ出力先] フィールドで出力先を指定します。
- [適用] をクリックしてから [閉じる] をクリックします。
カスタム テスト ユニットの定義
デフォルトでは、C++test はテスト対象のファイル (テスト対象のプロジェクトファイル) とテスト スイートを次のように算出します。
- 選択されたテスト スイートの中から、[実行] タブの [全般] タブの [テスト スイート ファイルの場所のパターン] 条件に一致するすべてのテスト スイートを実行します。テスト スイート ファイルが CPPTEST_CONTEXT あるいは CPPTEST_INCLUDED_TO マクロを使用している場合、適切なソース ファイルおよびヘッダー ファイルがテスト対象になります。
- 選択されたすべてのプロジェクト ソース ファイルおよびヘッダー ファイルがテスト対象になります。さらに C++test は [テスト スイート ファイルの場所のパターン] で指定の場所において、CPPTEST_CONTEXT がテスト対象ファイルにセットされたテスト スイート ファイルを探します。このテスト スイート ファイルもテスト対象ファイルになります。
テスト対象ファイルのオリジナル定義を解決するために、他のプロジェクト ソース ファイルも使用したい場合、テスト コンフィギュレーションの [実行] > [シンボル] タブの [他のプロジェクト ファイルのシンボルを使用] オプションで設定できます。また、[次の場所で発見されたファイルのシンボルも使用] オプションを使って、使用するスタブを指定できます。[実行] > [全般] タブの [テスト対象コンテキストごとにテスト用実行モジュールを作成する] オプションを使って、コンテキスト (1 つのソース/ヘッダー ファイルまたはプロジェクト) ごとにテスト用実行モジュールを作成するかどうかを指定できます。
使用するプロジェクト ファイルとスタブの指定方法とテスト用実行モジュールの作成方法の詳細については、「[シンボル] タブ」 を参照してください。
他から分離した状況での単一ファイルの実行
テストによっては、他の関連するコンポーネントとは分けてコードの単体テストを実行したい場合があります。そのような場合、C++test ではスタブを使ってコードをテストできます。
1 つのファイルを分離してテストするには (異なる「テスト ベッド」でカスタム スタブと自動生成スタブを使ってテストするには)、次の操作を行います。
- テスト対象のファイルを選択します。
- [ビルトイン] > [Unit Testing] > [File Scope] > [Run Unit Tests (File Scope)] テスト コンフィギュレーションを使ってファイルを実行します。通常、エラー ステータスがレポートされて、[コンソール] ビューに詳細が表示されます。その理由は、一部の関数の定義を C++test が発見できないからです。
- 見つからない関数または変数の定義を用意します。次の操作を行います。
- ユーザー定義スタブを手動で作成します (「 スタブの追加と変更」を参照)
- [ビルトイン] > [Unit Testing] > [File Scope] > [Generate Stubs (File Scope)] テスト コンフィギュレーションを使ってスタブを自動的に作成し、必要に応じてスタブのソースを変更します (「スタブの自動生成とカスタマイズ」および 「 スタブの追加と変更」を参照)
- [ビルトイン] > [Unit Testing] > [File Scope] > [Build Unit Tests (File Scope)] テスト コンフィギュレーションを実行してテスト用実行モジュールのトライアル ビルドを行います。すべての必要なシンボルを適切に解決するために、そしてカスタム スタブ コードによってコンパイル エラーが発生しないようにするために、トライアル ビルドの実行を推奨します。
- [ビルトイン] > [Unit Testing] > [File Scope] > [Run Unit Tests (File Scope)] テスト コンフィギュレーションを使ってテストを実行します。今回はテストが正常に終了するはずです。
ライブラリとオブジェクト ファイルを無視する
他と分けた状況で 1 つのファイルをテストする場合、特定のライブラリとオブジェクトをテストから外したいことがあります。テスト コンフィギュレーションの [実行] > [シンボル] タブの [オブジェクト/ライブラリ ファイルを無視する] フィールドで、コマンドライン オプションのパターンを、セミコロン (;) で区切って指定します。リンカー コマンドラインからのオプションだけが無視されます。標準ライブラリ、コンパイラ ライブラリ、およびプラグマを使ってインクルードされているライブラリは無視されません。
他から分離した状況での関数のテスト
他から分離した状況で関数をテストする方法は色々あります。このセクションでは、セーフティ クリティカルなソース コードをテストするためによく使用される方法について説明します。この種のテストのための基本要件は、インストゥルメント モジュールがテスト対象ソース コードを変更してはならないことです。これは、実稼働環境での関数の実行をテスト結果が確実に反映するようにするためです。
テスト対象関数がインストゥルメントされないようにするには、テスト コンフィギュレーションでインストゥルメント設定を確認する必要があります。
- テスト コンフィギュレーションを開き、[実行] > [全般] タブをクリックします。
- [単体テスト] 実行モードを有効にし、[実行の詳細] の [インストゥルメント モード] の [編集] ボタンをクリックします。
[テスト対象ソース] カテゴリで、以下の機能だけを有効にします。
- private メンバーにアクセス
- 関数スタブ (スタブ インストゥルメント モードの適切な設定と共に)
- main() 関数の名前を変更
以下のセクションでは、スタブ モードの設定、テスト スイート構成ごとのスタブ管理、および他から分離して関数をテストするためのテスト実行ファイルの設定について説明します。
スタブのインストゥルメント設定
テスト対象コードの関数スタブを使用するには、スタブのインストゥルメントを有効にしてスタブ モードを選択する必要があります。スタブのインストゥルメントを有効にすると、スタブ エンジンがアクティブ化されます。スタブ モードを選択することがスタブ呼び出しの適用方法を定義します。スタブ モードには以下の 2 種類があります。
- 関数呼び出しのインストゥルメント
- スタブ化された関数のインストゥルメント (関数呼び出しは変更しない)
C++ テンプレートのスタブを有効化するオプションもあります。詳細については、「C++ テンプレートに対するスタブの使用」を参照してください。
以下の例で、スタブ関数またはメソッドの呼び出し方法で 2 つのモードがどのように異なるかを示します。
/* Original definition of function to be stubbed */ int Func(void) { // Function body } /* tested function definition */ int testedFunction(void) { int val = Func (); /* tested function body */ return val; }
サンプル ソース コードをそれぞれのスタブ モードでインストゥルメントすると、以下の表のようになります。
関数呼び出しのインストゥルメント | スタブ化された関数のインストゥルメント |
---|---|
/* Stub function definition */ int CppTest_Stub_StubbedFunc(void) { // Stub body return 0 } /* Original definition of stubbed function */ int Func(void) { // Function body } /* tested function definition */ int testedFunction(void) { int val = CppTest_Stub_StubbedFunc(); /* tested function body */ return val; } |
/* Stub function definition */ int CppTest_Stub_StubbedFunc(void) { // Stub body return 0 } /* Original definition of stubbed function */ int Func(void) { return CppTest_Stub_StubbedFunc(); // Function body removed } /* tested function definition */ int testedFunction(void) { int val = Func (); /* tested function body */ return val; } |
セーフティ クリティカルなコードをテストする場合、通常は“スタブ化された関数のインストゥルメント モード”が好まれます。なぜなら、このモードはテスト対象関数の本体を変更しないからです。スタブ モードを設定するには、以下の操作を行います。
- テスト コンフィギュレーションを開き、[実行] > [全般] タブをクリックします。
- [インストゥルメント モード] ドロップダウン メニューの隣にある [編集] ボタンをクリックし、スタブ モードを有効にします。
この方法でインストゥルメント モードを設定すると、以下の制限事項が発生します。
- テスト対象関数が別の関数のスタブを必要とする場合、スタブ化された関数を同じテスト セッションでテストすることはできません (テスト対象のソース コードで定義された場合)。
- テスト スイートは、同じスタブ設定の関数またはメソッドのテスト ケースをグループ化しなければなりません。
- 競合するスタブ設定を持つテスト スイートを単一のテスト バイナリに含めることはできません。この状況が起こるのは、あるテスト スイートが、別のテスト スイート中にテスト対象関数のスタブがあると推測する場合です。
以下のセクションでは、このような制限事項の対処方法について説明します。
テスト用実行ファイルのビルド設定
- テスト コンフィギュレーションを開き、[実行] > [全般] タブをクリックします。
- [単体テストの設定] セクションで、選択したテスト スイートをテスト用実行ファイルに分割するための規則を有効にします。
以下の設定を使用できます。- 選択対象のテスト実行モジュールを作成: ファイル スコープではないすべてのテスト コンフィギュレーションのデフォルト。
- テスト対象コンテキストごとにテスト用実行モジュールを作成する: ファイル スコープのテスト コンフィギュレーションのデフォルト。
- テスト スイートごとにテスト用実行モジュールを作成する: 選択したテスト スイートごとに個別のテスト バイナリを作成するには、このオプションを有効にします。テスト スイートがテスト ケースをグループ化する場合、混在できないスタブを明確に選択する必要があるため、このオプションの選択が必要なことがあります。
- [適用] をクリックします。
テスト スイート固有のスタブの管理
単体テストの方針として、テスト スイートごとに異なるスタブ セットを使用しなければならない場合があります。これを実現するために、テスト スイートごとに専用のテスト コンフィギュレーションを用意するか、テスト スイートで直接スタブ ファイルを指定することができます。後者の方が望ましい方法です。
テスト スイートのスタブ ファイルを指定するには、以下の操作を行います。
- テスト ケース エクスプローラーを開き、テスト スイートをダブルクリックします。
- [その他のスタブ ファイル] フィールドに、目的のスタブ ファイルをドラッグします。
別の方法として、[その他のスタブ ファイル] フィールドの右側にある [スタブ ファイルの追加] ボタンをクリックしてスタブ ファイルを選択することもできます。
直接テスト スイート ファイルを変更して、GUI を使わずにテスト スイート固有のスタブ ファイルをテスト スイートに追加することもできます。テスト スイートにスタブ ファイルを追加するには、テキスト/コード エディターでテスト スイートを開き、各スタブ ファイルに以下のマクロを挿入します。ルート ディレクトリ パスを使って、特定の場所にあるすべてのスタブを含めることもできます。
CPPTEST_ADDITIONAL_STUB_FILES(<stub file path or root directory>);
このマクロは、有効な C/C++ マクロの場所であればどこにでも指定できますが、 cpptest.h ヘッダー ファイルの後に追加しなければなりません。テスト スイート レベルで指定したすべてのスタブ ファイルは、テスト コンフィギュレーションの設定に影響を受けるスタブ ファイルの後に追加されます。
個々のテスト ケースの実行
テスト ケースを選択して実行するには、次の操作を行います。
- 次のいずれかの操作を行って、実行するテスト関数を選択します。
- [テスト ケース エクスプローラー] ビューでテスト ケースを選択します。
- テスト ケースがあるテスト ケース エディターを選択し、テスト ケース エディターにフォーカスがあることを確認します (テスト ケース エディターの使用の詳細については 「回帰テストと例外検出のためのテスト ケースの生成 」 を参照してください)。
- エディターに表示されたテスト スイート ファイルでテスト ケース メソッドを選択します。
プロジェクト ツリーで、実行するテスト関数のノードを選択します。異なるテスト スイートからテスト ケースを選択して実行できます。
- テスト ケースを実行するように設定されたテスト コンフィギュレーションを使ってテストを実行します ([ビルトイン] > [Unit Testing] > [Run Unit Tests] など)。
- たとえば、選択対象を右クリックし、[Parasoft] ショートカット メニューからテスト コンフィギュレーションを実行します。
未解決シンボルのリンカー エラーの解決
テスト対象のコードが参照しているシンボルを C++test が発見できない場合、リンカー エラーが起こることがあります。
未解決のシンボルを参照するには、次の操作を行います。
- テスト コンフィギュレーションの [実行] > [シンボル] タブで [未解決シンボルが検出された場合は実行を中断する] チェックボックスをオンにします。 (詳細については 「[実行] タブ - テストの実行方法を定義する」を参照してください。)
- テストを再実行します。
未解決のシンボル (未定義の関数) がレポートされます。未解決のシンボルを確認するには、次のいずれかの操作を行います。
- [スタブ] ビューで "なし" の定義があるシンボルを探します。
- [コンソール] ビューで「Cannot configure stubs for function [function]」 メッセージを探します。
未解決のシンボルを解決するには、次の方法があります。
- 未解決のシンボルのためのスタブを自動生成します。詳細については 「スタブの自動生成とカスタマイズ」 を参照してください。
- プロジェクト中でシンボルが定義されている場合、テスト コンフィギュレーションの [実行] > [シンボル] タブで [他のプロジェクトファイルのシンボルを使用] チェックボックスをオンにして1 個のアスタリスク(*) を追加します。詳細については「[実行] タブ - テストの実行方法を定義する」を参照してください。
外部ライブラリにシンボルがある場合、外部ライブラリをリンカー コマンドラインに追加してからテストを再度実行します。詳細については「プロジェクトの更新」を参照してください。
- 見つからない関数のためのユーザー定義スタブを作成し、再度テストを実行します。詳細については「スタブの追加と変更」 を参照してください。
テスト実行中のデバッガーの使用
「テスト実行中のデバッガーの使用」を参照してください。