现在的位置: 首页 > 综合 > 正文

玩转Google单元测试框架gtest系列之二 – 断言(转载)

2014年02月11日 ⁄ 综合 ⁄ 共 5109字 ⁄ 字号 评论关闭

一、前言

这篇文章主要总结gtest中的所有断言相关的宏。
gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:

1. ASSERT_* 系列的断言,当检查点失败时,退出当前案例的执行。

2. EXPECT_* 系列的断言,当检查点失败时,继续往下执行。

二、布尔值检查

Fatal assertion Nonfatal assertion Verifies
ASSERT_TRUE(

condition
)

;
EXPECT_TRUE(

condition
)

;
condition
is true
ASSERT_FALSE(

condition
)

;
EXPECT_FALSE(

condition
)

;
condition
is false

三、数值型数据检查

Fatal assertion Nonfatal assertion 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
<

val2
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

四、字符串检查

Fatal assertion Nonfatal assertion Verifies
ASSERT_STREQ(

expected_str
,

actual_str
);
EXPECT_STREQ(

expected_str
,

actual_str
);
the two C strings have the same content
ASSERT_STRNE(

str1
,

str2
);
EXPECT_STRNE(

str1
,

str2
);
the two C strings have different content
ASSERT_STRCASEEQ(

expected_str
,

actual_str
);
EXPECT_STRCASEEQ(

expected_str
,

actual_str
);
the two C strings have the same content, ignoring case
ASSERT_STRCASENE(

str1
,

str2
);
EXPECT_STRCASENE(

str1
,

str2
);
the two C strings have different content, ignoring case

*STREQ*和*STRNE*同时支持char*和wchar_t*


类型的,*STRCASEEQ*和*STRCASENE*
却只接收char*,估计是不常用吧。下面是几个例子:

TEST(StringCmpTest,Demo)
{

char
*
pszCoderZh
=
"
CoderZh
"
;
wchar_t

*
wszCoderZh
=
L
"
CoderZh
"
;
std::

string
strCoderZh
=
"
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());
}

五、显示返回成功或失败

直接返回成功:SUCCEED();

返回失败:

Fatal assertion Nonfatal assertion
FAIL();
ADD_FAILURE();
TEST(ExplicitTest,Demo)
{
ADD_FAILURE()

<<
"
Sorry
"
;
//
NoneFatalAsserton,继续往下执行。


//
FAIL();
//
FatalAssertion,不往下执行该案例。



SUCCEED();
}

六、异常检查

Fatal assertion Nonfatal assertion Verifies
ASSERT_THROW(

statement
,
exception_type
);
EXPECT_THROW(

statement
,
exception_type
);
statement
throws an exception of the given type
ASSERT_ANY_THROW(

statement
);
EXPECT_ANY_THROW(

statement
);
statement
throws an exception of any type
ASSERT_NO_THROW(

statement
);
EXPECT_NO_THROW(

statement
);
statement
doesn't throw any exception

例如:

int
Foo(
int
a,
int
b)
{

if
(a
==
0
||
b
==
0
)
{

throw
"
don'tdothat
"
;
}

int
c
=
a
%
b;

if
(c
==
0
)

return
b;

return
Foo(b,c);
}

TEST(FooTest,HandleZeroInput)
{
EXPECT_ANY_THROW(Foo(
10
,
0
));
EXPECT_THROW(Foo(

0
,
5
),
char
*
);
}

七、Predicate Assertions

在使用EXPECT_TRUE或ASSERT_TRUE时,有时希望能够输出更加详细的信息,比如检查一个函数的返回值TRUE还是FALSE时,
希望能够输出传入的参数是什么,以便失败后好跟踪。因此提供了如下的断言:

Fatal assertion Nonfatal assertion Verifies
ASSERT_PRED1(

pred1, val1
);
EXPECT_PRED1(

pred1, val1
);
pred1(val1)
returns true
ASSERT_PRED2(

pred2, val1,
val2

);
EXPECT_PRED2(

pred2, val1,
val2

);
pred2(val1, val2)
returns true
... ... ...

Google人说了,他们只提供<=5个参数的,如果需要测试更多的参数,直接告诉他们。下面看看这个东西怎么用。

bool
MutuallyPrime(
int
m,
int
n)
{

return
Foo(m,n)
>
1
;
}

TEST(PredicateAssertionTest,Demo)
{

int
m
=
5
,n
=
6
;
EXPECT_PRED2(MutuallyPrime,m,n);
}

当失败时,返回错误信息:

error: MutuallyPrime(m, n) evaluates to false, where
m evaluates
to 5
n evaluates to 6

如果对这样的输出不满意的话,还可以自定义输出格式,通过如下:

Fatal assertion Nonfatal assertion Verifies
ASSERT_PRED_FORMAT1(

pred_format1,
val1

);`
EXPECT_PRED_FORMAT1(

pred_format1,
val1

);
pred_format1(val1)
is successful
ASSERT_PRED_FORMAT2(

pred_format2,
val1, val2

);
EXPECT_PRED_FORMAT2(

pred_format2,
val1, val2

);
pred_format2(val1, val2)
is successful
... ...

用法示例:

testing::AssertionResultAssertFoo(
const
char
*
m_expr,
const
char
*
n_expr,
const
char
*
k_expr,
int
m,
int
n,
int
k){

if
(Foo(m,n)
==
k)

return
testing::AssertionSuccess();
testing::Messagemsg;
msg

<<
m_expr
<<
"

"
<<
n_expr
<<
"
的最大公约数应该是:
"
<<
Foo(m,n)
<<
"
而不是:
"
<<
k_expr;

return
testing::AssertionFailure(msg);
}

TEST(AssertFooTest,HandleFail)
{
EXPECT_PRED_FORMAT3(AssertFoo,
3
,
6
,
2
);
}

失败时,输出信息:

error: 3 和 6 的最大公约数应该是:3 而不是:2

是不是更温馨呢,呵呵。

八、浮点型检查

Fatal assertion Nonfatal assertion Verifies
ASSERT_FLOAT_EQ(

expected,
actual

);
EXPECT_FLOAT_EQ(

expected,
actual

);
the two float

values are
almost equal
ASSERT_DOUBLE_EQ(

expected,
actual

);
EXPECT_DOUBLE_EQ(

expected,
actual

);
the two double

values are
almost equal

对相近的两个数比较:

Fatal assertion Nonfatal assertion Verifies
ASSERT_NEAR(

val1, val2,
abs_error

);
EXPECT_NEAR

(val1, val2,
abs_error

);
the difference between val1
and val2
doesn't
exceed the given absolute error

同时,还可以使用:

EXPECT_PRED_FORMAT2(testing::FloatLE,val1,val2);
EXPECT_PRED_FORMAT2(testing::DoubleLE,val1,val2);

九、Windows HRESULT assertions

Fatal assertion Nonfatal assertion Verifies
ASSERT_HRESULT_SUCCEEDED(

expression
);
EXPECT_HRESULT_SUCCEEDED(

expression
);
expression
is a success HRESULT
ASSERT_HRESULT_FAILED(

expression
);
EXPECT_HRESULT_FAILED(

expression
);
expression
is a failure HRESULT

例如:

CComPtrshell;
ASSERT_HRESULT_SUCCEEDED(shell.CoCreateInstance(L

"
Shell.Application
"
));
CComVariantempty;
ASSERT_HRESULT_SUCCEEDED(shell

->
ShellExecute(CComBSTR(url),empty,empty,empty,empty));

十、类型检查

类型检查失败时,直接导致代码编不过,难得用处就在这?看下面的例子:

template
<
typenameT
>
class
FooType{

public
:

void
Bar(){testing::StaticAssertTypeEq
<
int
,T
>
();}
};

TEST(TypeAssertionTest,Demo)
{
FooType
<
bool
>
fooType;
fooType.Bar();
}

十一、总结

本篇将常用的断言都介绍了一遍,内容比较多,有些还是很有用的。要真的到写案例的时候,也行只是一两种是最常用的,现在时知道有这么多种选择,以后
才方便查询。

作者:CoderZh
CoderZh的技术博客 - 博客园

出处:http://coderzh.cnblogs.com/


章版权归本人所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

抱歉!评论已关闭.