gtest类型参数化的多态性

时间:2016-08-24 15:53:27

标签: c++ unit-testing testing polymorphism googletest

我正在尝试使用gtest type-parameterized来确保我的类的基本功能。但是我陷入了测试设置。以下是示例:

我有两个名为CatTest& amp; DogTest和一个名为AnimalTest的基类将测试Cat&的所有相似之处。狗:

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测试将针对Cat和Dog类型运行。 这里的问题是CatTest有自己的SetUp(),DogTest()也是如此。这些需要执行才能初始化Cat对象,以便我可以将它传递给类型参数化测试(动物测试)。但是从不调用这些SetUp,实际上甚至从未调用过DogTest()或CatTest()的构造函数。我认为类型参数化测试将使用覆盖SetUp()调用派生类的相应实例?或者我在这里遗漏了什么?

1 个答案:

答案 0 :(得分: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