GoogleTest初探(0)
单元测试是一种保证代码质量的手段。程序员可以通过写单元测试来保证自己写的代码的功能正确。
本人所在公司使用GoogleTest测试框架来进行单元测试。虽然现在在公司的工程代码中写单元测试已经驾轻就熟,但是只是知其然不知其所以然,所以再此对Google Test测试框架进行一个全面的了解与学习。
本文只涉及Google Test的使用,不涉及对其源码的学习与解读。
Linux环境搭建Google Test测试环境
Google Test托管在github上,先通过git把Google Test拉取到本地
git clone https://github.com/google/googletest.git
Google Test 提供了多平台的构建方式,在Linux上推荐使用cmake来编译
cd googletest
cmake .
编译完成之后生成静态库,以后编译自己的单元测试需要链接这些静态库
最后,安装,将头文件和编好的库文件放在系统指定目录下,此步骤需要root权限
make install
安装完成之后,可以尝试编译运行Google Test自带的sample
cd googletest/googletest/make
make
./sample1_unittest
运行结果如图所示:

想要从头开始学些如何使用Google Test,去研究一下googletest/googletest/samples下的所有测试用例和googletest/googletest/doc目录下的指导文档,把这些搞清楚了,也就初步掌握了Google Test了。
基本测试
//myGtest.cpp
#include <gtest/gtest.h> int add(int a, int b) //待测试函数
{
return a + b;
} TEST(TestAdd, normal)//单元测试
{
EXPECT_EQ(, add(, ));
EXPECT_EQ(, add(, ));
} int main(int argc, char **argv)//初始化GoogleTest并运行所有单元测试
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
编译:
g++ myGtest.cpp -lgtest -lpthread -o myGtest
注意不仅要链接libgtest.a还要链接libpthread.a
运行结果:

可以看到测试结果,符合add函数的预期行为。
对于基本测试行为,必须包含以下的要素:
1. 测试文件必须包含头文件 gtest/gtest.h;
2. 单元测试函数使用宏 TEST,没有返回类型,有两个参数:第一个测试是测试用例名,第二个参数是本测试名;
3. 测试内容和逻辑需要你自己编写,GoogleTest提供了一系列的宏(类似于安断言)来判断你的代码是否符合预期结果;
4. 需要有一个main函数来初始化并执行所有测试,这个main函数的写法是固定的(由于其是固定的,也可以不写main函数,Google Test提供了一个写好的main 函数只要在链接时链接libgtest_main.a即可),RUN_ALL_TESTS()来执行所有的测试。返回值为0说明全部测试通过,1则说明有失败的测试。
Test Fixtures
有些地方也翻译作测试夹具,我感觉找不到对其合适的翻译。
就是将有相同的流程或使用相同数据的测试用例聚合起来,共享同一套流程或同一份数据,这套流程或数据会在每个测试用例运行之前和之后执行固定的操作。
待测试类:
//MyClass.hpp
class MyClass
{
public:
int add(int a, int b)
{
return a + b;
} int plus(int a, int b)
{
return a * b;
}
};
测试:
//myGtest.cpp
#include <gtest/gtest.h>
#include <iostream>
#include "MyClass.hpp" class TestMyClass : public testing::Test //test fixture类
{
protected:
void SetUp() override//每个测试运行前调用
{
std::cout<<"test start"<<std::endl;
}
void TearDown() override//每个测试运行后调用
{
std::cout<<"test done"<<std::endl;
}
MyClass mc;
}; TEST_F(TestMyClass, testAdd)//测试用例1
{
EXPECT_EQ(, mc.add(, ));
} TEST_F(TestMyClass, testPlus)//测试用例2
{
EXPECT_EQ(, mc.plus(, ));
} int main(int argc, char **argv)
{
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
运行结果:

可以看到测试结果,符合MyClass类的类方法的预期。并且在测试开始和结束时打印出来我们想要的提示信息
当一个测试执行时会发生以下事件:
1. GTest构造TestMyClass对象(我们称之为t1)。
2. t1.SetUp()函数初始化t1。
3. t1的第一个测试testAdd执行。
4. 在测试执行完后调用t1.TearDown()清理现场。
5. t1被析构。
6. 以上步骤重复一遍,这一轮是执行测试testPlus
使用Test Fixtures可以讲一些流程重复或者数据重用的测试用例聚合起来,更方便编写和维护
对于Test Fixtures而言,具有一下几个要素:
1. 从::testing::Test集成一个类。根据我们希望访问子类的fixture成员的权限,限定为protected或public
2. 在类中,定义任何你想使用的对象
3. 如果需要,实现默认的构造函数或SetUp()函数来为每个测试准备数据
4. 如果需要,实现析构函数和TearDown函数来释放SetUp()函数分配的资源
5. 如果需要,请自定义测试需要共享的函数
6. 使用时,用TEST_F代替TEST(在使用TEST_F前必须先定义好Test Fixtures 类)
7. TEST_F无返回值,有两个参数,第一个是Test Fixtures 类名,第二个是测试名
相关链接:
https://github.com/google/googletest/blob/master/googletest/docs/primer.md
https://www.cnblogs.com/panda_lin/p/gtest_primer.html
GoogleTest初探(0)的更多相关文章
- Arcade初探[0] 目录与导航
2017年6月,ESRI开发者页面出现了一个新玩意儿:Arcade. 连接:点我 这是什么东西呢?有什么用呢? 1. 是什么 Arcade一种表达语言,可以在ArcGIS平台上使用.不管是编写简单的脚 ...
- GoogleTest初探(1)
此篇主要了解一下GoogleTest中的断言. 总的来说,GoogleTest中的断言分为两大类:EXPECT_*和ASSERT_*,这两者在测试成功或失败后均会给出测试报告,区别是前者在测试失败后会 ...
- GoogleTest初探(2)
前面的随笔介绍了Google Test中的基本测试单元TEST和测试夹具TEST_F,此篇介绍区别于这两种测试的参数化测试TEST_P 当待测试方法的行为取决于传入的参数时,而且这些参数的不同组合有多 ...
- GoogleMock初探(0)
在进行测试过程中,待测的类或者方法经常会依赖其他类或方法的实现.如果此时这些依赖还没有实现,则需要打桩.另外测试讲求独立,测试之间的互相依赖会导致测试最终混乱不堪. GoogleMock提供一套方法来 ...
- Spring入门(9)-AOP初探
Spring入门(9)-AOP初探 0. 目录 什么是面向切面编程 AOP常见术语 AOP实例 参考资料 1. 什么是面向切面编程 Aspect Oriented Programming(AOP),即 ...
- ZAM 3D 制作简单的3D字幕 流程(二)
原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...
- ZAM 3D 制作3D动画字幕 用于Xaml导出
原地址-> http://www.cnblogs.com/yk250/p/5662788.html 介绍:对经常使用Blend做动画的人来说,ZAM 3D 也很好上手,专业制作3D素材的XAML ...
- 微信小程序省市区选择器对接数据库
前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...
- osg编译日志
1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...
随机推荐
- PHP的内存泄露问题与垃圾回收
你写了一个PHP脚本,一般都不用考虑内存泄露和垃圾回收的问题,因为一般情况下你的脚本很快就执行完退出了. 但在一些运行时间长,数据量大的时候,程序运行一段时间后,php脚本就占用了过多内存,然后就报错 ...
- PHP 中提示undefined index如何解决(多种方法)
PHP 中提示undefined index如何解决(多种方法) 这篇文章主要介绍了PHP 中提示undefined index如何解决(多种方法)的相关资料,需要的朋友可以参考下 一.相关信息 平时 ...
- 检查 NaN 数据值 (C/C++/Python 实现)
NaN 是 Not a Number 的缩写.它是一个数值类型值,通常在浮点计算中,表示未定义或无法表示的值.而且,不能直接使用相等运算符 (==) 检查 NaN.由于在程序中,nan == nan ...
- Visual Studio 2017RC 版本相关资料
Visual Studio 2017 RC版本说明 1.社区版 Visual Studio Community 2017 RC Visual Studio Community 2017 RC 是针对个 ...
- 微信 公众号 小程序 授权 unionid 用户信息 实验总结
-*-*-*-*-*-*-*-*-*--*-*-*-1.小程序通过code获取用户openid的接口,如果用户曾经授权并未过期,或者用户关注过同主体的公众号,会带回unionID,但没有用户头像等信息 ...
- Python学习---生成器的学习1210
在Python中,这种一边循环一边计算的机制,称为生成器: 结论: 生成器本质是一个函数,不同于函数的是它生成的是一个对象,不执行函数内的代码 1.1. 列表生成器 列表生成器: 列表是直接生成数字在 ...
- Linux 下shell中exec解析
exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息. bash shell ...
- Linux下的Mysql的双向同步
在主从复制的基础上实现双向同步 [更多参考] https://www.cnblogs.com/shuidao/p/3551238.html http://blog.csdn.net/i_bruce/a ...
- zabbix监控 linux/windows 主机tcp连接状态
更新内容:1).增加了对windows主机的tcp连接状态的监控2).修改linux主机的监控配置,使linux与windwos主机能够使用相同的模板tcp的连接状态对于监控服务器,尤其是Web服务器 ...
- PHP面试常用算法(推荐)
一.冒泡排序 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样比较小(大)的数值就将逐渐从后面向前面移动. ...