在搜狗内部对C++项目进行单元测试,基本都是使用gtest进行的。不管是单元测试,还是接口测试我们都做了大量工作。
具体来讲,就是对函数进行单元测试或接口测试,对模块进行集成测试。但是,对模板类并没有进行测试,而是对其上层调用进行测试。
现在的问题是,对模板类需不需要进行单元测试或接口测试?被写成模板类,说明这个类是比较通用且很多地方都在使用它,所以我认为还是有必要进行测试的。
下面就直接进入主题:如何对单参数模板类进行测试?
//不用纠结于代码细节,只为说明
template <typename E>
class Queue
{
public:
Queue() {}
void Enqueue(const E& element) {}
E* Dequeue() {}
size_t size() const
return (size_t)123;
}
};
那末使用gtest该如何对该类进行测试呢?
//主模板类
template <class T>
Queue<T>* CreateQueue();
全特化版本1
template <>
Queue<int>* CreateQueue<int>()
return new Queue<int>;
全特化版本2
Queue<char>* CreateQueue<char>()
return new Queue<char>;
protected:
QueueTest() : queue(CreateQueue<T>())
{}
virtual ~QueueTest()
delete queue;
Queue<T>* const queue;
3定义需要测试的类型
4编写测试用例
TYPED_TEST(QueueTest,DefaultCons)
EXPECT_EQ(123,this->queue->size());
5运行用例,结果以下图
如果使用--gtest_filter进行过滤,则不能写为这样的情势:
--gtest_filter=QueueTest.DefaultCons
--gtest_filter=QueueTest.*
缘由:由于后面带了/n,n表示数字,需写为以下情势:
--gtest_filter=QueueTest*
在前面的例子中,被测试模板类只有1个类型参数,如果是多个类型参数呢,那该如何测试?
如果有两个类型参数
template <class E,class F>
class Que
Que() {}
void Enque(const E& el) {}
E* Deque() {}
F size() const
return (F)123;
大家可以静静的想几分钟,看能不能解决这个问题吧~~
3、如何测试多参数模板类
下面就开始讨论这个主题:如何对多参数模板类进行测试?
将多个参数放在1个结构体里,做成1个模板类,将该模板类作为1个类型。
将多个参数组合成结构体 template <class A,class B>
struct Params
typedef typename A TypeA;
typedef typename B TypeB;
测试框架随之也要改变
class TestX : public testing::Test
TestX() : m_i(CreateIndex<typename T::TypeA,typename T::TypeB())
virtual ~TestX()
delete m_i;
void Setup() {}
void TearDown() {}
// Index为被测试模板类
Index<typename T::TypeA,typename T::TypeB>* const m_i;
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!