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 ...
随机推荐
- vim常用快捷汇总
移动光标的方法 h 或 向左箭头键(←) 光标向左移动一个字符 j 或 向下箭头键(↓) 光标向下移动一个字符 k 或 向上箭头键(↑) 光标向上移动一个字符 l 或 向右箭头键(→) 光标向右移动一 ...
- spring boot(8)-mybatis三种动态sql
脚本sql XML配置方式的动态SQL我就不讲了,有兴趣可以自己了解,下面是用<script>的方式把它照搬过来,用注解来实现.适用于xml配置转换到注解配置 @Select(" ...
- pmp证书
- [翻译] DXPopover
DXPopover A Popover mimic Facebook app popover using UIKit. 使用UIKit框架写了一个类似于Facebook的pop效果的动画. The c ...
- 修改UIView的backedlayer为CAShapeLayer
修改UIView的backedlayer为CAShapeLayer 什么叫backedlayer呢?backedlayer指的是一个View在创建好的时候就已经帮你创建好了一个与View大小一致的CA ...
- 用ISA2006配置单网卡缓存服务器
有些公司在部署ISA服务器之前已经有了自己的网络访问解决方案,例如通过硬件防火墙访问互联网,如果这种网络访问解决方案运行效果较好,公司就未必希望用ISA来替代当前的方案,毕竟稳定是第一位的.但在这种情 ...
- python 实现插入排序、冒泡排序、归并排序
def InsertSort(A): '''插入排序算法:传入一个list,对list中的数字进行排序''' print('插入排序前list元素顺序:',A) length=len(A) for i ...
- 深入浅出SharePoint2013——常用术语
CAS(Code Access Security)自定义代码访问安全性 Sandboxed solution 沙箱解决方案
- 关于$.fn.scrollPath is not a function
关于$.fn.scrollPath is not a function 在做项目过程中,用到了一个jQuery的滚动路径插件——jQuery Scroll Path.引入相关的js文件后,但是控制台一 ...
- [CQOI2017]小Q的表格
题目 神仙题,神仙题 这是一道很适合盯着发呆的题目 看到这个规律 \[ f(a,b)=f(b,a) \] \[ b\times f(a,a+b)=(a+b)\times f(a,b) \] 这也没什么 ...