GTest使用手册精选文档.docx
- 文档编号:18332356
- 上传时间:2023-08-15
- 格式:DOCX
- 页数:63
- 大小:531.67KB
GTest使用手册精选文档.docx
《GTest使用手册精选文档.docx》由会员分享,可在线阅读,更多相关《GTest使用手册精选文档.docx(63页珍藏版)》请在冰点文库上搜索。
GTest使用手册精选文档
玩转Google开源C++单元测试框架GoogleTest系列(gtest)(总)
前段时间学习和了解了下Google的开源C++单元测试框架GoogleTest,简称gtest,非常的不错.我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这样不便之处,gtest恰恰很好的解决了。
其实gtest本身的实现并不复杂,我们完全可以模仿gtest,不断的完善我们的测试框架,但最后我们还是决定使用gtest取代掉原来的自己的测试框架,原因是:
1。
不断完善我们的测试框架之后就会发觉相当于把gtest重新做了一遍,虽然轮子造的很爽,但是不是必要的。
2。
使用gtest可以免去维护测试框架的麻烦,让我们有更多精力投入到案例设计上。
3。
gtest提高了非常完善的功能,并且简单易用,极大的提高了编写测试案例的效率。
c:
\iknow\docshare\data\cur_work\http:
\code。
\p\googletest\wiki\GoogleTestAdvancedGuide如果想对gtest内部探个究竟,就把它的代码下载下来研究吧,这就是开源的好处,哈!
官方已经有如此完备的文档了,为什么我还要写呢?
一方面是自己记记笔记,好记性不如烂笔头,以后自己想查查一些用法也可以直接在这里查到,一方面是对于不想去看一大堆英文文档的朋友,在我这里可以快速的找到gtest相关的内容。
一、初识gtest
1、前言
本篇将介绍一些gtest的基本使用,包括下载,安装,编译,建立我们第一个测试Demo工程,以及编写一个最简单的测试案例。
2、下载
如果不记得网址,直接在google里搜gtest,第一个就是。
目前gtest的最新版本为1.3。
0
3、编译
下载解压后,里面有个msvc目录:
使用VS的同学可以直接打开msvc里面的工程文件,如果你在使用的是VS2005或是VS2008,打开后会提示你升级,升完级后,我们直接编译里面的“gtest”工程,可以直接编过的.
这里要提醒一下的是,如果你升级为VS2008的工程,那么你的测试Demo最好也是VS2008工程,不然你会发现很郁闷,你的Demo怎么也编不过,我也曾折腾了好久,当时我升级为了VS2008工程,结果我使用VS2005工程建Demo,死活编不过。
(这里有人误解了,并不是说只能在VS2008中编译,在VS2005中同样可以.如果要编译VS2005版本,最好保证gtest和你的测试工程都使用VS2005工程.)
编译之后,在msvc里面的Debug或是Release目录里看到编译出来的gtestd.lib或是gtest.lib文件。
4、第一个Demo
下面我们开始建立我们的第一个Demo了,假如之前使用的VS2008编译的gtest,那么,我们在VS2008中,新建一个Win32ConsoleApplication.接着就是设置工程属性,总结如下:
1。
设置gtest头文件路径
2。
设置gtest.lib路径
3.RuntimeLibrary设置
如果是Release版本,RuntimeLibrary设为/MT。
当然,其实你也可以选择动态链接(/MD),前提是你之前编译的gtest也使用了同样是/MD选项。
工程设置后了后,我们来编写一个最简单测试案例试试,我们先来写一个被测试函数:
intFoo(inta,intb)
{if(a==0||b==0)
{throw"don'tdothat”;
}intc=a%b;if(c==0)returnb;returnFoo(b,c);
}
没错,上面的函数是用来求最大公约数的。
下面我们就来编写一个简单的测试案例.
#include〈gtest/gtest.h〉
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,一切就绪了,我们直接运行案例试试(一片绿色,非常爽):
5、总结
本篇内容确实是非常的初级,目的是让从来没有接触过gtest的同学了解gtest最基本的使用.gtest还有很多更高级的使用方法,我们将会在后面讨论。
总结本篇的内容的话:
1。
使用VS编译gtest。
lib文件
2.设置测试工程的属性(头文件,lib文件,/MT参数(和编译gtest时使用一样的参数就行了))
3.使用TEST宏开始一个测试案例,使用EXPECT_*,ASSER_*系列设置检查点。
4。
在Main函数中初始化环境,再使用RUN_ALL_TEST()宏运行测试案例.
优点:
1.我们的测试案例本身就是一个exe工程,编译之后可以直接运行,非常的方便。
2.编写测试案例变的非常简单(使用一些简单的宏如TEST),让我们将更多精力花在案例的设计和编写上。
3。
提供了强大丰富的断言的宏,用于对各种不同检查点的检查.
4.提高了丰富的命令行参数对案例运行进行一系列的设置。
二、断言
1、前言
这篇文章主要总结gtest中的所有断言相关的宏。
gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。
一个直观的解释就是:
1。
ASSERT_*系列的断言,当检查点失败时,退出当前函数(注意:
并非退出当前案例)。
2。
EXPECT_*系列的断言,当检查点失败时,继续往下执行.
2、示例
//int型比较,预期值:
3,实际值:
Add(1,2)EXPECT_EQ(3,Add(1,2))//
假如你的Add(1,2)结果为4的话,会在结果中输出:
g:
\myproject\c++\gtestdemo\gtestdemo\gtestdemo.cpp(16):
error:
Valueof:
Add(1,2)
Actual:
4
Expected:
3
如果是将结果输出到xml里的话,将输出:
〈failuremessage="Valueof:
Add(1,2)Actual:
4Expected:
3”type="">
[CDATA[g:
\myproject\c++\gtestdemo\gtestdemo\gtestdemo.cpp:
16
Valueof:
Add(1,2)
Actual:
4
Expected:
3]]>
〈/failure>
如果你对自动输出的出错信息不满意的话,你还可以通过操作符〈<将一些自定义的信息输出,通常,这对于调试或是对一些检查点的补充说明来说,非常有用!
下面举个例子:
如果不使用〈〈操作符自定义输出的话:
for(inti=0;i { EXPECT_EQ(x[i],y[i]); } 看到的结果将是这样的,你根本不知道出错时i等于几: g: \myproject\c++\gtestdemo\gtestdemo\gtestdemo。 cpp(25): error: Valueof: y[i] Actual: 4 Expected: x[i] Whichis: 3 如果使用〈<操作符将一些重要信息输出的话: for(inti=0;i { EXPECT_EQ(x[i],y[i])〈〈”Vectorsxandydifferatindex"<〈i; } 从输出结果中就可以定位到在i=2时出现了错误。 这样的输出结果看起来更加有用,容易理解: g: \myproject\c++\gtestdemo\gtestdemo\gtestdemo.cpp(25): error: Valueof: y[i] Actual: 4 Expected: x[i] Whichis: 3 Vectorsxandydifferatindex2 3、布尔值检查 Fatalassertion Nonfatalassertion Verifies ASSERT_TRUE(condition); EXPECT_TRUE(condition); conditionistrue ASSERT_FALSE(condition); EXPECT_FALSE(condition); conditionisfalse 4、数值型数据检查 Fatalassertion Nonfatalassertion Verifies ASSERT_EQ(expected,actual); EXPECT_EQ(expected,actual); expected==actual ASSERT_NE(val1,val2); EXPECT_NE(val1,val2); val1! =val2 ASSERT_LT(val1,val2); EXPECT_LT(val1,val2); val1 ASSERT_LE(val1,val2); EXPECT_LE(val1,val2); val1<=val2 ASSERT_GT(val1,val2); EXPECT_GT(val1,val2); val1>val2 ASSERT_GE(val1,val2); EXPECT_GE(val1,val2); val1〉=val2 5、字符串检查 Fatalassertion Nonfatalassertion Verifies ASSERT_STREQ(expected_str,actual_str); EXPECT_STREQ(expected_str,actual_str); thetwoCstringshavethesamecontent ASSERT_STRNE(str1,str2); EXPECT_STRNE(str1,str2); thetwoCstringshavedifferentcontent ASSERT_STRCASEEQ(expected_str,actual_str); EXPECT_STRCASEEQ(expected_str,actual_str); thetwoCstringshavethesamecontent,ignoringcase ASSERT_STRCASENE(str1,str2); EXPECT_STRCASENE(str1,str2); thetwoCstringshavedifferentcontent,ignoringcase *STREQ*和*STRNE*同时支持char*和wchar_t*类型的,*STRCASEEQ*和*STRCASENE*却只接收char*,估计是不常用吧.下面是几个例子: TEST(StringCmpTest,Demo) {char*pszCoderZh="CoderZh”; wchar_t*wszCoderZh=L"CoderZh”; std: : stringstrCoderZh=”CoderZh”; std: : wstringwstrCoderZh=L”CoderZh"; EXPECT_STREQ("CoderZh",pszCoderZh); EXPECT_STREQ(L”CoderZh",wszCoderZh); EXPECT_STRNE(”CnBlogs",pszCoderZh); EXPECT_STRNE(L”CnBlogs”,wszCoderZh); EXPECT_STRCASEEQ(”coderzh”,pszCoderZh);//EXPECT_STRCASEEQ(L”coderzh",wszCoderZh);不支持 EXPECT_STREQ(”CoderZh",strCoderZh。 c_str()); EXPECT_STREQ(L”CoderZh",wstrCoderZh.c_str()); } 6、显示返回成功或失败 直接返回成功: SUCCEED(); 返回失败: Fatalassertion Nonfatalassertion FAIL(); ADD_FAILURE(); TEST(ExplicitTest,Demo) { ADD_FAILURE()<<”Sorry”;//NoneFatalAsserton,继续往下执行.//FAIL();//FatalAssertion,不往下执行该案例. SUCCEED(); } 7、异常检查 Fatalassertion Nonfatalassertion Verifies ASSERT_THROW(statement,exception_type); EXPECT_THROW(statement,exception_type); statementthrowsanexceptionofthegiventype ASSERT_ANY_THROW(statement); EXPECT_ANY_THROW(statement); statementthrowsanexceptionofanytype ASSERT_NO_THROW(statement); EXPECT_NO_THROW(statement); statementdoesn'tthrowanyexception 例如: intFoo(inta,intb) {if(a==0||b==0) {throw”don’tdothat"; }intc=a%b;if(c==0)returnb;returnFoo(b,c); } TEST(FooTest,HandleZeroInput) { EXPECT_ANY_THROW(Foo(10,0)); EXPECT_THROW(Foo(0,5),char*); } 8、PredicateAssertions 在使用EXPECT_TRUE或ASSERT_TRUE时,有时希望能够输出更加详细的信息,比如检查一个函数的返回值TRUE还是FALSE时,希望能够输出传入的参数是什么,以便失败后好跟踪.因此提供了如下的断言: Fatalassertion Nonfatalassertion Verifies ASSERT_PRED1(pred1,val1); EXPECT_PRED1(pred1,val1); pred1(val1)returnstrue ASSERT_PRED2(pred2,val1,val2); EXPECT_PRED2(pred2,val1,val2); pred2(val1,val2)returnstrue 。 。 。 ... 。 .。 Google人说了,他们只提供〈=5个参数的,如果需要测试更多的参数,直接告诉他们。 下面看看这个东西怎么用. boolMutuallyPrime(intm,intn) {returnFoo(m,n)>1; } TEST(PredicateAssertionTest,Demo) {intm=5,n=6; EXPECT_PRED2(MutuallyPrime,m,n); } 当失败时,返回错误信息: error: MutuallyPrime(m,n)evaluatestofalse,where mevaluatesto5 nevaluatesto6 如果对这样的输出不满意的话,还可以自定义输出格式,通过如下: Fatalassertion Nonfatalassertion Verifies ASSERT_PRED_FORMAT1(pred_format1,val1);` EXPECT_PRED_FORMAT1(pred_format1,val1); pred_format1(val1)issuccessful ASSERT_PRED_FORMAT2(pred_format2,val1,val2); EXPECT_PRED_FORMAT2(pred_format2,val1,val2); pred_format2(val1,val2)issuccessful .。 。 ... 用法示例: testing: : AssertionResultAssertFoo(constchar*m_expr,constchar*n_expr,constchar*k_expr,intm,intn,intk){if(Foo(m,n)==k)returntesting: : AssertionSuccess(); testing: : Messagemsg; msg〈〈m_expr〈<"和”< "〈〈Foo(m,n)<〈"而不是: ”<〈k_expr;returntesting: : AssertionFailure(msg); } TEST(AssertFooTest,HandleFail) { EXPECT_PRED_FORMAT3(AssertFoo,3,6,2); } 失败时,输出信息: error: 3和6的最大公约数应该是: 3而不是: 2 是不是更温馨呢,呵呵。 9、浮点型检查 Fatalassertion Nonfatalassertion Verifies ASSERT_FLOAT_EQ(expected,actual); EXPECT_FLOAT_EQ(expected,actual); thetwofloatvaluesarealmostequal ASSERT_DOUBLE_EQ(expected,actual); EXPECT_DOUBLE_EQ(expected,actual); thetwodoublevaluesarealmostequal 对相近的两个数比较: Fatalassertion Nonfatalassertion Verifies ASSERT_NEAR(val1,val2,abs_error); EXPECT_NEAR(val1,val2,abs_error); thedifferencebetweenval1andval2doesn’texceedthegivenabsoluteerror 同时,还可以使用: EXPECT_PRED_FORMAT2(testing: : FloatLE,val1,val2); EXPECT_PRED_FORMAT2(testing: : DoubleLE,val1,val2); 10、WindowsHRESULTassertions Fatalassertion Nonfatalassertion Verifies ASSERT_HRESULT_SUCCEEDED(expression); EXPECT_HRESULT_SUCCEEDED(expression); expressionisasuccessHRESULT ASSERT_HRESULT_FAILED(expression); EXPECT_HRESULT_FAILED(expression); expressionisafailureHRESULT 例如: CComPtrshell; ASSERT_HRESULT_SUCCEEDED(shell。 CoCreateInstance(L”Shell。 Application”)); CComVariantempty; ASSERT_HRESULT_SUCCEEDED(shell—〉ShellExecute(CComBSTR(url),empty,empty,empty,empty)); 11、类型检查 类型检查失败时,直接导致代码编不过,难得用处就在这? 看下面的例子: template voidBar(){testing: : StaticAssertTypeEq }; TEST(TypeAssertionTest,Demo) { FooType〈bool〉fooType; fooType.Bar(); } 12、总结 本篇将常用的断言都介绍了一遍,内容比较多,有些还是很有用的。 要真的到写案例的时候,也行只是一两种是最常用的,现在时知道有这么多种选择,以后才方便查询。 三、事件机制 1、前
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GTest 使用手册 精选 文档