45

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

4

1 に答える 1

55

FAQにそれに対する答えがあります:

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

最初に覚えておくべきことは、googletestは複数のテストで同じテストフィクスチャオブジェクトを再利用しないということです。それぞれについてTEST_F、googletestは新しいテストフィクスチャオブジェクトを作成し、すぐに呼び出しSetUp()、テストボディを実行し、を呼び出しTearDown()てから、テストフィクスチャオブジェクトを削除します。

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

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

SetUp()/TearDown()次のまれなケースでも使用することができます。

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