美文网首页
GoogleTest(参数化)-4

GoogleTest(参数化)-4

作者: 冀望的air | 来源:发表于2021-01-04 09:19 被阅读0次

    之前的都是一个个的去进行测试,比如一个判断是不是素数的函数,我测试就需要这样:

    TEST(IsPrimeTest, HandleTrueReturn)  
    {  
        EXPECT_TRUE(IsPrime(3));  
        EXPECT_TRUE(IsPrime(5));  
        EXPECT_TRUE(IsPrime(11));  
        EXPECT_TRUE(IsPrime(23));  
        EXPECT_TRUE(IsPrime(17));  
    }  
    

    现在我要测试100个,我们是不是要这样写一百行呢,要是还要分成不同的测试案例呢?这就需要我们引入一个参数化。

    参数化

    步骤

    1. 告诉gtest你的参数类型是什么,添加一个类,继承testing::TestWithParam<T>,其中T就是你需要参数化的参数类型,比如上面的找素数例子,需要参数化一个int型的参数。
    class IsPrimeParamTest : public::testing::TestWithParam<int>
    {
    
    };
    
    1. 告诉gtest你拿到参数的值后,具体做些什么样的测试。
      这里要使用一个新的宏:TEST_P,关于这个"P"的含义,Google给出的答案就是可以理解为”parameterized" (参数化)或者 "pattern"(模型)。在TEST_P宏里,使用GetParam()获取当前的参数的具体值。
    TEST_P(IsPrimeParamTest, HandleTrueReturn)
    {
        int n =  GetParam();
        EXPECT_TRUE(IsPrime(n));
    }
    
    1. 告诉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

    相关文章

      网友评论

          本文标题:GoogleTest(参数化)-4

          本文链接:https://www.haomeiwen.com/subject/wsymoktx.html