有一个类,其中有个接口被重载,如下:
想要对addItems进行测试,但不想为每个重载函数写一遍相同的测试用例。
最开始想用TestWithParam,但发现行不通,否决。
因为重载函数的个数基本确定,所以决定使用TYPED_TEST_CASE,如下:
为什么要使用vector<any>呢?如果使用vector<T>,那么在编译时会出错,想像一下T是int的情况,那么因为编译时检查,
class Item {
public:
int addItems(int area,vector<int> value);
int addItems(int area,vector<std::string> value);
int addItems(int area,vector<double> value);
};
public:
int addItems(int area,vector<int> value);
int addItems(int area,vector<std::string> value);
int addItems(int area,vector<double> value);
};
想要对addItems进行测试,但不想为每个重载函数写一遍相同的测试用例。
最开始想用TestWithParam,但发现行不通,否决。
因为重载函数的个数基本确定,所以决定使用TYPED_TEST_CASE,如下:
template<typename T>
class ItemTest: public ::testing::Test{
public:
ItemTest(){
if(typeid(T) == typeid(int)){
_value.push_back(1);
_value.push_back(2);
_value.push_back(3);
}else if(typeid(T) == typeid(string)){
_value.push_back(string("Hello"));
_value.push_back(string("world"));
}
}
std::vector<boost::any> _value;
typedef std::vector<T> List;
};
class ItemTest: public ::testing::Test{
public:
ItemTest(){
if(typeid(T) == typeid(int)){
_value.push_back(1);
_value.push_back(2);
_value.push_back(3);
}else if(typeid(T) == typeid(string)){
_value.push_back(string("Hello"));
_value.push_back(string("world"));
}
}
std::vector<boost::any> _value;
typedef std::vector<T> List;
};
为什么要使用vector<any>呢?如果使用vector<T>,那么在编译时会出错,想像一下T是int的情况,那么因为编译时检查,
else if(typeid(T) == typeid(string)){
_value.push_back(string("Hello"));
_value.push_back(string("world"));
}
_value.push_back(string("Hello"));
_value.push_back(string("world"));
}
这一段代码就编译不过了。
最后,测试用例可以如下编写:
代码
using testing::Types;
typedef ::testing::Types< int, string,double> MyTypes;
TYPED_TEST_CASE(ItemTest, MyTypes);
TYPED_TEST(ItemTest,test01)
{
Item t;
typename TestFixture::List values;
for(int i=0;i<this->_value.size();++i){
values.push_back(any_cast<TypeParam>(this->_value[i]));
}
EXPECT_TRUE(t.addItems(0,values));
}
int main(int argc,char **argv)
{
::testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}
using testing::Types;
typedef ::testing::Types< int, string,double> MyTypes;
TYPED_TEST_CASE(ItemTest, MyTypes);
TYPED_TEST(ItemTest,test01)
{
Item t;
typename TestFixture::List values;
for(int i=0;i<this->_value.size();++i){
values.push_back(any_cast<TypeParam>(this->_value[i]));
}
EXPECT_TRUE(t.addItems(0,values));
}
int main(int argc,char **argv)
{
::testing::InitGoogleTest(&argc,argv);
return RUN_ALL_TESTS();
}