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)之四 - 参数化 一.前言 在设计测试案例时,经常需要考虑给被测函数传入不同的值的情况.我们之前的做法通常是写一个通 ...
 
随机推荐
- Python3 open函数
			
Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 OSError. 注意:使用 open() 方法一定要保证关闭 ...
 - java基础2(二)
			
Servlet 注意: servletConfig可以获取配置文件(xml文件)中配置的servlet对象的初始化参数. url-pattern 缺省servlet 注意:tomcat目录下有一个默认 ...
 - 转载: http状态码
			
消息 这一类型的状态码,代表请求已被接受,需要继续处理.这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束.由于 HTTP/1.0 协议中没有定义任何 1xx 状态码,所以除非在 ...
 - erlang二进制
			
在Erlang中写处理二进制数据的代码是洋溢着幸福感的,它对于二进制强大的表现力甚至能让你忘掉了它种种不便,今天我们说说Erlang的二进制数据处理. Erlang中bit string代表无类型的内 ...
 - HYPERSPACE
			
Windows中,不管是应用程序还是内核程序,都不能直接访问物理内存,所有非IO指令都只能访问虚拟内存地址,如Mov eax, DWORD PTR[虚拟地址]形式,但是,有时候,我们明明已经知道了某个 ...
 - python笔记25-sys模块
			
import sys#sys.argv命令行参数List,第一个元素是程序本身路径# sys.exit('xxxxx')#退出程序,正常退出时exit(0)# print(sys.version) # ...
 - 【SoftwareTesting】Lab 2
			
一. 在火狐浏览器上安装selenium插件 点击“开发者”的选项,然后点击“获取更多工具”,输入seleniumIDE进行搜索,找到后进行安装即可.安装完成后火狐浏览器的右上角会多出一个小的带 ...
 - Problem 5: Smallest multiple
			
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any rema ...
 - Nim函数调用的几种形式
			
Nim函数调用的几种形式 Nim 转载条件:如果你需要转载本文,你需要做到完整转载本文所有的内容,不得删改文内的作者名字与链接.否则拒绝转载. 关于nim的例行介绍: Nim 是一门静态编译型的系统级 ...
 - jQuery常用 遍历函数
			
jQuery 遍历函数包括了用于筛选.查找和串联元素的方法.本文主要介绍日常工作中常用的JQ遍历,帮助一下初学者快速的接触遍历函数,提高自己的代码编写速度,写出更简洁更实用的代码,祝前端的同学们,在前 ...