2017-01-08 6 views
2

私が達成したいのは、異なる値をテストできるParamaterized Test TEST_P(MyFixtureClass, DoStuff)です。上記の値は、通常はINSTANTIATE_TEST_CASE_Pに渡される値のような定数ではありません。さらに、私は理想的には、他のフィクスチャクラス内の値を使用したいと考えています。Googleテスト(gtest)でフィクスチャのメンバ値を使用してパラメータ化されたテストを実行するにはどうすればよいですか?

パラメータ化されたテストを作成するときに静的な値の代わりにフィールドを使用する方法はありません。 official documentationはこれをカバーしていないようです - 悲しいことに。


しかし、ここで、この質問にXY-問題を導入することを避けるために同等の擬似コードは次のとおりです。

パラメータ化治具、MyFixture

struct MyFixture : OtherFixture, ::testing::WithParamInterface<float> 
{ 
    float a; 

    void SetUp() override 
    { 
     a = GetParam(); 
    } 
}; 

OtherFixtureは次のようになります。

struct OtherFixture : testing::Test 
{ 
    float a; 
    float b; 
    float c; 

    void SetUp() override 
    { 
     a = CalculateSomeFloat(); 
     b = CalculateSomeFloat(); 
     c = CalculateSomeFloat(); 
    } 
}; 

テストケースは、 E:

// This here is the key aspect. 
// Basically, I do not want to write a bunch of tests for a, b and c. 
// Rather, I'd just test all 3 with this one. 
TEST_P(MyFixture, DoStuff) 
{ 
    ...bunch of tests 
} 

そして最後に、我々はパラメータ化テストのインスタンスを作成します:

明らか
INSTANTIATE_TEST_CASE_P(MyFloatTesting, MyFixture, ::testing::Values(
    OtherFixture::a, OtherFixture::b, OtherFixture::c 
)); 

OtherFixture::aが不適切であるが、私は継承されたフィクスチャクラス内で、フィールドを参照したい場所、それが示します(またはその問題のための任意のフィクスチャクラス)。


gtestでこれを達成する方法はありますか?必ずしもパラメータ化されたテストを使う必要はありません。同じテストを書く必要を避けるだけで、私は別のオブジェクトに対してうまくいきます。


ご迷惑をおかけして申し訳ありません。

答えて

2

::testing::Combineを使用する必要があると思います。

パラメータをfloatからstd::tuple<float, float OtherFixture::*>に変更します。パラメータのセット定義するために

using OtherFixtureMemberAndValue = std::tuple<float, float OtherFixture::*>; 

struct MyFixture : OtherFixture, ::testing::WithParamInterface<OtherFixtureMemberAndValue> 
{ 
    float a = std::get<0>(GetParam()); 
    auto& memberToTest() 
    { 
     return this->*std::get<1>(GetParam()); 
    } 


}; 

は、このアプローチを使用します。

const auto membersToTest = testing::Values(
    &OtherFixture::a, 
    &OtherFixture::b, 
    &OtherFixture::c 
); 

const auto floatValuesToTest = testing::Values(
    2.1, 
    3.2 
    // ... 
); 

INSTANTIATE_TEST_CASE_P(AllMembers, 
         MyFixture, 
         testing::Combine(floatValuesToTest, membersToTest)); 

次に、あなたはOtherFixtureのメンバーに関しては、一般的なテストを書くことができます。

TEST_P(MyFixture, test) 
{ 
    ASSERT_EQ(a, memberToTest()); 
} 

私はあなたのアドバイスも希望のPrintToを書きました:

このようにして

210あなたが失敗した場合には素敵なメッセージが表示されます:

[FAILED] AllMembers/MyFixture.test/5、GetParam()=(3。2、 & OtherFixture :: C)W/O PrintTo厄介な、無意味なメッセージと比較

AllMembers/MyFixture.test/5 [FAILED]、GetParam()=(3.2など、それは私が関数ポインタを使用することができます私には発生しなかった 4バイトのオブジェクト< 10から00 00から00>)

+1

、 'OtherFixtureフロート:: *'。そして、私は「PrintTo」の追加に非常に感謝します。余分なマイルに行ってくれてありがとう。 – Nikita

関連する問題