GTest --参数化

转载:https://www.cnblogs.com/jiangyibo/p/9826300.html

前言:

  在测试用例中,我们时常需要传给被测函数不同的值,gtest为我们提供了简便的方法,可以使我们能够灵活的进行参数化测试。

  

步骤:

  1.创建一个类,继承testing::TestWithParam<T>,T是你需要参数化的参数类型,比如参数类型为int

  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)作为一个参数。

说明:这个功能只在提供了<tr1/tuple>头的系统中有效。gtest会自动去判断是否支持tr/tuple,如果你的系统确实支持,而gtest判断错误的话,你可以重新定义宏GTEST_HAS_TR1_TUPLE=1

示例:

  示例1:最简单的Values()的使用。


#include <iostream>

#include <gtest/gtest.h>

using namespace std;

class myTest : public testing::TestWithParam<int>
{

};

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 <iostream>
#include <gtest/gtest.h>

using namespace std;

class funcTest : public testing::TestWithParam< tr1::tuple<int , int> >
{
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 <iostream>
#include <gtest/gtest.h>

using namespace std;

using ::testing::TestWithParam;
using ::testing::Bool;
using ::testing::Values;

struct T
{
    int a;
    double b;
    string c;
};

class MyTest : public TestWithParam<struct T>
{
    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的参数化功能真的是很方便,可以让我们以更少的代码,写出更强大的测试模块。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于进行随机测试,你可以使用 Google Test(gtest框架提供的参数化测试功能。参数化测试允许你在测试中使用不同的参数运行多次,从而覆盖更多的测试场景和边界条件。 首先,你需要在测试用例中定义一个参数化测试。你可以使用 `INSTANTIATE_TEST_SUITE_P` 宏来定义一个测试套件,并使用 `Values` 函数来指定不同的参数。例如,假设你要测试一个函数 `int add(int a, int b)`: ```cpp #include <gtest/gtest.h> #include <gmock/gmock.h> int add(int a, int b) { return a + b; } class AddTest : public testing::TestWithParam<std::pair<int, int>> { }; TEST_P(AddTest, TestAdd) { int a = GetParam().first; int b = GetParam().second; EXPECT_EQ(a + b, add(a, b)); } INSTANTIATE_TEST_SUITE_P(Default, AddTest, testing::Values( std::make_pair(1, 2), std::make_pair(5, 5), std::make_pair(-10, 10) )); ``` 在上面的例子中,我们定义了一个 `AddTest` 类来作为参数化测试的测试用例。使用 `TEST_P` 宏来定义测试方法,通过 `GetParam()` 获取当前的参数,并进行断言判断。最后,使用 `INSTANTIATE_TEST_SUITE_P` 宏将测试用例实例化,并通过 `testing::Values` 函数指定不同的参数。 通过以上步骤,你就可以使用 gtest 进行随机测试了。你可以根据需要添加更多的参数组合,以覆盖更多的测试场景。运行测试时,gtest 将会自动为每个参数组合生成一个独立的测试用例,并输出测试结果。 希望这个例子能帮助到你进行随机测试。如果有任何进一步的问题,请随时提问!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值