我正在尝试使用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()调用派生类的相应实例?或者我在这里遗漏了什么?
答案 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。