1 玩转Google开源C++单元测试框架GoogleTest作者:CoderZh(CoderZh的技术博客-博客园)出处: 2 目录 二、断言.........................................................................................................................................9三、事件机制..............................................................................................................................18四、参数化...................................................................................................................................22五、死亡测试..............................................................................................................................29六、运行参数..............................................................................................................................35七、深入解析gtest...................................................................................................................41八、打造自己的单元测试框架.................................................................................................57 一、一、本篇工程二、如果从下httphttphttp三、下载、初识gt前言 篇将介绍一些程,以及编写下载 果不记得网址下列地址可以p://googletp://googletp://googlet编译 载解压后,里test些gtest的基写一个最简单址,直接在go以下载到该最test.googletest.googletest.google里面有个ms本使用,包括单的测试案例oogle里搜g最新版本:code.com/fcode.com/fcode.com/fsvc目录:3 括下载,安装。gtest,第一个files/gtest-files/gtest-files/gtest-装,编译,建个就是。目前1.3.0.zip1.3.0.tar.gz1.3.0.tar.bz建立我们第一前gtest的最新2一个测试De新版本为1.3mo3.0,使用VS2编过这里VS2时我误解版本编译gtes四、下面我们结如1.设2.设用VS的同学可2008,打开后过的。里要提醒一下2008工程,我升级为了V解了,并不是本,最好保证译之后,在mst.lib文件。第一个D面我们开始建们在VS2008如下:设置gtest头文设置gtest.lib可以直接打开后会提示你升下的是,如果不然你会发现VS2008工程是说只能在V证gtest和你msvc里面的Demo 建立我们的第8中,新建一文件路径b路径开msvc里面升级,升完级果你升级为VS现很郁闷,你程,结果我使S2008中编的测试工程都Debug或是第一个Demo一个Win32C4 面的工程文件级后,我们直S2008的工程你的Demo使用VS2005编译,在VS2都使用VS20是Release目o了,假如之前ConsoleAp件,如果你在直接编译里面程,那么你的怎么也编不工程建Dem005中同样可005工程。)目录里看到编前使用的VSpplication。在使用的是面的“gtest”的测试Dem过,我也曾折mo,死活编不可以。如果要编译出来的gS2008编译的接着就是设置VS2005或是工程,可以mo最好也是折腾了好久不过。(这里要编译VS20gtestd.lib或的gtest,那置工程属性是以直接,当里有人005或是那么,,总3.Ru如果前提工程int{}没错#inuntimeLibr果是Release提是你之前编程设置后了后Foo(intif(a=={thro}intc=if(c==retureturnF错,上面的函cludegtrary设置e版本,Runt编译的gtest后,我们来编a,intb)=0||b=owdon'ta%b;=0)urnb;Foo(b,c);函数是用来求test/gtestimeLibrary也使用了同样编写一个最简单==0)dothat;求最大公约数t.h5 y设为/MT。当样是/MD选单测试案例试的。下面我们当然,其实你选项。试试,我们先们就来编写一你也可以选择动先来写一个被一个简单的测择动态链接(/M被测试函数:测试案例。MD),:6 TEST(FooTest,HandleNoneZeroInput){EXPECT_EQ(2,Foo(4,10));EXPECT_EQ(6,Foo(30,18));}上面可以看到,编写一个测试案例是多么的简单。我们使用了TEST这个宏,它有两个参数,官方的对这两个参数的解释为:[TestCaseName,TestName],而我对这两个参数的定义是:[TestSuiteName,TestCaseName],在下一篇我们再来看为什么这样定义。对检查点的检查,我们上面使用到了EXPECT_EQ这个宏,这个宏用来比较两个数字是否相等。Google还包装了一系列EXPECT_*和ASSERT_*的宏,而EXPECT系列和ASSERT系列的区别是:1.EXPECT_*失败时,案例继续往下执行。2.ASSERT_*失败时,直接在当前函数中返回,当前函数中ASSERT_*后面的语句将不会执行。在下一篇,我们再来具体讨论这些断言宏。为了让我们的案例运行起来,我们还需要在main函数中添加如下代码:int_tmain(intargc,_TCHAR*argv[]){testing::InitGoogleTest(&argc,argv);returnRUN_ALL_TESTS();}“testing::InitGoogleTest(&argc,argv);”:gtest的测试案例允许接收一系列的命令行参数,因此,我们将命令行参数传递给gtest,进行一些初始化操作。gtest的命令行参数非常丰富,在后面我们也会详细了解到。“RUN_ALL_TESTS()”:运行所有测试案例OK,一切就绪了,我们直接运行案例试试(一片绿色,非常爽):五、本篇用。12数就34优点12案例34系列总结 篇内容确实是gtest还有很1.使用VS编2.设置测试工就行了))3.使用TEST4.在Main函点:1.我们的测试2.编写测试案例的设计和编3.提供了强大4.提高了丰富列链接:是非常的初级很多更高级的编译gtest.li工程的属性T宏开始一个函数中初始化试案例本身就案例变的非常编写上。大丰富的断言富的命令行参级,目的是让从的使用方法b文件(头文件,l个测试案例,化环境,再使就是一个ex常简单(使用言的宏,用于参数对案例运7 从来没有接触,我们将会在ib文件,/M,使用EXPE使用RUN_Axe工程,编译用一些简单的于对各种不同运行进行一系触过gtest的在后面讨论。MT参数(和CT_*,ASSERALL_TEST()宏译之后可以直的宏如TEST同检查点的检系列的设置。的同学了解g总结本篇的编译gtest时R_*系列设置宏运行测试案直接运行,非),让我们将检查。gtest最基本的内容的话:时使用一样的置检查点。案例。非常的方便。将更多精力花本的使的参花在8 1.玩转Google开源C++单元测试框架GoogleTest系列(gtest)之一-初识gtest2.玩转Google开源C++单元测试框架GoogleTest系列(gtest)之二-断言3.玩转Google开源C++单元测试框架GoogleTest系列(gtest)之三-事件机制4.玩转Google开源C++单元测试框架GoogleTest系列(gtest)之四-参数化5.玩转Google开源C++单元测试框架GoogleTest系列(gtest)之五-死亡测试6.玩转Google开源C++单元测试框架GoogleTest系列(gtest)之六-运行参数7.玩转Google开源C++单元测试框架GoogleTest系列(gtest)之七-深入解析gtest8.玩转Google开源C++单元测试框架GoogleTest系列(gtest)之八-打造自己的单元测试框架二、一、这篇类,1.A2.E二、//EXP//假如g:\eoAExp如果httptet16ValAExp/t断言 前言 篇文章主要总一类是ASSASSERT_*系XPECT_*系示例 int型比较ECT_EQ(3,如你的Add(1myprojectf:Add(1,Actual:4ected:3果是将结果输p://=!ueof:AdActual:4ected:3]]estcase总结gtest中SERT系列,系列的断言,系列的断言,,预期值:3Add(1,21,2)结果为t\c++\gtes2)输出到xml里blogs.com/ame=Demouremessag[CDATA[g:dd(1,2)]/failur的所有断言相一类是EXP当检查点失败当检查点失,实际值:A))为4的话,会tdemo\gte里的话,将输/coderzh/astatus=ge=Value\myprojecre9 相关的宏。PECT系列。败时,退出当失败时,继续Add(1,2)会在结果中输estdemo\gt输出:(关于rchive/2009runtimeof:Add(1ct\c++\gtegtest中,断一个直观的解当前函数(注往下执行。输出:testdemo.c于将结果输出为9/04/10/14e=0clas1,2)Acestdemo\gt断言的宏可以解释就是:注意:并非退cpp(16):e为xml,见432789.htmssname=Adtual:4Extestdemo\g以理解为分为退出当前案例error:Val:ml)ddTestxpected:3gtestdemo.为两)。lu3.cpp:10 如果你对自动输出的出错信息不满意的话,你还可以通过操作符将一些自定义的信息输出,通常,这对于调试或是对一些检查点的补充说明来说,非常有用!下面举个例子:如果不使用操作符自定义输出的话:for(inti=0;ix.size();++i){EXPECT_EQ(x[i],y[i]);}看到的结果将是这样的,你根本不知道出错时i等于几:g:\myproject\c++\gtestdemo\gtestdemo\gtestdemo.cpp(