GTest使用手册文档格式.docx
- 文档编号:22932306
- 上传时间:2023-02-06
- 格式:DOCX
- 页数:53
- 大小:46.91KB
GTest使用手册文档格式.docx
《GTest使用手册文档格式.docx》由会员分享,可在线阅读,更多相关《GTest使用手册文档格式.docx(53页珍藏版)》请在冰豆网上搜索。
{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:
”:
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.提高了丰富的命令行参数对案例运行进行一系列的设置。
二、断言
这篇文章主要总结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里的话,将输出:
<
testcasename="
Demo"
status="
run"
time="
0"
classname="
AddTest"
>
<
failuremessage="
Valueof:
Add(1,2)Actual:
4Expected:
3"
type="
"
!
[CDATA[g:
\myproject\c++\gtestdemo\gtestdemo\gtestdemo.cpp:
16
Actual:
Expected:
3]]>
/failure>
/testcase>
如果你对自动输出的出错信息不满意的话,你还可以通过操作符<
将一些自定义的信息输出,通常,这对于调试或是对一些检查点的补充说明来说,非常有用!
下面举个例子:
如果不使用<
操作符自定义输出的话:
for(inti=0;
i<
x.size();
++i)
EXPECT_EQ(x[i],y[i]);
看到的结果将是这样的,你根本不知道出错时i等于几:
\myproject\c++\gtestdemo\gtestdemo\gtestdemo.cpp(25):
y[i]
x[i]
Whichis:
3
如果使用<
操作符将一些重要信息输出的话:
++i)
EXPECT_EQ(x[i],y[i])<
"
Vectorsxandydifferatindex"
i;
从输出结果中就可以定位到在i=2时出现了错误。
这样的输出结果看起来更加有用,容易理解:
Vectorsxandydifferatindex2
3、布尔值检查
Fatalassertion
Nonfatalassertion
Verifies
ASSERT_TRUE(condition);
EXPECT_TRUE(condition);
conditionistrue
ASSERT_FALSE(condition);
EXPECT_FALSE(condition);
conditionisfalse
4、数值型数据检查
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<
val2
ASSERT_LE(val1,val2);
EXPECT_LE(val1,val2);
ASSERT_GT(val1,val2);
EXPECT_GT(val1,val2);
val1>
ASSERT_GE(val1,val2);
EXPECT_GE(val1,val2);
5、字符串检查
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"
std:
stringstrCoderZh="
wstringwstrCoderZh=L"
EXPECT_STREQ("
pszCoderZh);
EXPECT_STREQ(L"
wszCoderZh);
EXPECT_STRNE("
CnBlogs"
EXPECT_STRNE(L"
EXPECT_STRCASEEQ("
coderzh"
//EXPECT_STRCASEEQ(L"
不支持
strCoderZh.c_str());
wstrCoderZh.c_str());
6、显示返回成功或失败
直接返回成功:
SUCCEED();
返回失败:
FAIL();
ADD_FAILURE();
TEST(ExplicitTest,Demo)
ADD_FAILURE()<
Sorry"
//NoneFatalAsserton,继续往下执行。
//FAIL();
//FatalAssertion,不往下执行该案例。
SUCCEED();
7、异常检查
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
例如:
TEST(FooTest,HandleZeroInput)
EXPECT_ANY_THROW(Foo(10,0));
EXPECT_THROW(Foo(0,5),char*);
8、PredicateAssertions
在使用EXPECT_TRUE或ASSERT_TRUE时,有时希望能够输出更加详细的信息,比如检查一个函数的返回值TRUE还是FALSE时,希望能够输出传入的参数是什么,以便失败后好跟踪。
因此提供了如下的断言:
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
如果对这样的输出不满意的话,还可以自定义输出格式,通过如下:
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();
Messagemsg;
msg<
m_expr<
和"
n_expr<
的最大公约数应该是:
Foo(m,n)<
而不是:
k_expr;
returntesting:
AssertionFailure(msg);
TEST(AssertFooTest,HandleFail)
EXPECT_PRED_FORMAT3(AssertFoo,3,6,2);
失败时,输出信息:
3和6的最大公约数应该是:
3而不是:
2
是不是更温馨呢,呵呵。
9、浮点型检查
ASSERT_FLOAT_EQ(expected,actual);
EXPECT_FLOAT_EQ(expected,actual);
thetwofloatvaluesarealmostequal
ASSERT_DOUBLE_EQ(expected,actual);
EXPECT_DOUBLE_EQ(expected,actual);
thetwodoublevaluesarealmostequal
对相近的两个数比较:
ASSERT_NEAR(val1,val2,abs_error);
EXPECT_NEAR(val1,val2,abs_error);
thedifferencebetweenval1andval2doesn'
texceedthegivenabsoluteerror
同时,还可以使用:
EXPECT_PRED_FORMAT2(testing:
FloatLE,val1,val2);
DoubleLE,val1,val2);
10、WindowsHRESULTassertions
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<
typenameT>
classFooType{public:
voidBar(){testing:
StaticAssertTypeEq<
int,T>
();
}
};
TEST(TypeAssertionTest,Demo)
FooType<
bool>
fooType;
fooType.Bar();
12、总结
本篇将常用的断言都介绍了一遍,内容比较多,有些还是很有用的。
要真的到写案例的时候,也行只是一两种是最常用的,现在时知道有这么多种选择,以后才方便查询。
三、事件机制
gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作。
总结一下gtest的事件一共有3种:
1.全局的,所有案例执行前后。
2.TestSuite级别的,在某一批案例中第一个案例前,最后一个案例执行后。
3.TestCase级别的,每个TestCase前后。
2、全局事件
要实现全局事件,必须写一个类,继承testing:
Enviro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GTest 使用手册
![提示](https://static.bdocx.com/images/bang_tan.gif)