今天研究了下GoogleTest,谷歌的C++测试开源框架,遇到了诸多问题,写来总结下,也有段时间没写文章了! / 下载http://code.google.com/p/googletest/,最新版本是1.5.0 解压,以后会出现,本来想上传截图,可惜垃圾QQ不支持Chrome,郁闷, build-aux,codegear,fused-src,include,make,msvc等 这里只介绍使用VS2008的方法, 先去掉msvc文件夹的只读属性,因为VS升级工程的时候,会修改一些内容,否则报错。 一共有:gtest.sln 和gtest-md.sln两类工程 这里先解释下区别:最开始的时候,在我编译成功以后, 接着新建测试demo项目。建立win32 console项目,在项目属性中设置附加include目录, 根据编译环境是debug或release添加对应的附加依赖项gtestd.lib或gtest.lib。设置附加库路径为对应的lib路径。写好测试程序后编译工程,结果出现了很多“无法解析的外部符号”类型的错误。但是lib都已经添加了 错误原因: 编译测试程序时,项目属性/C++/代码生成/选项中,C++的运行库设置与编译gtest库时的运行库设置不同 其中gtest.sln和gtest-md.sln对应就应该是这两类工程 在编译gtest库时项目设置中运行库设置成了“多线程调试(/MTd)”,而VS2008默认项目设置是“多线程调试 DLL (/MDd)”,导致很多函数符号无法解析。
解决:修改运行库设置,运行库必须与生成gtest.lib的运行库设置相同 转载一篇文章: http://tech.ccidnet.com/art/1081/20060310/474235_1.html VC带的编译器名字叫cl.exe,它有这么几个与标准程序库有关的选项: /ML、/MLd、/MT、/MTd、/MD、/MDd。这些选项告诉编译器应用程序想使用什么版本的C标准程序库。/ML(缺省选项)对应单线程静态版的标准程序库(libc.lib);/MT对应多线程静态版标准库(libcmt.lib),此时编译器会自动定义_MT宏;/MD对应多线程DLL版(导入库msvcrt.lib,DLL是msvcrt.dll),编译器自动定义_MT和_DLL两个宏。后面加d的选项都会让编译器自动多定义一个_DEBUG宏,表示要使用对应标准库的调试版,因此/MLd对应调试版单线程静态标准库(libcd.lib),/MTd对应调试版多线程静态标准库(libcmtd.lib),/MDd对应调试版多线程DLL标准库(导入库msvcrtd.lib,DLL是msvcrtd.dll)
解释以后,打开gtest-md.sln,因为一般MS默认的Console工程一般都是MDd的,里面有四个工程,最下面两个是例子程序,直接编译gtest-md工程,在msvc的 debug里,有lib文件,拷贝lib文件,并把gtest解压包里的incude/gtest 文件夹拷贝到 VC9.0下, 然后新建 console工程 编写code和测试代码,在link里的input链接gtestd.lib,
示例code如下:
#include<iostream> using namespace std; #include <gtest/gtest.h>
int Foo(int a, int b) { if (a == 0 || b == 0) { throw "don't do that"; } int c = a % b; if (c == 0) return b; return Foo(b, c); }
TEST(FooTest, HandleNoneZeroInput) { EXPECT_EQ(2, Foo(4, 10)); EXPECT_EQ(6, Foo(30, 18)); }
int _tmain(int argc, _TCHAR* argv[]) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
这样就可以了,这是一个非常简单的例子,希望以后能养成写UnitTest的习惯,参考文章。 http://www.cnblogs.com/tobyforever/archive/2009/05/01/1447473.html http://www.cnblogs.com/coderzh/archive/2009/04/06/1426758.html |