转载:https://www.cnblogs.com/jiangyibo/p/9826300.html
前言:
在测试用例中,我们时常需要传给被测函数不同的值,gtest为我们提供了简便的方法,可以使我们能够灵活的进行参数化测试。
步骤:
1.创建一个类,继承testing::TestWithParam
2. 使用新宏TEST_P替代TEST。在TEST_P宏里,可以使用GetParam()获取当前的参数的具体值。
3. 使用INSTANTIATE_TEST_CASE_P宏来输入测试参数。
参数解释和表格直接贴上某个大佬的解释:
第一个参数是测试案例的前缀,可以任意取。
第二个参数是测试案例的名称,需要和之前定义的参数化的类的名称相同。
第三个参数是可以理解为参数生成器,上面的例子使用test::Values表示使用括号内的参数。Google提供了一系列的参数生成的函数:
Range(begin, end[, step]) | 范围在begin~end之间,步长为step,不包括end |
Values(v1, v2, ..., vN) | v1,v2到vN的值 |
ValuesIn(container) and ValuesIn(begin, end) | 从一个C类型的数组或是STL容器,或是迭代器中取值 |
Bool() | 取false 和 true 两个值 |
Combine(g1, g2, ..., gN) | 这个比较强悍,它将g1,g2,...gN进行排列组合,g1,g2,...gN本身是一个参数生成器,每次分别从g1,g2,..gN中各取出一个值,组合成一个元组(Tuple)作为一个参数。 说明:这个功能只在提供了 |
示例:
示例1:最简单的Values()的使用。
#include
#include
using namespace std;
class myTest : public testing::TestWithParam
{
};
TEST_P(myTest, test0)
{
int num = GetParam();
cout << num << endl;
}
INSTANTIATE_TEST_CASE_P(ttt, myTest, testing::Values(1, 2, 3, 4));
int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
编译及结果:
示例2:Combine(g1, g2, ..., gN)的使用
#include
#include
using namespace std;
class funcTest : public testing::TestWithParam< tr1::tuple >
{
protected:
virtual void SetUp()
{
// 如果此时参数是<1, 2>
// 那么 a = 1
// b = 2
a = tr1::get<0>(GetParam());
b = tr1::get<1>(GetParam());
}
virtual void TearDown()
{
}
int a;
int b;
};
int func(int a, int b)
{
return a + b;
}
TEST_P(funcTest, test0)
{
cout << a << " + " << b <<" = " << func(a , b) << endl;
}
/*INSTANTIATE_TEST_CASE_P(MyFuncTest,
funcTest,
Combine(testing::Values(1, 2, 3), testing::Bool()));*/
INSTANTIATE_TEST_CASE_P(MyFuncTest,
funcTest,
testing::Combine(testing::Values(1, 2, 3), testing::Values(1, 2)));
int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
编译及结果:
示例3:传参结构体
#include
#include
using namespace std;
using ::testing::TestWithParam;
using ::testing::Bool;
using ::testing::Values;
struct T
{
int a;
double b;
string c;
};
class MyTest : public TestWithParam
{
protected:
virtual void SetUp()
{
t1.a = GetParam().a;
t1.b = GetParam().b;
t1.c = GetParam().c;
}
virtual void TearDown()
{
}
struct T t1;
};
TEST_P(MyTest, test0)
{
cout << t1.a<< " - " << t1.b << " - " << t1.c << endl;
}
INSTANTIATE_TEST_CASE_P(ttt1, MyTest, Values(T{1, 2.2 ,"cc"}, T{2, 3.3 ,"ee"}));
int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
编译及结果:
总结:
gtest的参数化功能真的是很方便,可以让我们以更少的代码,写出更强大的测试模块。