学习了gtest的一些基础知识后进入了玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化,参数化的测试在平时的应用中应该也比较常见,原博主介绍的例子非常简洁,琢磨着怎样根据自己的需要定制参数,而不是简单的使用基本变量(int之类的),就拿原博主之前用的Foo函数(计算最大公约数的例子)测试举例,如果要参数化测试一组数据该怎么做,学习了一些资料找到的方案:
1. 声明我们定制的参数结构,并定义我们要的测试案例数组;
struct Test_Case
{
int exp; //预测值
int a; //传入参数a
int b; //传入参数b
};
Test_Case inputs[5];
2.此时的inputs[5]是全局变量,可以在定义时便将其初始化,但很多情况要使用循环初始化,因此这里我们采用循环初始化,增加我们自己写的函数 CaseInit()
void CaseInit()
{
//测试(1,4)、(3,6)、(5,8)、(7,10)、(9,12)的最大公约数是否都为1;
for (int i = 0 ; i < 5 ; i++)
{
inputs[i].exp = 1;
inputs[i].a = i * 2 + 1;
inputs[i].b = (i + 2) * 2;
}
}
值得注意的是,此时我们将面临一个问题,就是CaseInit()函数必须在input被使用前被执行以保证input被成功初始化,最简单的方法就是在main函数的第一行便调用CaseInit()。为了一个测试案例修改main函数的写法总是显得有些不妥,不过想想将CaseInit()作为所有测试数据的初始化函数也不错,如果以后发现更好的方法再补充上来吧,继续~
3.我们的初始化测试数据的任务已经完成了,接下来执行两个重要步骤:
3.1 添加类
class MultiTest : public::testing::TestWithParam<Test_Case>
{
};
其中MultiTest是本测试案例的名字,当然可以自己随意取名,但接下来都需要用到这个名字
3.2 初始化测试函数
INSTANTIATE_TEST_CASE_P(demo,MultiTest,::testing::ValuesIn(inputs));
第一个参数是测试案例的前缀,可以任意取。
第二个参数是测试案例的名称,需要和之前定义的参数化的类的名称相同,如此处的MultiTest
第三个参数是可以理解为参数生成器,上面的例子使用test::ValuesIn表示使用inputs数组内的元素。
4.最后一步当然是书写我们的测试case:
TEST_P(MultiTest,test1)
{
const Test_Case& n = GetParam();
EXPECT_EQ(n.exp, Foo(n.a,n.b));
}
至此就大功告成了,结果长这样:
到这里,单个参数化的测试案例就算完整了,如果要写多组参数化的测试怎么办?只在上述方法的基础上再添加Test_P宏是不行,因为一个唯一的名字标示了一个测试案例(上例中的MultiTest),而一个测试案例唯一绑定了一个继承类和数据源(见步骤3中的操作)。因此如果要写多组测试案例的话,需要依次执行上述步骤:创建数据数组,绑定继承类,初始化函数(绑定数据源),实现Test_P函数。同时必须保证新的案例有另一个唯一的名字,当然新的数据数组依然可以放在上例中的CaseInit函数中。
初步理解如此,如有不完善不正确之处还多指教。如果有更好的理解,非常欢迎评论,期待一起共同讨论!
转载需知:本文通过易转载管理转载授权,请在易转载官网(yizhuanzai.com)输入本文授权码:YU6V,查看转载要求并获取转载授权。