このセクションでは、C++test を使って 単体テスト ケースを自動生成する方法について説明します。テスト ケースを利用して、回帰テストのための機能スナップショットをキャプチャーできます。また、例外を引き起こす条件を特定することもできます。例外の発生は、不安定なシステムやアプリケーション、セキュリティ脆弱性 (サービスの拒否攻撃など)、パフォーマンスの低下、アプリケーションのレスポンス時間、頻繁なダウンタイムといった問題を引き起こすことがあります。
このセクションの内容 :
C++test は、テスト コンフィギュレーションの [生成] タブで定義されたパラメーターに従ってテスト ケースを自動生成します。自動生成テスト ケースの形式は、CppUnit 形式に似ています。
新しい機能を検証するためのテスト生成 新しいコードの機能を検証したい場合、まず関数ごとに 1 - 2 個のテストを自動生成することを推奨します。 テストを自動生成して実行した後に、ユーザー定義テスト ケースを追加してテスト スイートを拡張できます。詳細については 「テスト スイートの拡張と変更」を参照してください。 |
回帰テスト用のテストの生成 コードの現在の動作をキャプチャした回帰テスト ベースラインを作成したい場合 (たとえば確実にコードの動作が正しいことがわかっている場合) には、[ビルトイン] > [Unit Testing] > [Generate Regression Base] テスト コンフィギュレーションを使用します。このテスト コンフィギュレーションを実行すると、C++test は自動的にすべてのテスト結果を正しい結果として検証済みにします。 これらのテストを定期的に (たとえば 24 時間ごとに) 自動的に実行すれば、回帰テストでキャプチャした関数にコードの変更が影響を与えていないかどうかを検証できます。テスト結果が変わった場合、テスト ケースは失敗となり、問題があることを開発チームに知らせます。 今後のテストにおいて、最初のテストでキャプチャした動作と異なる動作が検出された場合、C++test はタスクをレポートします。 |
デフォルトの設定では、C++test は 1 つのファイルにつき 1 つのテスト スイートを生成します。設定を変更すれば、1 つの関数につき 1 つのテスト スイートを生成することもできます。 ( 「生成オプションのカスタマイズ」 を参照してください。)
C++test は「セーフ(安全な)スタブ定義」を自動生成して危険な関数を置き換えます。セーフ スタブ定義は、ほとんどのシステム I/O ルーチン (rmdir()、remove()、rename() など) について使用できます。また、C++test は見つからない関数定義と変数定義のためのスタブも自動生成できます (「スタブの自動生成とカスタマイズ」を参照)。ユーザー定義スタブは必要に応じて追加できます ( 「スタブの追加と変更」を参照)。
テスト ケースを生成するための全般的な操作手順は次のとおりです。
GUI からのテスト方法については「GUI からのテスト」を参照してください。
コマンドラインからのテスト方法については 「コマンドライン インターフェイスからのテスト 」を参照してください。
ヒント - [テスト ケース エクスプローラー] ビューからのテスト生成
[テスト ケース エクスプローラー] ビューから直接テストを生成することができます (このビューを表示するには、[Parasoft] > [ビューの表示] > [テスト ケース エクスプローラー] をクリックします)。[テスト ケース エクスプローラー] ビューでプロジェクト ノードを選択して右クリックし、ショートカット メニューの からテスト生成用のテスト コンフィギュレーションを実行します。
テスト ケース エクスプローラーの詳細については「GUI の概要」を参照してください。
テスト コンフィギュレーションの [生成] タブでは、さまざまな生成オプションをカスタマイズできます。
テスト スイートのファイル名、場所、粒度、およびレイアウトは、テスト コンフィギュレーションの [生成] > [テスト スイート] タブで制御できます。
デフォルトのテスト スイート出力設定を変更するには、まず [テスト スイート出力ファイルとレイアウト] から次のいずれかの定義済みオプションを選択します。
[テスト対象関数ごとにテスト スイートを生成] を選択した場合、このテスト コンフィギュレーションを使って ATM サンプル プロジェクトをテストすると、次のようなテスト スイートが生成されます ( ATM プロジェクトは C++test のインストール ディレクトリの Examples/ATM ディレクトリにあります)。
[テスト対象ソース/ヘッダー ファイルごとにテスト スイートを生成] を選択した場合、このテスト コンフィギュレーションを使って ATM サンプル プロジェクトをテストすると、次のようなテスト スイートが生成されます。
定義済みオプションを選択した後、必要に応じてパターンをカスタマイズできます。たとえば、ソースと同じ場所にテストを生成するなどのカスタマイズです。次の変数を使用できます。
キー
|
変数を削除することによって、テスト スイートのオーバーラップが起こることがあります。その場合、C++test は「テスト スイート出力ファイル パターンがあいまいです」というエラー メッセージを表示して警告します。 C++test は、生成されたテストの場所についての基本パターンの変更に関連する、次の内部チェックと制限を行います。
|
既存のテスト ケースがある場合に、新しいテスト ケースで既存のテスト スイートを置き換えるか、それとも新しいテスト ケースを既存のテスト スイートに統合するかを指定できます。テスト コンフィギュレーションの [生成] > [テスト スイート] タブの [テスト ケースの生成 (既存のテストスイートを使用)] で、次のいずれかのオプションを選択します。
C++test は、既存のテスト ケースがあるかどうかをどのように判定するのか ? C++test は、テスト スイート ファイル中の CPPTEST_CONTEXT および CPPTEST_TEST_SUITE_INCLUDED_TO マーカーを探します。 |
以下の表では、一般的なテスト生成の目的を達成するためにテスト コンフィギュレーションの生成オプションをどのように設定するかについて説明します。[生成] > [全般] タブの [テスト生成のパターン] および [生成] > [テスト スイート] タブの [テスト ケースの生成 (既存のテストスイートを使用)] について説明します。
目的目的 | 設定 |
テストの初期セットを生成する | [テスト生成のパターン] で [テスト スイートが存在しない場合にテスト コードを生成する] チェックボックスをオンにします。 他のパラメーター (関数アクセス レベル、出力ファイルの場所と名前など) を指定します。 |
新しい関数のテストを使って、既存の自動生成テスト スイートを更新する (新しいテスト スイートは生成しない) | [テスト生成のパターン] で [テスト対象のファイルが更新された場合にテスト ケースを生成する] および [テスト対象のファイルが更新されていない場合にテスト ケースを生成する] チェックボックスをオンにします。 [テスト ケースの生成 (既存のテストスイートを使用)] で [テスト ケースがない関数に対してテスト ケースを追加する] を選択します。 他のパラメーター (関数アクセス レベル、出力ファイルの場所と名前など) を指定します。 |
自動生成テスト ケースと現行コードの同期を取る (欠けているテストを追加し、欠けているテスト スイートを作成する) | [テスト生成のパターン] で [テスト スイートが存在しない場合にテスト コードを生成する]、[テスト対象のファイルが更新された場合にテスト ケースを生成する]、および [テスト対象のファイルが更新されていない場合にテスト ケースを生成する] チェックボックスをオンにします。 [テスト ケースの生成 (既存のテストスイートを使用)] で [テスト ケースがない関数に対してテスト ケースを追加する] を選択します。 他のパラメーター (関数アクセス レベル、出力ファイルの場所と名前など) を指定します。 |
既存の自動生成テストを完全にリセットする | [テスト生成のパターン] で [テスト スイートが存在しない場合にテスト コードを生成する]、[テスト対象のファイルが更新された場合にテスト ケースを生成する]、および [テスト対象のファイルが更新されていない場合にテスト ケースを生成する] チェックボックスをオンにします。 [テスト ケースの生成 (既存のテストスイートを使用)] で [既存のテスト スイートを置き換える] を選択します。 他のパラメーター (関数アクセス レベル、出力ファイルの場所と名前など) を指定します。 |
このセクションでは、[テスト スイート出力ファイルとレイアウト] オプションの設定方法について説明します。このオプションは、テスト コンフィギュレーションの [生成] > [テスト スイート] タブにあります。各オプションがプロジェクトで実際にどのように解釈されるかをわかりやすくするために、次のサンプル プロジェクトを使って、各オプションの影響について説明します。
MyProject headers MyClass.h // contains foo() definition sources MyClass.cpp // contains bar() and goo() definitions |
${project_loc}/tests/${file_loc_rel}/${file_name}/
TestSuite_${function_name}.${test_ext}
レイアウトの例:
MyProject headers MyClass.h sources MyClass.cpp tests headers MyClass.h TestSuite_foo.cpp // contains tests for foo() sources MyClass.cpp TestSuite_bar.cpp // contains tests for bar() TestSuite_goo.cpp // contains tests for goo() |
Use ${project_loc}/tests/${file_loc_rel}/${file_name}/
TestSuite_${function_name}.${test_ext}
レイアウトの例:
MyProject Header Files MyClass.h Source Files MyClass.cpp tests Header Files MyClass.h TestSuite_foo.cpp // contains tests for foo() Source Files MyClass.cpp TestSuite_bar.cpp // contains tests for bar() TestSuite_goo.cpp // contains tests for goo() |
${project_loc}/tests/${file_loc_rel}/
TestSuite_${file_base_name}_${file_ext}.${test_ext}
レイアウトの例:
MyProject headers MyClass.h sources MyClass.cpp tests headers TestSuite_MyClass_h.cpp // contains tests for foo() sources TestSuite_MyClass_cpp.cpp // contains tests for bar() and goo() |
${project_loc}/${file_loc_rel}/tests/
TestSuite_${file_base_name}_${file_ext}.${test_ext}
レイアウトの例:
MyProject headers MyClass.h tests TestSuite_MyClass_h.cpp // contains tests for foo() sources MyClass.cpp tests TestSuite_MyClass_cpp.cpp // contains tests for bar() and goo() |
${project_loc}/tests/${file_loc_rel}/${file_name}/
TestSuite_${function_name}.${test_ext}
レイアウトの例:
MyProject module1 sources MyClass.cpp tests TestSuite_MyClass_cpp.cpp headers MyClass.h tests TestSuite_MyClass_h.cpp |
Use ${project}/tests/${source_loc_rel:/MyProject/module1}/
TestSuite_${source_base_name}_${source_ext}.${test_ext}
レイアウトの例:
MyProject module1 sources MyClass.cpp headers MyClass.h tests TestSuite_MyClass_cpp.cpp headers TestSuite_MyClass_h.cpp |
${project}/tests/TestSuite_${source_base_name}_${source_ext}.${test_ext}
レイアウトの例:
MyProject module1 sources MyClass.cpp headers MyClass.h tests TestSuite_MyClass_cpp.cpp TestSuite_MyClass_h.cpp |
${project}/tests/${source_base_name}_${source_ext}/
TestSuite_${function_name}_${function_uid}.${test_ext}
レイアウトの例:
MyProject module1 sources MyClass.cpp headers MyClass.h tests MyClass_cpp TestSuite_foo_1234abcd.cpp TestSuite_foo_4321abcd.cpp TestSuite_goo_4321dcba.cpp MyClass_h TestSuite_bar_2143badc.cpp |