如何使用 gtest 测试具有多个模板参数的 C++ 模板 class?
How to test c++ template class with multiple template parameters using gtest?
我想用 gtest 测试模板 class。我读到了 TYPED_TEST
s in gtest manual and looked at the official example (samples\sample6_unittest.cc) 他们提到的。示例中的这个模板只有一个模板参数。
但是,我的代码有两个模板参数,我该如何测试呢?
我有以下代码:
// two element type
template <typename E, typename F>
class QueueNew
{
public:
QueueNew() {}
void Enqueue(const E& element) {}
E* Dequeue() {}
F size() const
{
return (F)123;
}
};
我为此编写了以下测试代码:
template <class E, class F>
QueueNew<E, F>* CreateQueue();
template <>
QueueNew<int, int>* CreateQueue<int, int>()
{
return new QueueNew < int, int > ;
}
template <>
QueueNew<char, char>* CreateQueue<char, char>()
{
return new QueueNew < char, char > ;
}
template <class E, class F>
class QueueTestNew;
template <class E>
class QueueTestNew<E, int> : public testing::Test
{
protected:
QueueTestNew() : queue(CreateQueue<E, int>()){}
virtual ~QueueTestNew(){ delete queue; }
QueueNew<E, int>* const queue;
};
template <class E>
class QueueTestNew<char, E> : public testing::Test
{
protected:
QueueTestNew() : queue(CreateQueue<char, E>()){}
virtual ~QueueTestNew(){ delete queue; }
QueueNew<char, E>* const queue;
};
// The list of types we want to test.
typedef ::testing::Types <char, int> Implementations;
TYPED_TEST_CASE(QueueTestNew, Implementations);
TYPED_TEST(QueueTestNew, DefaultConstructor)
{
EXPECT_EQ(123u, this->queue->size());
}
但是在构建时,出现错误:
error C2976: 'QueueTestNew' : too few template arguments
see declaration of 'QueueTestNew'
...
我认为我的 gtest 测试模板方法是错误的,我该怎么办?
一个技巧是让 gtest 看到一个带有嵌套类型的类型参数。为此,您可以定义一个模板化结构,例如:
template <typename A, typename B>
struct TypeDefinitions
{
typedef typename A MyA;
typedef typename B MyB;
};
您可以将其传递给您的类型测试夹具:
template <class T>
class QueueTestNew : public testing::Test
{
protected:
QueueTestNew() : queue(CreateQueue<typename T::MyA, typename T::MyB>()){}
virtual ~QueueTestNew(){ delete queue; }
QueueNew<typename T::MyA, typename T::MyB>* const queue;
};
// The list of types we want to test.
typedef ::testing::Types <TypeDefinitions<char,char>,
TypeDefinitions<int,int> > Implementations;
TYPED_TEST_CASE(QueueTestNew, Implementations);
TYPED_TEST(QueueTestNew, DefaultConstructor)
{
typename TypeParam::MyA someA; // if you need access to the subtypes in the test itself
EXPECT_EQ(123u, this->queue->size());
}
一个可能也有效且不需要自定义结构的示例是使用 std::tuples
template <class T>
class TestThreeParams : public testing::Test {};
typedef ::testing::Types <std::tuple<float64_t, float32_t, int16>, std::tuple<int64, int8, float32_t> > Implementations;
TYPED_TEST_CASE(TestThreeParams, Implementations);
TYPED_TEST(TestThreeParams, MaximumTest)
{
using A = std::tuple_element<0, decltype(TypeParam())>::type;
using B = std::tuple_element<1, decltype(TypeParam())>::type;
using C = std::tuple_element<2, decltype(TypeParam())>::type;
bool test = (Max<A, B, C>(A(-5), B(2), C(5)) == 5);
EXPECT_TRUE(test);
}
我想用 gtest 测试模板 class。我读到了 TYPED_TEST
s in gtest manual and looked at the official example (samples\sample6_unittest.cc) 他们提到的。示例中的这个模板只有一个模板参数。
但是,我的代码有两个模板参数,我该如何测试呢?
我有以下代码:
// two element type
template <typename E, typename F>
class QueueNew
{
public:
QueueNew() {}
void Enqueue(const E& element) {}
E* Dequeue() {}
F size() const
{
return (F)123;
}
};
我为此编写了以下测试代码:
template <class E, class F>
QueueNew<E, F>* CreateQueue();
template <>
QueueNew<int, int>* CreateQueue<int, int>()
{
return new QueueNew < int, int > ;
}
template <>
QueueNew<char, char>* CreateQueue<char, char>()
{
return new QueueNew < char, char > ;
}
template <class E, class F>
class QueueTestNew;
template <class E>
class QueueTestNew<E, int> : public testing::Test
{
protected:
QueueTestNew() : queue(CreateQueue<E, int>()){}
virtual ~QueueTestNew(){ delete queue; }
QueueNew<E, int>* const queue;
};
template <class E>
class QueueTestNew<char, E> : public testing::Test
{
protected:
QueueTestNew() : queue(CreateQueue<char, E>()){}
virtual ~QueueTestNew(){ delete queue; }
QueueNew<char, E>* const queue;
};
// The list of types we want to test.
typedef ::testing::Types <char, int> Implementations;
TYPED_TEST_CASE(QueueTestNew, Implementations);
TYPED_TEST(QueueTestNew, DefaultConstructor)
{
EXPECT_EQ(123u, this->queue->size());
}
但是在构建时,出现错误:
error C2976: 'QueueTestNew' : too few template arguments
see declaration of 'QueueTestNew'
...
我认为我的 gtest 测试模板方法是错误的,我该怎么办?
一个技巧是让 gtest 看到一个带有嵌套类型的类型参数。为此,您可以定义一个模板化结构,例如:
template <typename A, typename B>
struct TypeDefinitions
{
typedef typename A MyA;
typedef typename B MyB;
};
您可以将其传递给您的类型测试夹具:
template <class T>
class QueueTestNew : public testing::Test
{
protected:
QueueTestNew() : queue(CreateQueue<typename T::MyA, typename T::MyB>()){}
virtual ~QueueTestNew(){ delete queue; }
QueueNew<typename T::MyA, typename T::MyB>* const queue;
};
// The list of types we want to test.
typedef ::testing::Types <TypeDefinitions<char,char>,
TypeDefinitions<int,int> > Implementations;
TYPED_TEST_CASE(QueueTestNew, Implementations);
TYPED_TEST(QueueTestNew, DefaultConstructor)
{
typename TypeParam::MyA someA; // if you need access to the subtypes in the test itself
EXPECT_EQ(123u, this->queue->size());
}
一个可能也有效且不需要自定义结构的示例是使用 std::tuples
template <class T>
class TestThreeParams : public testing::Test {};
typedef ::testing::Types <std::tuple<float64_t, float32_t, int16>, std::tuple<int64, int8, float32_t> > Implementations;
TYPED_TEST_CASE(TestThreeParams, Implementations);
TYPED_TEST(TestThreeParams, MaximumTest)
{
using A = std::tuple_element<0, decltype(TypeParam())>::type;
using B = std::tuple_element<1, decltype(TypeParam())>::type;
using C = std::tuple_element<2, decltype(TypeParam())>::type;
bool test = (Max<A, B, C>(A(-5), B(2), C(5)) == 5);
EXPECT_TRUE(test);
}