由于工作需要,要使用GTest进行测试,由于自己从来没有研究过GTest,所以在网上找到一些学习资料:
http://www.cnblogs.com/coderzh/archive/2009/04/06/1426755.html
可以在这网上作为参考,我也是一边看这个,一边学习的~
GTest一直在升级,最新版可以到http://code.google.com/p/googletest/ 里下载。
写本文的原因:
虽然上面网址的内容(下面将用上文代替)完整,但我是个初学者,我想有很多初学者,都会出现一些上文没有提到的内容。这算是我把我学习的一个流程进行总结,也算是把自己的初学心得向各位初学者分享。
学习环境:
由于GTest可以在不同的平台上使用,可能会存在相关的平台配置问题。由于本人是使用Windows,所以下文将以Windows为学习平台,来使用GTest。
本人使用环境:Windows 7+VS2008+GTest
也许会有人问,在VC6不行吗?这个我也不知道,因为我在使用VS2008时,发现一些配置在VC6上是没有的。所以能否使用,我本人也不清楚,只能靠高手解决了。网上也有说法是GTest不支持VC6。
前期准备:
由于使用VS2008,所以可以直接打开GTest中的msvc文件夹里的工程,按步骤升级即可(因为原来不是在VS2008创建的,只要升级一下即可)。
打开工程后,会出现解决方案资源管理器。
对gtest右键——>生成,即可生成gtestd.lib(这个是对应Debug的),还有一个gtest.lib(这个对应Release),可根据需要生成相应文件,或一次生成两个文件。
我们都会习惯性到把能编译的东西先编译完,但是,不要忘了,我会要查看一下我们编译时的配置:
对gtest右键——>属性——>配置属性——>C/C++——>代码生成,查看右面的“运行时库”,我这里的是多线程调试(/MTd),这记住了,这个在下面的测试用例中,要配置成相应的“运行时库”,否则会出错。这里的“运行时库”可以改为MD,但同样,要把测试用例也得改成相同才行。
编写用例前配置:
在VS2008,创建一个项目,为Visual C++ ——> win32 控制台应用程序(win32 console application),命名为GTest,进入向导,直接完成即可以。
工程创建完后,还没有结束呢。还得配置。
我的GTest在E盘根目录
对GTest右键——>属性——>配置属性——>C/C++——>常规——>附加包括目录:E:/gtest/include(如图1)
对GTest右键——>属性——>配置属性——>C/C++——>代码生成——>运行时库 :与先前gtest配置一样,这里是(/MTd)
对GTest右键——>属性——>配置属性——>转换器——>输入——>附加依赖项:E:/gtest/msvc/gtest/Debug/gtestd.lib (如图2)
图1
图2
这样,基本完成了配置了。
编写用例:
在GTest.cpp中,加入你需要测试的用例(可以是函数,也可以是类),这里将用上文中的例子来讲解:
int Func(int a, int b) { if (a == 0 || b == 0) { throw "don't do that"; } int c = a % b; if (c == 0) return b; return Func(b, c); }
这个就是需要测试的函数,也没什么好说的,只要是你想测试的就与其替换就可以了。
TEST(test_case_name,test_name) { /*这函数是GTest中的测试函数, *其中test_case_name是用例名 *test_name为测试名 *这两个名只是方便测试结果的查看,不是具体参数,两名可以随便起 */ EXPECT_EQ(2, Func(4, 10)); EXPECT_EQ(6, Func(30, 18)); /*1. EXPECT_* 失败时,案例继续往下执行。 *2. ASSERT_* 失败时,直接在当前函数中返回,当前函数中ASSERT_*后面的语句将不会执行。 *这些都为GTest中的宏定义 */ }
这个是测试用例,如果有多个测试,可写多个TEST函数
MAIN函数
int _tmain(int argc, _TCHAR* argv[]) { //多个测试用例时使用,如果不写,运行RUN_ALL_TESTS()时会全部测试,加上则只返回对应的测试结果 testing::GTEST_FLAG(filter) = "test_case_name.test_name"; //测试初始化 testing::InitGoogleTest(&argc, argv); //运行所以测试 RUN_ALL_TESTS(); //暂停,方便观看结果,否则CMD窗口将一闪而过 system("PAUSE"); return 0; }
看到这些,我想大家都会有疑问(特别是初学者),这些代码都放哪里去了??我要怎么放??
不用着急,我前会都说过,在GTest.cpp中加入,我下面将把全部代码放上来,方便大家参考。
#include "stdafx.h" #include <gtest/gtest.h> int Func(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(test_case_name, X1) { EXPECT_EQ(2, Func(4, 10)); EXPECT_EQ(6, Func(30, 18)); } TEST(test_case_name,X2) { EXPECT_EQ(6, Func(30, 18)); } int _tmain(int argc, _TCHAR* argv[]) { testing::GTEST_FLAG(filter) = "test_case_name.X1"; testing::InitGoogleTest(&argc, argv); RUN_ALL_TESTS(); system("PAUSE"); return 0; }
这个就是GTest.cpp里面的全部代码,其他文件可以不添加代码哦,如果想在其他文件中加代码原理也是一样的,以后自己研究了,呵呵。