[C++]在Visual Studio 2010中使用Google Test - 配置
我主要是想使用单元测试,VS2010是有自己的单元测试的,虽然我不抵触Microsoft的东西,但是自己做的非工业级的东西,去用Microsoft的解决方案是找罪受~所以使用了Google的测试方案。主要查阅了国外的一篇资料,虽然那位写得实在简略,但写得还是不错的,我补充梳理了一下。
下载部署GTest
首先去下载Google Test,网址为http://code.google.com/p/googletest/。我写此文的时候是1.6版。
解压之,因为要反复使用,所以最好放到固定的目录。我解压到了D:\Selah\VSProjects\Source下。打开解压后的目录,结构如下:
其中要接触的目录有:
../ - 即D:\Selah\VSProjects\Source\gtest-1.6.0,我把它设置为$(GTest),这样就不用每次写一长串路径了。
include - 包含目录,里边有头文件,测试时要用到。
msvc - Visual Studio的项目工程文件,已经配置好了的,用它生成二进制库。
运行msvc下的gtest.sln文件,它会提示自动升级为新的解决方案,然后生成即可。记得Debug和Release都要生成,分别用于测试Debug和Release方案的代码。我使用的是以下4个文件,还可以使用另外一个.sln文件,请自行文档之~
msvc\gtest\Debug - Debug方案下的二进制文件:gtestd.lib、gtest_maind.lib(注意主文件名的d后缀)
msvc\gtest\Release - Release方案下的二进制文件:gtest.lib、gtest_main.lib
Solution配置
为了让测试和程序运行互不干扰,老外将待测试模块和程序入口分离为两个项目,这样程序和GTest都可以访问待测试模块,互不冲突。最简单的情况下,Solution下有3个Project:
BaseCode - 待测试模块。我是要做单元测试的,所以头文件里要包含信息。(比如你要测试void Foo(),起码要在头文件里Declare一下吧~)
RunBaseCode - 程序入口。就是将程序一分为二为两部分。程序入口调用BaseCode生成的模块,实现程序功能。
TestBaseCode - 测试程序。这个是书写GTest测试用例的Project。除了要调用BaseCode生成的模块(否则你测试个毛线啊)。并且,他还要调用GTest的模块(否则你用毛线测试啊)。
另外就是路径问题,为了简便,我把路径写成了宏。宏保存在项目属性表里,这个表除了可以保存宏,还能保存后边提到的路径,可以备份了下次直接用。
具体过程不说了,这图一看就懂吧,之后就可以使用$(GTest)代替那长串路径了。
Project - BaseCode配置
Debug/Release通用:
项目属性 - 配置属性 - 常规: 配置类型 = 静态库(.lib)。你也可以用动态库,不过要或重新编译GTest,具体文档之~静态库很好的,不要看不起他。
Debug:
项目属性 - 配置属性 - C/C++ - 代码生成: 运行库 = 多线程调试(/MTd)。如果不这么做,结果就是报错~
Release:
项目属性 - 配置属性 - C/C++ - 代码生成: 运行库 = 多线程(/MT)。如果不这么做,结果就是报错~
Project - RunBaseCode配置:
因为要调用BaseCode的lib,所以配置一下项目依赖项(依赖BaseCode)。要不然,BaseCode还没生成呢,就开始生成RunBaseCode,结果只能是报错。
Debug/Release通用:
项目属性 - 通用属性 - 框架和引用: 添加对BaseCode的引用。感觉和.Net的程序集引用有点像。如果不这么干(比如对此有很深的厌恶之情),可以配置附加库路径以及附加依赖项(配置TestBaseCode时有介绍)。
项目属性 - 配置属性 - C/C++ - 常规: 附加包含目录 += $(SolutionDir)\BaseCode。其实是可有可无,如果设置了,引用头文件可以使用:
#include <BaseCode.h>
否则,就只能使用相对或者绝对路径了:
#include "../BaseCode/BaseCode.h
Project - TestBaseCode配置
除了和RunBaseCode相同的配置外(因为它也要调用BaseCode.lib,重复工作我不写了),还要进行如下配置。
Debug/Release通用:
项目属性 - 配置属性 - C/C++ - 常规: 附加包含目录 += $(GTest)\include。这样方便包含GTest的头文件。
项目属性 - 配置属性 - 连接器 - 常规: 附加库目录 += $(GTest)\msvc\gtest\$(IntDir)。如果之前没有引用BaseCode,要在这里做类似设置。
Debug:
项目属性 - 配置属性 - C/C++ - 代码生成: 运行库 = 多线程调试(/MTd)。如果不这么做,结果就是报错~(和BaseCode的设置相同)
项目属性 - 配置属性 - 连接器 - 常规: 附加依赖项 += gtestd.lib;gtest_maind.lib。如果之前没有引用BaseCode,要在这里做类似设置。
Release:
项目属性 - 配置属性 - C/C++ - 代码生成: 运行库 = 多线程(/MT)。如果不这么做,结果就是报错~(和BaseCode的设置相同)
项目属性 - 配置属性 - 连接器 - 常规: 附加依赖项 += gtest.lib;gtest_main.lib。
生成即测试
老外果然有思路。这样配置了TestBaseCode,就不用执行它了,每次生成解决方案,就会自动执行测试。
项目属性 - 配置属性 - 生成事件 - 后期生成事件: 命令行 = $(TargetDir)$(TargetFileName)。效果:
如果执行测试的exe文件,会一闪而过,可以放到cmd里边执行。效果还是不错的。Over~~