单元测试是一种保证代码质量的手段。程序员可以通过写单元测试来保证自己写的代码的功能正确。

本人所在公司使用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)的更多相关文章

  1. Arcade初探[0] 目录与导航

    2017年6月,ESRI开发者页面出现了一个新玩意儿:Arcade. 连接:点我 这是什么东西呢?有什么用呢? 1. 是什么 Arcade一种表达语言,可以在ArcGIS平台上使用.不管是编写简单的脚 ...

  2. GoogleTest初探(1)

    此篇主要了解一下GoogleTest中的断言. 总的来说,GoogleTest中的断言分为两大类:EXPECT_*和ASSERT_*,这两者在测试成功或失败后均会给出测试报告,区别是前者在测试失败后会 ...

  3. GoogleTest初探(2)

    前面的随笔介绍了Google Test中的基本测试单元TEST和测试夹具TEST_F,此篇介绍区别于这两种测试的参数化测试TEST_P 当待测试方法的行为取决于传入的参数时,而且这些参数的不同组合有多 ...

  4. GoogleMock初探(0)

    在进行测试过程中,待测的类或者方法经常会依赖其他类或方法的实现.如果此时这些依赖还没有实现,则需要打桩.另外测试讲求独立,测试之间的互相依赖会导致测试最终混乱不堪. GoogleMock提供一套方法来 ...

  5. Spring入门(9)-AOP初探

    Spring入门(9)-AOP初探 0. 目录 什么是面向切面编程 AOP常见术语 AOP实例 参考资料 1. 什么是面向切面编程 Aspect Oriented Programming(AOP),即 ...

  6. ZAM 3D 制作简单的3D字幕 流程(二)

    原地址:http://www.cnblogs.com/yk250/p/5663907.html 文中表述仅为本人理解,若有偏差和错误请指正! 接着 ZAM 3D 制作简单的3D字幕 流程(一) .本篇 ...

  7. ZAM 3D 制作3D动画字幕 用于Xaml导出

    原地址-> http://www.cnblogs.com/yk250/p/5662788.html 介绍:对经常使用Blend做动画的人来说,ZAM 3D 也很好上手,专业制作3D素材的XAML ...

  8. 微信小程序省市区选择器对接数据库

    前言,小程序本身是带有地区选着器的(网站:https://mp.weixin.qq.com/debug/wxadoc/dev/component/picker.html),由于自己开发的程序的数据是很 ...

  9. osg编译日志

    1>------ 已启动全部重新生成: 项目: ZERO_CHECK, 配置: Debug x64 ------1> Checking Build System1> CMake do ...

随机推荐

  1. PHP的内存泄露问题与垃圾回收

    你写了一个PHP脚本,一般都不用考虑内存泄露和垃圾回收的问题,因为一般情况下你的脚本很快就执行完退出了. 但在一些运行时间长,数据量大的时候,程序运行一段时间后,php脚本就占用了过多内存,然后就报错 ...

  2. PHP 中提示undefined index如何解决(多种方法)

    PHP 中提示undefined index如何解决(多种方法) 这篇文章主要介绍了PHP 中提示undefined index如何解决(多种方法)的相关资料,需要的朋友可以参考下 一.相关信息 平时 ...

  3. 检查 NaN 数据值 (C/C++/Python 实现)

    NaN 是 Not a Number 的缩写.它是一个数值类型值,通常在浮点计算中,表示未定义或无法表示的值.而且,不能直接使用相等运算符 (==) 检查 NaN.由于在程序中,nan == nan ...

  4. Visual Studio 2017RC 版本相关资料

    Visual Studio 2017 RC版本说明 1.社区版 Visual Studio Community 2017 RC Visual Studio Community 2017 RC 是针对个 ...

  5. 微信 公众号 小程序 授权 unionid 用户信息 实验总结

    -*-*-*-*-*-*-*-*-*--*-*-*-1.小程序通过code获取用户openid的接口,如果用户曾经授权并未过期,或者用户关注过同主体的公众号,会带回unionID,但没有用户头像等信息 ...

  6. Python学习---生成器的学习1210

    在Python中,这种一边循环一边计算的机制,称为生成器: 结论: 生成器本质是一个函数,不同于函数的是它生成的是一个对象,不执行函数内的代码 1.1. 列表生成器 列表生成器: 列表是直接生成数字在 ...

  7. Linux 下shell中exec解析

    exec和source都属于bash内部命令(builtins commands),在bash下输入man exec或man source可以查看所有的内部命令信息.       bash shell ...

  8. Linux下的Mysql的双向同步

    在主从复制的基础上实现双向同步 [更多参考] https://www.cnblogs.com/shuidao/p/3551238.html http://blog.csdn.net/i_bruce/a ...

  9. zabbix监控 linux/windows 主机tcp连接状态

    更新内容:1).增加了对windows主机的tcp连接状态的监控2).修改linux主机的监控配置,使linux与windwos主机能够使用相同的模板tcp的连接状态对于监控服务器,尤其是Web服务器 ...

  10. PHP面试常用算法(推荐)

    一.冒泡排序 基本思想: 对需要排序的数组从后往前(逆序)进行多遍的扫描,当发现相邻的两个数值的次序与排序要求的规则不一致时,就将这两个数值进行交换.这样比较小(大)的数值就将逐渐从后面向前面移动. ...