前言:

  在测试用例中,我们时常需要传给被测函数不同的值,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()的使用。

 /***********************************************

     Filename       : test3.cpp
Author :
Description :
Create Data : 2018-10-21 03:15:54
Modfiy History : 2018-10-21 03:15:54 ***********************************************/ #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(, , , )); int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();
}

  编译及结果:

  示例2:Combine(g1, g2, ..., gN)的使用

 /***********************************************

     Filename       : test1.cpp
Author :
Description :
Create Data : 2018-10-21 02:40:25
Modfiy History : 2018-10-21 02:40:25 ***********************************************/ #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<>(GetParam());
b = tr1::get<>(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(, , ), testing::Values(, ))); int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();
}

  编译及结果:

  示例3:传参结构体

 /***********************************************

     Filename       : test2.cpp
Author :
Description :
Create Data : 2018-10-21 02:54:46
Modfiy History : 2018-10-21 02:54:46 ***********************************************/ #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{, 2.2 ,"cc"}, T{, 3.3 ,"ee"})); int main(int argc, char *argv[])
{
testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS();
}

  编译及结果:

总结:

  gtest的参数化功能真的是很方便,可以让我们以更少的代码,写出更强大的测试模块。

gtest 参数化的更多相关文章

  1. 玩转Google开源C++单元测试框架Google Test系列(gtest)(转)

    转自:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Googl ...

  2. 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)

    原文地址:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Goo ...

  3. 推荐:一个写的相当好的介绍C++单元测试框架Google Test (gtest) 教程

    原文来自:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 虽然有点晚了,还是一口气读完了全部文章.作者言简意赅和明快的风格 ...

  4. [转]玩转Google开源C++单元测试框架Google Test系列(gtest)(总)

    文章转载自CoderZh的技术博客 地址:https://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Goog ...

  5. [转]玩转Google开源C++单元测试框架Google Test系列

    gtest的官方网站是: http://code.google.com/p/googletest/ 从官方的使用文档里,你几乎可以获得你想要的所有东西 http://code.google.com/p ...

  6. 转:玩转Google开源C++单元测试框架Google Test系列

    转自http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Google ...

  7. 玩转Google开源C++单元测试框架Google Test系列(转载)

    越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/ ...

  8. Google的开源C++单元测试框架Google Test

    玩转Google开源C++单元测试框架Google Test系列(gtest)(总) 前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我 ...

  9. Gtest:参数化

    转自:玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化 一.前言 在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况.我们之前的做法通常是写一个通 ...

随机推荐

  1. ubuntu14/16 安装python3-opencv3_百度经验

    http://jingyan.baidu.com/article/e4511cf348dac52b845eafc8.html

  2. 为什么Vuex内数据改变了而组件没有进行更新?

    这两天在进行一个首页的制作,结果就碰到了标题上所述的问题了,用了一天的时间在网上查资料.终于找出了问题所在 Vuex的数据写在store里,在组件中需要用到this.$store.commit() 来 ...

  3. 理解UDP协议的首部校验和校验和

    reference: https://blog.csdn.net/qiuchangyong/article/details/79945630 https://seanwangjs.github.io/ ...

  4. [转]MYSQL 创建存储过程

    MySQL 存储过程是从 MySQL 5.0 开始增加的新功能.存储过程的优点有一箩筐.不过最主要的还是执行效率和SQL 代码封装.特别是 SQL 代码封装功能,如果没有存储过程,在外部程序访问数据库 ...

  5. ecplise多个版本tomcat的使用

    在ecplise中修改配置文件,或者直接在server.xml中修改,将tomcat三个端口号修改为与另一个tomcat不同即可.

  6. SQLServer数据库

    分离数据库:右键数据库→任务→分离数据库→确定 附加数据库:数据库右键→任务→附加→选择要附加的dlf文件→附加 导出SQL脚本步骤:右键数据库→任务→生成脚本→高级→要编写脚本的数据的类型→架构和数 ...

  7. phpstorm本地破解激活

    下载对应文件:http://idea.lanyus.com/自己用的破解补丁无需使用注册码) 找到phpstorm 的安装路径, 在\bin目录下有两个文件 PhpStorm.exe.vmoption ...

  8. 关于Grid Layout

    .wrapper {     display: grid;/*产生一个块级的网格*/     grid-template-columns: repeat(3, 1fr);/*利用空格分隔的值定义网格的 ...

  9. 如何开发NPM包

    创建包目录 D:\>mkdir mypackage && cd mypackage D:\mypackage>npm init --yes 进入mypackage目录,你会 ...

  10. 不使用Visual Studio开发ASP.NET MVC应用(下篇)

    书接上回! 前文“纯手工”.彻底抛弃Visual Studio,制作了一个ASP.NET MVC应用,运行起来还不错,项目目录.源代码.web.config等所有东西都已经做到“最简”,除去了Visu ...