2

私はいくつかのテストを持っています:

class Somefixture: ::testing::Test{};
class Somefixture2: ::testing::Test{};

TEST_F(SomeFixture, SomeName)
{
// ...
}

テストを両方のフィクスチャ (装飾) に自動的にリンクするにはどうすればよいですか?

TEST_F2(SomeFixture, SomeFixture2, SomeName){}

必要な結果は、私が書いたかのようになりますが:

TEST_F(SomeFixture, SomeName)
{
// ...
}
TEST_F(SomeFixture2, SomeName)
{
// ...
}

不要なコードの重複なし

4

4 に答える 4

1

1 つの小さな例外 (2 つのテストに同じ名前を付けることはできません) を除いて、これは正しい方向に進む必要があります。

#define TEST_F2(F1, F2, Name)                                  \
template <struct Fixture> struct MyTester##Name : Fixture {    \
  void test##Name();                                           \
};                                                             \
                                                               \
TEST_F(MyTester##Name<F1>, Name##1){ test##Name(); }           \
TEST_F(MyTester##Name<F2>, Name##2){ test##Name(); }           \
                                                               \
template <struct Fixture> void MyTester##Name::test##Name()

これは 2 つのテストを呼び出し、それぞれが 2 つのフィクスチャの 1 つから継承するフィクスチャとして MyTester を使用します。do_test は MyTester のメンバーであるため、フィクスチャから継承されたすべてのメンバーにアクセスできます。テスト フレームワークは、テストごとに MyTester オブジェクトを作成し、対応する実際のフィクスチャは基本クラス オブジェクトとして作成されます。他のテストや TEST_F2 の異なる呼び出しとの名前の競合を避けるために、名前をテンプレート名とテスト メソッド名に追加しました。TEST_F マクロ呼び出しには、名前とインデックスが提供されます。私は Google Test を持っていないのでテストしませんでしたが、これらのテスト フレームワークの多くのメカニズムは同様に機能します。

于 2013-02-26T15:03:08.037 に答える
0

テストを両方のフィクスチャに自動的にリンク(装飾)するにはどうすればよいですか?

共通の基本クラスを追加することによって:

class CommonFixture
{
  public:
    // add member variables and initialize them in the constructor
};
class Somefixture1 : ::testing::Test, protected CommonFixture{}
class Somefixture2 : ::testing::Test, protected CommonFixture{}

テストは同じままです:

TEST_F(SomeFixture1, SomeName)
{
// ...
}
TEST_F(SomeFixture2, SomeName)
{
// ...
}

これで、Somefixture1とSomefixture2に共通のフィクスチャができました。テスト内からこれらの一般的なオブジェクトにアクセスできます。

于 2013-02-26T12:25:52.713 に答える
0

BЈовић良さそうなアプローチで行けます。
または、テスト自体に小さな変更を加える必要がある別のアプローチは、両方のインスタンスをメンバーとして持つ「スーパー」クラスを持つことです。

class superFuxture
{
public:
    Somefixture1 f1;
    Somefixture2 f2;
}

次に、テストは次のようになります。

TEST_F(superFuxture, SomeName)
{
    //when you were accessing a member of Somefixture1 you'll now need to do:
    //f1.SomeFixture1Member
}
于 2013-02-26T12:58:43.713 に答える
0

Google Test には、同じテスト本体を異なるコンテキストで実行する方法が 2つあります。正確にはあなたが望むものではありませんが、それが提供する最も近いものです.

于 2013-02-27T14:44:50.263 に答える