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 ...
随机推荐
- [转] 剖析 epoll ET/LT 触发方式的性能差异误解(定性分析)
http://blog.chinaunix.net/uid-17299695-id-3059078.html PS:Select和Poll都是水平触发,epoll默认也是水平触发 ET模式仅当状态发生 ...
- Android(java)学习笔记218:开发一个多界面的应用程序之人品计算器的简单实现
1.开启新的Activity的方法: (1)Intent 意图 (2)intent.setAction("自定义") 记得在清单文件中声明 (3)intent.setData(前 ...
- Android上使用OpenGLES2.0显示YUV数据
在Android上用OpenGLES来显示YUV图像,之所以这样做,是因为: 1.Android本身也不能直接显示YUV图像,YUV转成RGB还是必要的: 2.YUV手动转RGB会占用大量的CPU资源 ...
- 浪漫桃心的Android表白程序
本文转载于 huachao1001的专栏 几年前,看到过有个牛人用HTML5绘制了浪漫的爱心表白动画.地址在这:浪漫程序员 HTML5爱心表白动画.发现原来程序员也是可以很浪……漫…..的.那么在A ...
- 【转】JAVA的StringBuffer类
[转]JAVA的StringBuffer类 StringBuffer类和String一样,也用来代表字符串,只是由于StringBuffer的内部实现方式和String不同,所以StringBu ...
- 简易google地图api调用
代码如下: <!DOCTYPE html> <html> <head> <meta name="viewport" content=&qu ...
- iOS扫描二维码(系统方法)
步骤如下: 1.导入AVFoundation框架,引入<AVFoundation/AVFoundation.h> 2.设置一个用于显示扫描的view 3.实例化AVCaptureSessi ...
- 局部线性嵌入(LLE)原理总结
局部线性嵌入(Locally Linear Embedding,以下简称LLE)也是非常重要的降维方法.和传统的PCA,LDA等关注样本方差的降维方法相比,LLE关注于降维时保持样本局部的线性特征,由 ...
- CSP内容安全策略
在浏览网页的过程中,尤其是移动端的网页,经常看到有很多无关的广告,其实大部分广告都是所在的网络劫持了网站响应的内容,并在其中植入了广告代码.为了防止这种情况发生,我们可以使用CSP来快速的阻止这种广告 ...
- 31.Spring-开发流程.md
[toc] 1.简单开发流程 1.1引用类库 基本类库: ## 1.2创建spring配置文件,文件的名称为固定格式:applicationContext.xml或者bean.xml: <?xm ...