web-dev-qa-db-ja.com

テストフィクスチャのセットアップとコンストラクタ

テストフィクスチャにGoogle TestのSetUpメソッドがあるのはなぜですか?コンストラクタは実質的に同じものではないのですか? TearDownメソッドについても同様です。 SetUpとConstructorの両方、およびTearDownとDestructorの呼び出しは、TestEventListenersのOnTestStartおよびOnTestEndと一貫しています。

33
Baz

FAQにその答えがあります

テストフィクスチャのコンストラクタ/デストラクタまたはセットアップ/ティアダウン関数を使用する必要がありますか?

最初に覚えておかなければならないのは、googletestが複数のテストで同じテストフィクスチャオブジェクトを再利用しないことです。 _TEST_F_ごとに、googletestはfreshテストフィクスチャオブジェクトを作成し、すぐにSetUp()を呼び出して、テスト本文を実行します。 TearDown()を呼び出してから、テストフィクスチャオブジェクトを削除します。

テストごとのセットアップおよびティアダウンロジックを記述する必要がある場合は、テストフィクスチャコンストラクター/デストラクターを使用するか、SetUp()/TearDown()を使用するかを選択できます。前者は以下の利点があるため、通常は前者が推奨されます。

  • コンストラクターでメンバー変数を初期化することで、それをconstにするオプションがあります。これにより、値が誤って変更されるのを防ぎ、テストがより明確になります。
  • テストフィクスチャクラスをサブクラス化する必要がある場合、サブクラスのコンストラクターは基本クラスのコンストラクターfirstを呼び出すことが保証され、サブクラスのデストラクタは基本クラスを呼び出すことが保証されます'デストラクタ後でSetUp()/TearDown()を使用すると、サブクラスが基本クラスのSetUp()/TearDown()の呼び出しを忘れたり、間違ったタイミングで呼び出したりする可能性があります。

次のまれなケースでは、引き続きSetUp()/TearDown()を使用することをお勧めします。

  • コンストラクタ(またはデストラクタ)の本体では、_ASSERT_xx_マクロを使用することはできません。したがって、セットアップ操作が致命的なテストの失敗を引き起こし、テストの実行を妨げる可能性がある場合は、コンストラクタの代わりにCHECKマクロを使用するか、SetUp()を使用する必要があります。
  • ティアダウン操作で例外がスローされる可能性がある場合は、デストラクタではなくTearDown()を使用する必要があります。デストラクタをスローすると、未定義の動作が発生し、通常はすぐにプログラムが強制終了されます。コンパイラで例外が有効になっている場合、多くの標準ライブラリ(STLなど)がスローされる可能性があることに注意してください。したがって、例外の有無にかかわらず動作するポータブルテストを作成する場合は、TearDown()を優先する必要があります。
  • Googletestチームは、例外が有効になっているプラ​​ットフォーム(Windows、Mac OS、Linuxクライアント側など)でアサーションマクロをスローすることを検討しています。これにより、ユーザーがサブルーチンから呼び出し元にエラーを伝達する必要がなくなります。したがって、そのようなプラットフォームでコードを実行できる場合は、デストラクタでgoogletestアサーションを使用しないでください。
  • コンストラクタまたはデストラクタでは、このオブジェクトに対して仮想関数を呼び出すことはできません。 (virtualとして宣言されたメソッドを呼び出すことはできますが、静的にバインドされます。)したがって、派生クラスでオーバーライドされるメソッドを呼び出す必要がある場合は、SetUp()/TearDown()を使用する必要があります。
38
Kiril