gtest代码库浅析
代码库工程概述
IDE:Visual Studio 2010
sln路径:gtest\msvc\gtest.sln
用IDE打开上面的sln,可以看到以下四个工程,算不上复杂。展开之后更是感觉这几个工程出奇地简单。
gtest工程
- 工程类型:静态链接库
- 要点:整个gtest代码库的文件数目较多,gtest采用了一种特殊的方式,把所有代码文件的引用都整合到了gtest-all.cc这一个文件里面,以下是代码片段:
// This line ensures that gtest.h can be compiled on its own, even
// when it's fused.
#include "gtest/gtest.h" // The following lines pull in the real gtest *.cc files.
#include "src/gtest.cc"
#include "src/gtest-death-test.cc"
#include "src/gtest-filepath.cc"
#include "src/gtest-port.cc"
#include "src/gtest-printers.cc"
#include "src/gtest-test-part.cc"
#include "src/gtest-typed-test.cc"
这种做法大大降低了引入gtest的操作成本。比如说要在一个工程中引入gtest,那我只需要显式地把gtest-all.cc加入到工程中,基本就达到目的了,这个过程我既不需要关心gtest里面各种文件是干什么的,也不需要关注哪些文件需要参与编译。详情可参考我写的另外一片文章《使用Visual Studio创建gtest工程》(链接:http://www.cnblogs.com/duxiuxing/p/4272343.html)。
gtest_main工程
- 工程类型:静态链接库
- 要点:gtest_main.cc里面是一个完整的main()函数。如果连写main()函数这一步都能省掉的话,基于gtest来建立测试工程的操作成本应该说是降低到了某一种极致的程度。 以下是gtest_main.cc的代码:
#include <stdio.h> #include "gtest/gtest.h" GTEST_API_ int main(int argc, char **argv) {
printf("Running main() from gtest_main.cc\n");
testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
gtest_prod_test
- 工程类型:命令行程序
- 要点:这个是一个测试工程,被测试代码是一个叫做PrivateCode的类,工程演示的是如何使用gtest的FRIEND_TEST宏,在测试代码里面访问PrivateCode的private成员。整个工程包含以下要点:
- 静态链接了gtest_main,所以连main()函数都不用写了;
- 在这个工程中,单元测试是直接面向代码的,而不是面向被测试代码所编译出来的模块,测试代码和被测试代码是放在一个同工程里面进行编译的。
对于要点2,我们需要从以下两方面理解:
- 对于那些高内聚,低耦合的模块来说,这种思路则相当有重要。很多情况下,这类模块对外暴露的接口数量相当有限,如果仅针对这些接口来编写测试代码,效果不一定好,反倒是模块内部那些不曾对外暴露代码,更有被测试的价值。
- 如果被测试代码是地位如MFC这样的基础库,是不是这样做可能就关系不大了,因为对于一个基础库来说,绝大部分的代码往往在模块外也能访问得到。
gtest_unittest
- 工程类型:命令行程序
- 要点:用gtest测试gtest,我们可以把gtest_unittest.cc里面的代码当作今后自己写测试代码时候的首选范例。 其实除了这个文件之外,在以下两个文件夹下还能找到大量可以作为范例的测试代码:
- gtest\samples
- gtest\test
系列文章索引:http://www.cnblogs.com/duxiuxing/p/4270836.html
gtest代码库浅析的更多相关文章
- iOS流行的开源代码库
本文介绍一些流行的iOS的开源代码库 1.AFNetworking 更新频率高的轻量级的第三方网络库,基于NSURL和NSOperation,支持iOS和OSX.https://github.com/ ...
- 打造smali代码库辅助分析
打造smali代码库辅助分析 在分析Android应用程序的时候,我们往往会插入代码重打包apk来辅助我们分析的工作 一个比较取巧的方法就是先用java写好代码以及相关的调用之后, 然后直接扣出代码 ...
- Overview of the Oppia codebase(Oppia代码库总览)
Oppia is built with Google App Engine. Its backend is written in Python, and its frontend is written ...
- 我的github代码库
我的github代码库地址:https://github.com/gooree.Enjoy coding,enjoy sharing.
- 使用GitHub for Windows客户端管理京东代码库项目
1.下载并安装 GitHub for Windows 客户端 https://windows.github.com/ 2.在京东代码库中新的代码库,可以创建私有的代码库 https://code.jd ...
- git代码库误操作还原记录
先做一些前情提要: 我们项目使用git作为代码管理,同时为了操作更方便,安装了乌龟git(tortoiseGit)工具.以下几乎所有操作都是在乌龟git上进行. 我们的项目是分阶段完成的,在完成上一阶 ...
- 15分钟学会使用Git和远程代码库
git是个了不起但却复杂的源代码管理系统.它能支持复杂的任务,却因此经常被认为太过复杂而不适用于简单的日常工作.让我们诚实一记吧:Git是复杂的,我们不要装作它不是.但我仍然会试图教会你用(我的)基本 ...
- linux下搭建svn代码库
1.安装svn客户端 2.创建svn代码库 1.安装svn客户端 1.1.使用命令安装 1)CentOS $ yum install subversion 2)ubuntu sudo apt-get ...
- 针对远程Git代码库使用SSH公匙
→ 运行Git Bash→ 创建SSH公匙和私匙ssh-keygen -t rsa→ 输入SSH公匙存放文件,选择使用默认的,按Enter→ 如果已经存在,提示是否重写,输入n,按Enter→ 打开C ...
随机推荐
- MVC模式实现登录以及增删改查之登录(一)
我在这里用的不是maven项目,用的一般的web项目,所以需要用到的架包需要自己去下载添加,在项目中,一定注意环境的配置,我用的是jre1.7 1 新建项目 2 建立好MVC的管理包,导入对应的架 ...
- 解决下载android sdk慢的问题
修改host文件 203.208.46.146 dl.google.com 203.208.46.146 dl-ssl.google.com 强制不使用https访问 在sdk manager里选择t ...
- Html----常见标签
文本格式化标签 标签 描述 <b> 定义粗体文本. <big> 定义大号字. <em> 定义着重文字. <i> 定义斜体字. <small> ...
- NYOJ128前缀式计算
前缀式计算 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 先说明一下什么是中缀式: 如2+(3+4)*5这种我们最常见的式子就是中缀式. 而把中缀式按运算顺序加上括 ...
- Python中的map()函数和reduce()函数的用法
Python中的map()函数和reduce()函数的用法 这篇文章主要介绍了Python中的map()函数和reduce()函数的用法,代码基于Python2.x版本,需要的朋友可以参考下 Py ...
- Vijos P1325桐桐的糖果计划(有向图双连通分量)
/*重边不能删 不能删 不能删...*/ #include<iostream> #include<cstdio> #include<cstring> #define ...
- 关于User Defined Runtime Attributes的小技巧
在用XIB里自定制view,button,label...的一些属性时,例如边框宽度,边框颜色等,如下图:
- 【USACO 1.2.3】命名那个数字
[问题描述] 在威斯康辛州牛大农场经营者之中,都习惯于请会计部门用连续数字给母牛打上烙印.但是,母牛用手机时并没感到这个系统的便利,它们更喜欢用它们喜欢的名字来呼叫它们的同伴,而不是用像这个的语句&q ...
- 按钮制作技巧(css精灵效果)-高级版
[转自己以前的文章] 无论用什么语言,大家敲程序的时候多多少少都会遇到做按钮的时候.今天分享一个之前学做按钮的技巧,有人叫做css精灵效果. 通常做按钮的思路都用附图中的第一种:两张图片交互的形式,让 ...
- mysql hash索引优化
创建表 CREATE TABLE `t1` ( `id` int(11) NOT NULL AUTO_INCREMENT, `msg` varchar(20) NOT NULL DEFAULT ' ...