2016-08-24 43 views
1

我試圖使用GTEST類型參數,以確保我的課的基本功能。不過,我被困在測試設置中。以下是例子:多態性GTEST類型參數

我有兩個類稱爲CatTest & DogTest,和一個基類叫做AnimalTest,這將考驗貓&狗的所有相似之處:

template <typename T> 
class AnimalTest : public ::testing::Test 
{ 
public: 
    virtual void SetUp() 
    { 
     // Do something here so that it will call the correct setup 
    } 
}; 

TYPED_TEST_P(AnimalTest , HasLegs) 
{ 
    ASSERT_EQ(4, this->Legs); 
} 

REGISTER_TYPED_TEST_CASE_P(AnimalTest , HasLegs); 

現在在我的CatTest.cpp,我有聲明下面的宏(這同樣適用於DogTest)

typedef ::testing::Types<Cat> AnimalsTypes; 

INSTANTIATE_TYPED_TEST_CASE_P(CatTest, AnimalTest , AnimalsTypes); 

class CatTest : public CatSetUp 
       , public AnimalTest<AnimalsTypes> 
{ 
public: 
    virtual void SetUp() 
    { 
     CatSetUp::SetUp(); 
    } 
} 

在正常類型參數化試驗例中,HasLegs測試將兩種貓與狗類型運行。 這裏的問題是CatTest有它自己的SetUp(),DogTest()也是這樣。需要執行這些需要初始化Cat對象,以便將其傳遞給類型參數化測試(動物測試)。然而,這些SetUp從來沒有被調用過,實際上甚至DogTest()或CatTest()的構造函數都不會被調用。我認爲類型參數化測試將使用overriden SetUp()調用派生類的相應實例?或者我在這裏錯過了什麼?

回答

3

您不得進行測試類爲待測試的對象。

我的意思是反對被測應該是你的測試類(聚集,而不是繼承)的成員 - 然後,一切都變得簡單:

template <typename T> 
class AnimalTest : public ::testing::Test 
{ 
public: 
    T objectUnderTest; // animal 
    virtual void SetUp() 
    { 
     objectUnderTest.SetUp(); 
    } 
}; 

TYPED_TEST_P(AnimalTest , HasLegs) 
{ 
    ASSERT_EQ(4, objectUnderTest.Legs); 
} 

REGISTER_TYPED_TEST_CASE_P(AnimalTest , HasLegs); 
typedef ::testing::Types< Cat, Dog > AnimalsTypes; 

INSTANTIATE_TYPED_TEST_CASE_P(AnimalWithFourLegs, AnimalTest , AnimalsTypes); 

闡釋

然而,這些SetUp永遠不會被調用,事實上即使是構造函數 也不會調用DogTest()或CatTest()。

很簡單。

第一個參數INSTANTIATE_TYPED_TEST_CASE_P不是類的名字 - 它僅僅是一些名稱描述第三個參數 - 這樣你就知道哪個測試是哪個。話說INSTANTIATE_TYPED_TEST_CASE_P(CatTest, AnimalTest , AnimalsTypes);並不意味着它是無論如何涉及到CatTest類...閱讀gtest-doc

+0

您好,感謝@PiotrNycz的objectUnderTest並獲得成功。我被INSTANTIATE_宏弄糊塗了,但當我檢查它的聲明時,它確實只是第一個參數的#prefix。儘管如此,我仍然可以使用與我的CatTest相同的名稱來同時執行共同和個別測試。 (不能upvote,還需要更多的代表去;()。 – mappa

+0

@mappa我很高興幫助。請接受這個答案,我假設它解決了你的問題... – PiotrNycz