之前的都是一个个的去进行测试,比如一个判断是不是素数的函数,我测试就需要这样:
TEST(IsPrimeTest, HandleTrueReturn)
{
EXPECT_TRUE(IsPrime(3));
EXPECT_TRUE(IsPrime(5));
EXPECT_TRUE(IsPrime(11));
EXPECT_TRUE(IsPrime(23));
EXPECT_TRUE(IsPrime(17));
}
现在我要测试100个,我们是不是要这样写一百行呢,要是还要分成不同的测试案例呢?这就需要我们引入一个参数化。
参数化
步骤
- 告诉gtest你的参数类型是什么,添加一个类,继承testing::TestWithParam<T>,其中T就是你需要参数化的参数类型,比如上面的找素数例子,需要参数化一个int型的参数。
class IsPrimeParamTest : public::testing::TestWithParam<int>
{
};
- 告诉gtest你拿到参数的值后,具体做些什么样的测试。
这里要使用一个新的宏:TEST_P,关于这个"P"的含义,Google给出的答案就是可以理解为”parameterized" (参数化)或者 "pattern"(模型)。在TEST_P宏里,使用GetParam()获取当前的参数的具体值。
TEST_P(IsPrimeParamTest, HandleTrueReturn)
{
int n = GetParam();
EXPECT_TRUE(IsPrime(n));
}
- 告诉gtest你想要测试的参数范围是什么
使用INSTANTIATE_TEST_CASE_P这宏来告诉gtest你要测试的参数范围:
INSTANTIATE_TEST_CASE_P(TrueReturn, IsPrimeParamTest, testing::Values(3, 5, 11, 23, 17));
第一个参数是测试案例的前缀,可以任意取。
第二个参数是测试案例的名称,需要和之前定义的参数化的类的名称相同,如:IsPrimeParamTest
第三个参数是可以理解为参数生成器,上面的例子使用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)作为一个参数。 |
注:Combine只在提供了<tr1/tuple>头的系统中有效。gtest会自动去判断是否支持tr/tuple,如果你的系统确实支持,而gtest判断错误的话,你可以重新定义宏GTEST_HAS_TR1_TUPLE=1。
~ 更多函数实际引用例子:参数例子 ~
参数化后的测试案例名
命名规则大概为:
prefix/test_case_name.test.name/index
前缀/测试案例的名称/索引
文章参考:https://www.cnblogs.com/coderzh/archive/2009/04/08/1431297.html