C++测试利器--google test开源测试框架
资料
偶然发现了google的测试框架gtest,马上试了下,效果挺不错,特别是对于写c++的人来说,方便很多。以前自己写c++的模块,通常是写好了模块后再另外定义些函数,然后在函数里面写测试用例来测试模块,如果测试点比较多,光是定义测试函数都要花费不少时间。gtest相当于大大节省了这个过程,用起来非常简单,直接用宏来定义测试用例,并且有很多丰富的宏来辅助测试,例如断言、预测值、死亡测试等。
废话不多说,先上gtest的一些资料:
gtest的代码托管地址:https://github.com/google/googletest,用git clone下来就可以了。
使用gtest构建测试用例指导:https://github.com/google/googletest/tree/master/googletest
gtest英文文档:https://github.com/google/googletest/blob/master/googletest/docs/Documentation.md
gtest中文博客:玩转Google开源C++单元测试框架Google Test系列,这系列博客对gtest的具体使用讲解的非常详细。
gmock使用文档:https://github.com/google/googletest/blob/master/googlemock/docs/Documentation.md
gmock中文文档:Google Mock启蒙篇
gtest项目中包含了两个框架,一个gtest测试框架,一个是gmock框架。gtest类似于java里面的junit,用来做单元测试的;gmock主要是用来mock待测试模块依赖的一些对象,帮助你在测试中去除不必要的依赖,类似与java的jMock和EasyMock。
好了,接下来直接上例子吧(注:下面的例子都是在linux下编译运行的,如果要在Windows上,需要看看gtest的文档)。
gtest demo
clone下来gtest后,可以在googletest目录中找到make目录:

,make目录中的Makefile是gtest帮我们写好的一个使用gtest测试框架来测试模块的例子。我们只需要把这个文件拷贝到写测试模块代码的目录,再改下面几个地方就可以编译运行测试模块。
GTEST_DIR = .. #设置gtest的项目目录 USER_DIR = ../samples #设置测试代码所在的目录 CPPFLAGS += -isystem $(GTEST_DIR)/include #设置预处理器参数 CXXFLAGS += -g -Wall -Wextra -pthread #设置编译器参数 TESTS = sample1_unittest #设置编译目标 。。。 #下面的目标生成规则改成测试模块的 sample1.o : $(USER_DIR)/sample1.cc $(USER_DIR)/sample1.h $(GTEST_HEADERS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1.cc sample1_unittest.o : $(USER_DIR)/sample1_unittest.cc \ $(USER_DIR)/sample1.h $(GTEST_HEADERS) $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $(USER_DIR)/sample1_unittest.cc sample1_unittest : sample1.o sample1_unittest.o gtest_main.a $(CXX) $(CPPFLAGS) $(CXXFLAGS) -lpthread $^ -o $@
上面都是make脚本的语法,不清楚的可以先Google下。好了,一起准备就绪后,来看看一个简单的例子。首先,先写个要测试的函数:
bool IsEven(int n) {
return (n % ) == ;
}
这是一个判断一个数是否为偶数的函数,是不是非常的简单~~下面我们就来编写一个简单的测试案例:
TEST(IsEvenTest, EqTest)
{
EXPECT_FALSE(IsEven());
EXPECT_TRUE(IsEven());
}
上面可以看到,编写一个测试案例是多么的简单。我们使用了TEST这个宏,它有两个参数,这两个参数的定义是:[TestSuiteName,TestCaseName],我的理解是TestSuiteName是对某个模块总案例名,TestCaseName是这个案例中某个case的名字。
对检查点的检查,我们上面使用到了EXPECT_FLASE和EXPECT_TRUE这两个宏,这两个宏主要分别用来判断函数返回值是否为false和true。Google还包装了一系列EXPECT_* 和ASSERT_*的宏,而EXPECT系列和ASSERT系列的区别是:
1. EXPECT_* 失败时,案例继续往下执行。
2. ASSERT_* 失败时,直接在当前函数中返回,当前函数中ASSERT_*后面的语句将不会执行。
至于其它具体宏的介绍,可以通过上面给出的链接来查看。
好了,一起都准备好了,运行的结果是所有的测试都通过。

如果我们把第一个EXPECT_FALSE改为EXPECT_TRUE的结果呢?答案是测试是失败的,而且会给出具体出错在文件中的哪一行,以及出错的原因。

这是个很简单的使用gtest的例子,虽然简单,但基本涵盖了使用gtest的流程,而且用这些基本的功能就能解决大部分问题了。至于gtes的一些高级功能,需要的时候可以查上面链接中的文档。
gmock demo
编译运行的方式和gtest类似,Makefile文件在googlemock目录中的make目录中,按前面类似的修改这个Makefile文件就行。现在要测试的模块如下:
void func(FooInterface *p)
{
p->DoThis();
}
这个模块依赖于实现了抽象类FooInterface的对象,FooInterface类定义如下:
class FooInterface {
public:
virtual ~FooInterface() {}
virtual void DoThis() = ;
};
现在我们需要mock这个抽象类,gmock通过下面的宏来实现:
class MockFoo : public FooInterface {
public:
MockFoo() {}
MOCK_METHOD0(DoThis, void());
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);
};
MOCK_METHOD*是一个宏,用来mock父类中的虚函数,*表示函数需要接收*个参数。好了,现在有了Mock类,接下来我们开始写测试用例:
class MockFoo : public FooInterface {
public:
MockFoo() {}
MOCK_METHOD0(DoThis, void());
private:
GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);
};
EXPECT_CALL宏表示将会在后面调用foo对象中的DoThis方法,并且调用次数为1。
一切都准备好了,现在直接make编译运行就可以了,运行结果为:

如果我们把最后的delete foo去掉会怎么样?

结果就是gmock会报错提示内存泄露了,但需要注意的是如果在函数func里面里面发生了内存泄露,gmock是检查不出来的。
最后如果我们把Times中预计的DoThis方法运行次数改为2,结果会怎样?

结果这个case运行会失败,预计的次数和实际调用次数不符合。
总结
上面两个demo也只是个简单的示例,它们仅仅展示了gtest和gmock的基本用法,这也是我们在实际测试时经常需要用到的东西,至于一些高级的功能,需要时可以参考官网文档。
C++测试利器--google test开源测试框架的更多相关文章
- 【通信框架】Google的开源通信框架protobuf概述
在阅读的过程中有不论什么问题,欢迎一起交流 邮箱:1494713801@qq.com QQ:1494713801 一.作用 protobuf(Protocol Buffers)是Google内部 ...
- Android开源测试框架学习
近期因工作需要,分析了一些Android的测试框架,在这也分享下整理完的资料. Android测试大致分三大块: 代码层测试 用户操作模拟,功能测试 安装部署及稳定性测试 代码层测试 对于一般java ...
- [转]Android开源测试框架学习
近期因工作需要,分析了一些Android的测试框架,在这也分享下整理完的资料. Android测试大致分三大块: 代码层测试 用户操作模拟,功能测试 安装部署及稳定性测试 代码层测试 对于一般java ...
- 可能是 Python 中最火的第三方开源测试框架 pytest
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- 开源you-get项目爬虫,以及基于python+selenium的自动测试利器
写在前面 爬虫和自动测试,对于python来说是最合适不过也是最擅长的. 开源的项目也很多,例如you-get项目https://github.com/soimort/you-get.盗链和爬虫神器. ...
- Python最火的第三方开源测试框架 ——pytest
一.介绍 本篇文章是介绍的是Python 世界中最火的第三方单元测试框架:pytest.它有如下主要特性: assert 断言失败时输出详细信息(再也不用去记忆 self.assert* 名称了) 自 ...
- Google的开源C++单元测试框架Google Test
玩转Google开源C++单元测试框架Google Test系列(gtest)(总) 前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错. 我 ...
- Nodejs开源项目里怎么样写测试、CI和代码测试覆盖率
测试 目前主流的就bdd和tdd,自己查一下差异 推荐 mocha和tape 另外Jasmine也挺有名,angularjs用它,不过挺麻烦的,还有一个选择是qunit,最初是为jquery测试写的, ...
- 基于Java的四大开源测试工具
摘要:成功的应用程序离不开测试人员和QA团队反复地测试,应用程序在进行最后的部署之前,需要通过测试来确保它的负载管理能力以及在特殊情况下的工作条件和工作加载情况. %R[)vA t]N0 测试是应用程 ...
随机推荐
- html&&css 基础知识笔记
diV有 Class.Style.title.ID 等属性. 1.margin 空出边缘 margin:上 下 左 右(按顺时针顺序,缺少某一方向则对称) 2.border 边框(三要素:像素 形状 ...
- Practice Round China New Grad Test 2014 报告
今天有Google of Greater China Test for New Grads of 2014的练习赛,主要是为了过几天的校园招聘测试做练习用的,帮助熟悉平台,题目嘛,个人觉得除了A题外, ...
- bzoj3551
3551: [ONTAK2010]Peaks加强版 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 877 Solved: 297[Submit][S ...
- Objective-C中的面向对象编程
1.过程式编程实例,画出Shape数组中的图形: // // main.m // hello-obj // // Created by zhouyang on 16/4/4. // Copyright ...
- 315.Count of Smaller Numbers After Self My Submissions Question
You are given an integer array nums and you have to return a new counts array. Thecounts array has t ...
- Mac 安装Eclipse
1.下载 1.1.网址 http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/mar ...
- vue-cli 官方模板webpack-simple的npm run dev 与npm run bulid的一些问题
npm run dev命令后并不会在dist目录下生成build.js文件,开发环境下build.js是在运行内存中的. 在package.json的scripts属性的dev后面加上--port 8 ...
- js架构设计模式——前端MVVM框架设计及实现(二)
前端MVVM框架设计及实现(二) 在前端MVVM框架设计及实现(一)中有一个博友提出一个看法: “html中使用mvvm徒增开发成本” 我想这位朋友要表达的意思应该是HTML定义了大量的语法标记,HT ...
- Pomelo的component组件
pomelo的核心是由一系列松耦合的component组成,同时我们也可以实现我们自己的component来完成一些自己定制的功能.对于我们的聊天应用,我们尝试给其增加一个component,目的是展 ...
- MyBatis动态SQL与模糊查询
sqlxml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC & ...