gtest类型参数化的多态性

Polymorphism for gtest type parameterized

本文关键字:多态性 类型参数 gtest      更新时间:2023-10-16

我试图使用gtest类型参数化,以确保我的类的基本功能。然而,我被困在测试设置。示例如下:

我有两个类叫做catest &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类型。这里的问题是ctest有自己的SetUp(), DogTest()也是如此。这些需要执行,以便初始化Cat对象,以便将其传递给类型参数化的测试(Animal测试)。然而,这些SetUp从来没有被调用过,事实上,甚至连DogTest()或ctest()的构造函数也从来没有被调用过。我认为类型参数化测试将调用派生类的相应实例与重写SetUp() ?还是我遗漏了什么?

不能将测试类作为被测试对象。

我的意思是被测试对象应该是你的测试类的成员(聚合,而不是继承)-然后一切都变得简单:

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()或ctest()。

很简单。

INSTANTIATE_TYPED_TEST_CASE_P的第一个参数不是类名-它只是描述第三个参数的某个名称-因此您将知道哪个测试是哪个。说INSTANTIATE_TYPED_TEST_CASE_P( CatTest, AnimalTest , AnimalsTypes );并不意味着它与CatTest类有任何关系…读gtest-doc。