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.
我正在尝试使用类型参数化的 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.