web-dev-qa-db-ja.com

Googleテスト:既存のテストフィクスチャクラスを使用するパラメータ化されたテスト?

現在多くのテストで使用されているテストフィクスチャクラスがあります。

#include <gtest/gtest.h>
class MyFixtureTest : public ::testing::Test {
  void SetUp() { ... }
};

既存のすべてのテストを変更することなく、MyFixtureTestが提供するすべてのものを使用するパラメーター化されたテストを作成したいと思います。

それ、どうやったら出来るの?

私はウェブ上で同様の議論を見つけましたが、彼らの答えを完全には理解していません。

21
des4maisons

問題は、通常のテストの場合、フィクスチャはtesting :: Testから派生する必要があり、パラメータ化されたテストの場合、testing :: TestWithParam <>から派生する必要があることです。

これに対応するには、パラメータタイプを操作するためにフィクスチャクラスを変更する必要があります

template <class T> class MyFixtureBase : public T {
  void SetUp() { ... };
  // Put the rest of your original MyFixtureTest here.
};

// This will work with your non-parameterized tests.
class MyFixtureTest : public MyFixtureBase<testing::Test> {};

// This will be the fixture for all your parameterized tests.
// Just substitute the actual type of your parameters for MyParameterType.
class MyParamFixtureTest : public MyFixtureBase<
    testing::TestWithParam<MyParameterType> > {};

このようにして、を使用してパラメータ化されたテストを作成しながら、既存のすべてのテストをそのまま維持できます。

TEST_P(MyParamFixtureTest, MyTestName) { ... }
22
VladLosev

この質問は、 Google Testドキュメント で回答されています(VladLosevの answer は技術的には正しいですが、おそらく少し作業が増えます)

具体的には、既存のフィクスチャクラスにパラメータを追加する場合は、次のことができます。

class MyFixtureTest : public ::testing::Test {
  ...
};
class MyParamFixtureTest : public MyFixtureTest,
                           public ::testing::WithParamInterface<MyParameterType> {
  ...
};

TEST_P(MyParamFixtureTest, MyTestName) { ... }
39
mabraham

この一般的なフィクスチャから派生した新しいフィクスチャを作成し、その派生クラスでパラメータ化されたテストを作成する場合、それはあなたを助け、あなたの問題を解決しますか?

Google Testから wikiページ : "Google Testでは、共有ロジックをベーステストフィクスチャに配置し、そのベースから必要なテストケースごとに個別のフィクスチャを導出することで、テストケース間でフィクスチャを共有します。この共通の論理を使用するために。」

0
ratkok