gtest之断言宏的使用以及三种事件机制
前面简单的介绍了一下gtest以及在Windows下如何安装gtest,今天再介绍一下在Linux下该如何安装。
本文重点:
- 在Linux下如何安装gtest;
- gtest下断言宏的介绍;
- gtest中的三种事件机制;
- gtest系列之死亡测试。
1.在Linux下如何安装gtest
首先我们需要下载一个软件包:这里给出链接地址https://codeload.github.com/google/googletest/zip/release-1.8.0
可以先在Windows下载下来移入Linux中,也可以直接用wget+链接地址 进行下载,以下就是安装步骤:
# 将googletest-release-1.8.0.zip放到 ~/install/目录下
mkdir ~/install
cp ~/googletest-release-1.8.0.zip ~/install/
# 解压源码
unzip googletest-release-1.8.0.zip
# 进入源码目录
cd googletest-release-1.8.0
# 创建并进入目录build(这一步是为了让编译生成的文件都被归类到 build 目录中)
mkdir ~/install/googletest-release-1.8.0/build
cd ~/install/googletest-release-1.8.0/build
# 编译. 如果未安装 cmake, 需要root权限下yum install cmake
cmake ..
make
# 我们再建立一个目录, 将我们需要的头文件和库文件拷贝到这个目录下. 后续其他需要用到 gtest 的项目均可以从此处引用
# 一共拷贝 一个include目录 和 两个 lib 文件.
mkdir -p ~/third_part/include
mkdir -p ~/third_part/lib
cp -a ~/install/googletest-release-1.8.0/googletest/include/* ~/third_part/include/
cp -a ~/install/googletest-release-1.8.0/build/googlemock/gtest/libgtest.a ~/third_part/lib/
cp -a ~/install/googletest-release-1.8.0/build/googlemock/gtest/libgtest_main.a ~/third_part/lib/
以上安装步骤仅供参考,因为每个人的环境目录不同,可以做以适当的更改。
环境搭建好后就可以在工程中使用了!!!
先做一个简单的测试:
main.cc
可能大家注意到了,怎么连主函数都没有,不要着急,在gtest下可以不用写主函数的,但是在Makefile里就必须引入-lgtest_main
当然你写上主函数,不用框架里自带的也是可以的嘛,至于主函数里该如何写后面会介绍到的。
这里需要强调的是:如果你在自己用户目录下搭建的这个环境,但是最后是在root目录下及逆行的编译,你千万需要注意路径问题,这时~表示当前主工作目录,可能就找不到gtest/gtest.h,你可以在Makefile里把~/third_part改成绝对路径就ok了,可能在这里说你体会不到,如果出现了这种问题你大概直到该怎么解决了吧!
2.下面我们先介绍gtest下一系列的断言宏
ASSERT_系列: 如果检测失败, 退出当前测试.
EXPECT_系列: 如果检测失败, 继续往下跑.
通过 operator<< 能够在失败时打印需要的日志,方便你定位错误。
(1)布尔值的检查
(2)数值型数据检查
相信如果学过shell脚本都明白ASSERT_EQ中EQ表示判等,EQ就是equal的缩写,同理,NE(不等),LT(小于),LE(小于等于),GT(大于),GE(大于等于)。
(3)字符串检查
还有一些浮点检查,异常检查等不太常用,所以在这就不在赘述。
下面是针对数值型数据类型和布尔类型做一个简单的小测试:
在TEST里面加上ASSERT_TRUE(Add(1,2)==3); ASSERT_FALSE(Add(0,1)!=2)<<"Add(0,1)=1",会出现以下情况:
3.gtest中的三种事件机制
这里说的 "事件" 本质是框架给你提供了一个机会, 让你能在这样的几个机会情况下来执行你自定制的代码, 来给测试用例准备/清理数据。这样的 "机会" 有三组:
(1)每个test的开始/结束(TestSuite事件 );
<1>写一个类,继承testing::Test;
<2>实现两个静态方法:SetUpTestCase方法在第一个TestCase之前执行,TearDownTestCase方法在最后一个TestCase之 后执行。
(2)每个test_case的开始/结束(TestCase事件 );
是挂在每个案例执行前后的,需要实现的是SetUp方法和TearDown方法。SetUp方法在每个TestCase之前执行;TearDown 方法在每个TestCase之后执行。
对它的使用,这里以测试map为例:
#include<iostream>
using namespace std;
#include<gtest/gtest.h>
#include<map>
class TestMap:public testing::Test
{
public:void SetUp(){test_map.insert(make_pair(1,1));test_map.insert(make_pair(2,1));test_map.insert(make_pair(3,1));test_map.insert(make_pair(4,1));test_map.insert(make_pair(5,1));test_map.insert(make_pair(6,1));}void TearDown(){test_map.clear(); }std::map<int,int> test_map;
};
TEST_F(TestMap,FindTest)
{std::map<int,int>::iterator it1=test_map.find(5);ASSERT_NE(it1,test_map.end());std::map<int,int>::iterator it2=test_map.find(7);ASSERT_EQ(it2,test_map.end());
}
int main(int argc,char* argv[])
{testing::InitGoogleTest(&argc,argv);return RUN_ALL_TESTS();
}
其中值得注意的是在测试的时候我们不再是使用TEST,而是TEST_F,而且它的第一个参数必须与类名一致, TEST_F (test fixture)测试夹具,承担了一个注册的功能。这里可以和下面的全局的进行一个对比,此处用TEST_F相当于注册在了这个单元测试框架下,让框架知道有这个类的存在,但是下面的全局事件中是需要自己调用testing::GlobalTestEnvironment( )来进行注册的。
(3)全局的开始/结束
<1>要实现全局事件,必须写一个类,继承testing::Environment类,实现里面的SetUp和TearDown方法。SetUp方法在所有 案例执行前执行;TearDown方法在所有案例执行后执行。
<2>还需要定义一个该全局环境的一个对象并将该对象添加到全局环境测试中去,让框架知道有这个类的存在。
如下图,继承的testing::Environment,实际上对父类的SetUp( ),TearDown( )进行了一个虚函数的重写,这里子类可加virtual也可不加。
4.死亡测试
死亡测试是指验证程序在非法输入的情况下是否会符合预期的挂掉,仍然是使用 TEST 宏。
ASSERT_DEATH(statement, regex);
EXPECT_DEATH(statement, regex);
程序挂了, 且错误信息(stderr的输出)和 regex 匹配, 认为测试通过. 如果regex参数为空字符串, 则只看程序挂没挂就可以了.
TestCaseName应该使用 "DeathTest" 作为后缀,这样 gtest识别到会优先执行。
关于gtest的基本内容就先介绍到此,后期我会针对一些数据结构做一些单元测试再与大家分享!
gtest之断言宏的使用以及三种事件机制相关推荐
- JDK/Dubbo/Spring 三种 SPI 机制,谁更好?
点击关注公众号,Java干货及时送达 来源:juejin.cn/post/6950266942875779108 SPI 全称为 Service Provider Interface,是一种服务发现机 ...
- java同步异步调用_详解java 三种调用机制(同步、回调、异步)
1:同步调用:一种阻塞式调用,调用方要等待对方执行完毕才返回,jsPwwCe它是一种单向调用 2:回调:一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口: 3:异步调用:一种类似消 ...
- JDK/Dubbo/Spring 三种 SPI 机制,谁更好呢?
JDK/Dubbo/Spring 三种 SPI 机制,谁更好? SPI 全称为 Service Provider Interface,是一种服务发现机制.SPI 的本质是将接口实现类的全限定名配置在文 ...
- flink 三种时间机制_Flink1.10入门:时间机制简介
一.概述 上篇文章介绍了Window窗口机制的相关知识,这里我们介绍下Flink的另外一个核心概念"Event Time机制",本篇文章只介绍相关概念不讲实战,实战会结合Windo ...
- Yarn的三种资源调度机制
在企业中并不是只有一个人来执行MapReduce程序单独使用Yarn的资源,实际开发中,会有很多人一起使用Yarn这个资源,如果每个人都提交了job,这个时候Yarn就需要进行调度去分配资源给job, ...
- angular移除事件绑定事件绑定_002-js的三种事件绑定方式
不说太多虚的,这次要聊的,是JavaScript的三种事件绑定方式. 方法1:直接在HTML中指定,称为"内嵌"会不会更合适一点? (1)直接在HTML的属性里写代码 示例代码: ...
- 一文读懂三种并发控制机制(封锁、时间戳、有效性确认,大量例子+证明)
文章目录 并发控制 概述 事务特性 定义 并发控制机制 串行调度和可串行调度 调度 串行调度 可串行化调度 事务和调度的记法 冲突可串行化 冲突 优先图 证明 使用锁的可串行化实现 锁 封锁调度器 两 ...
- 【Java】三种等待机制
[AT]三种等待机制 一. 等待机制种类 二. 三种等待机制应用场景 三.显示等待介绍 3.1 相关概念 3.2 显示等待用到的两个类 3.2.1 WebDriverWait 3.2.2 Expect ...
- Spring学习之Spring三种装配机制:(一)自动化装配bean
装配:创建应用组件(对象)之间的协作的行为,这也是Spring依赖注入(DI)的本质. Spring提供了三种装配机制: 隐式的自动装配bean: 通过java代码装配bean(显示): 通XML中装 ...
最新文章
- 一份平民化的应用性能优化检查列表(完整篇)--转
- Hihocoer 1336 - Matrix Sum 二维树状数组
- Netty工作笔记0061---Netty心跳处理器编写
- QT编程-----------------窗口部件的使用(QWidget和QDialog)
- Wide Deep 模型详解
- 【目标检测】YOLOv2 ,对YOLOv1的多种改进
- 免费好用的内网穿透 端口映射工具 实现一键远程 外网访问内网
- MySQL数据库字段级权限设计
- 项目经理价值的最终体现
- 初学者应该选择什么样吉他桶型?新手入门畅销民谣吉他牌子推荐
- Key Reinstallation Attacks: Forcing Nonce Reuse in WPA2
- 树莓派开发实战项目 智能家居--简单工厂模式(摄像头图片获取)
- 写论文有哪些神网站?
- da2 Android版本固件,OPPOAce2官方系统刷机包(完整固件最新升级包ColorOS 7)
- 使用4G模块实现IOT_Python库中,如何使用jieba模块来实现古典名著《西游记》的分词...
- 文章阅读总结:GPT
- 常见的图像文件格式又有哪些呢?
- angular.js-服务-http-路由(5)
- 金融机构服务小微企业机制创新探究
- .net 实现三种验证码(汉字验证码,数字验证码,数字+英文验证)附带登陆验证实例