gtest 参数化
前言:
在测试用例中,我们时常需要传给被测函数不同的值,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 参数化的更多相关文章
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(转)
转自:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Googl ...
- 玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
原文地址:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Goo ...
- 推荐:一个写的相当好的介绍C++单元测试框架Google Test (gtest) 教程
原文来自:http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 虽然有点晚了,还是一口气读完了全部文章.作者言简意赅和明快的风格 ...
- [转]玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
文章转载自CoderZh的技术博客 地址:https://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Goog ...
- [转]玩转Google开源C++单元测试框架Google Test系列
gtest的官方网站是: http://code.google.com/p/googletest/ 从官方的使用文档里,你几乎可以获得你想要的所有东西 http://code.google.com/p ...
- 转:玩转Google开源C++单元测试框架Google Test系列
转自http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html 前段时间学习和了解了下Google的开源C++单元测试框架Google ...
- 玩转Google开源C++单元测试框架Google Test系列(转载)
越来越多公司采用敏捷开发,单元和回归测试越来越重要,GTest作为最佳C++单元测试工具越来越多的被使用.转自 http://www.cnblogs.com/coderzh/archive/2009/ ...
- Google的开源C++单元测试框架Google Test
玩转Google开源C++单元测试框架Google Test系列(gtest)(总) 前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我 ...
- Gtest:参数化
转自:玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化 一.前言 在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况.我们之前的做法通常是写一个通 ...
随机推荐
- 活代码LINQ——07
来源说明:https://blog.csdn.net/sha574810590/article/details/40738069 在LINQ中,数据源和查询结果实际上都是IEnumerable< ...
- 002dayPython学习编码
由于计算机是美国人发明的,所以计算机最开始只能识别256个字符(ASCII码),而你在计算机中输入中文就会报错 而中国人想让计算机认识中文,就重新编写了一套支持中文的编码(GB2312) 随后由于GB ...
- 基于vue项目的组件中导入mui框架初始化滑动等效果时需移除严格模式的问题
基于vue项目的组件中导入mui框架初始化滑动等效果时,控制台报错:Uncaught TypeError: 'caller', 'callee', and 'arguments' properties ...
- IP通信基础原理课堂笔记----HCL(1)
PC端配置:打开接口,配置ip地址 交换机配置:①创建VLAN system-view vlan 10 vlan 20 ②配置PC端接口 interface gi 1/0/1 port link-ty ...
- linux find命令-print0和xargs中-0使用技巧
文章是转载的,原文很精彩,我对其中个别地方没有快速理解,我在此予以补充,方便后续回顾理解. 本文介绍了linux find命令中-print0和xargs中-0用法技巧,一些find命令的使用经验,需 ...
- 三星S8相机黑画面解决
最近手机刷机卸载系统软件后有遇到相机黑化面不能工作的情况,同时闪光灯也无法开启,人脸识别也无法使用.具体情况如下图. 后来接上电脑打开logcat,发现相机相关的错误,说libquramresize. ...
- session_id() , session_start(), $_SESSION["userId"], header("Location:homeLogin.php"); exit 如果没有登录, 就回登录页
if(!session_id()) session_start(); header("Content-type:text/html;charset=utf-8"); if (emp ...
- Always an Integer 数论和字符串处理
题意:判断一个整系数多项式除以一个常数结果是否一定是一个整数 大白p123例题.可以随机代入一些n的值,判断一下.不过只要代入1到k+1(k为多项式最高项的次数)即可.通过数学归纳法证明,先讨论k为0 ...
- 高分一号计算NDVI
1.准备工作 如果想要ENVI友好一点,请下载ENVI5.3,并且安装China satellites 补丁(参考博客:ENVI扩展工具:中国国产卫星支持工具) App Store for ENVI下 ...
- ios jenkins从0快速配置
1,安装:brew install jenkins2,命令行里:jenkins 回车,第一次会生成密码和保存密码的路径如:/Users/uname/.jenkins/secrets/initialAd ...