前面简单的介绍了一下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的基本内容就先介绍到此,后期我会针对一些数据结构做一些单元测试再与大家分享!