gtest 类型参数化的多态性

Polymorphism for gtest type parameterized

我正在尝试使用类型参数化的 gtest 来确保我的 classes 的基本功能。但是我被困在测试设置中。以下是示例:

我有两个 class 称为 CatTest 和 DogTest,还有一个名为 AnimalTest 的基础 class 将测试 Cat 和 Dog 的所有相似性:

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 对象,以便我可以将其传递给类型参数化测试 (Animal test)。然而,这些 SetUp 从未被调用过,事实上,甚至 DogTest() 或 CatTest() 的构造函数也从未被调用过。我认为类型参数化测试将使用覆盖的 SetUp() 调用派生 class 的相应实例?还是我在这里遗漏了什么?

您不得进行测试class成为被测对象。

我的意思是被测对象应该是你测试的成员class(聚合,而不是继承)——那么一切都变得简单了:

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 );

的解释

However these SetUp is never called, in fact even the constructor of DogTest() or CatTest() was never invoked.

很简单。

INSTANTIATE_TYPED_TEST_CASE_P 的第一个参数不是 class 名称 - 它只是描述第三个参数的一些名称 - 所以你会知道哪个测试是哪个。说 INSTANTIATE_TYPED_TEST_CASE_P( CatTest, AnimalTest , AnimalsTypes ); 并不意味着它与 class CatTest 有任何关系...阅读 gtest-doc.