原文地址:http://www.cnblogs.com/coderzh/archive/2009/04/06/1430364.html
一、前言
这篇文章主要总结gtest中的所有断言相关的宏。 gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:
1. ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。
2. EXPECT_* 系列的断言,当检查点失败时,继续往下执行。
二、示例
<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
//
int型比较,预期值:3,实际值:Add(1,2)
EXPECT_EQ(
3
,Add(
1
,
2
))
//
假如你的Add(1, 2) 结果为4的话,会在结果中输出:
<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->g:/myproject/c
++
/gtestdemo/gtestdemo/gtestdemo.cpp(
16
):error:Valueof:Add(
1
,
2
)
Actual:
4
Expected:
3
如果是将结果输出到xml里的话,将输出:(关于将结果输出为xml,见:http://www.cnblogs.com/coderzh/archive/2009/04/10/1432789.html
)
<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><
testcase
name
="Demo"
status
="run"
time
="0"
classname
="AddTest"
>
<
failure
message
="Valueof:Add(1,2)
Actual: 4
Expected: 3"
type
=""
>
<![CDATA[
g:/myproject/c++/gtestdemo/gtestdemo/gtestdemo.cpp:16
Valueof:Add(1,2)
Actual: 4
Expected: 3
]]>
</
failure
>
</
testcase
>
如果你对自动输出的出错信息不满意的话,你还可以通过操作符<<将一些自定义的信息输出,通常,这对于调试或是对一些检查点的补充说明来说,非常有用!
下面举个例子:
如果不使用<<操作符自定义输出的话:
<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->for
(
int
i
=
0
;i
<
x.size();
++
i)
{
EXPECT_EQ(x[i],y[i])
;
}
看到的结果将是这样的,你根本不知道出错时 i 等于几:
<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->g:/myproject/c
++
/gtestdemo/gtestdemo/gtestdemo.cpp(
25
):error:Valueof:y[i]
Actual:
4
Expected:x[i]
Which
is
:
3
如果使用<<操作符将一些重要信息输出的话:
<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->for
(
int
i
=
0
;i
<
x.size();
++
i)
{
EXPECT_EQ(x[i],y[i])
<<
"
Vectorsxandydifferatindex
"
<<
i;
}
从输出结果中就可以定位到在 i = 2 时出现了错误。这样的输出结果看起来更加有用,容易理解:
<!-- <br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->g:/myproject/c
++
/gtestdemo/gtestdemo/gtestdemo.cpp(
25
):error:Valueof:y[i]
Actual:
4
Expected:x[i]
Which
is
:
3
Vectorsxandydifferatindex
2
三、布尔值检查
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*,估计是不常用吧。下面是几个例子:
<!-- <br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->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();
|
<!-- <br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->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 |
例如:
<!-- <br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->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个参数的,如果需要测试更多的参数,直接告诉他们。下面看看这个东西怎么用。
<!-- <br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->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 |
... |
... |
用法示例:
<!-- <br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->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 |
同时,还可以使用:
<!-- <br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->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
|
例如:
<!-- <br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->CComPtrshell;
ASSERT_HRESULT_SUCCEEDED(shell.CoCreateInstance(L
"
Shell.Application
"
));
CComVariantempty;
ASSERT_HRESULT_SUCCEEDED(shell
->
ShellExecute(CComBSTR(url),empty,empty,empty,empty));
十一、类型检查
类型检查失败时,直接导致代码编不过,难得用处就在这?看下面的例子:
<!-- <br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->template
<
typenameT
>
class
FooType{
public
:
void
Bar(){testing::StaticAssertTypeEq
<
int
,T
>
();}
};
TEST(TypeAssertionTest,Demo)
{
FooType
<
bool
>
fooType;
fooType.Bar();
}
十二、总结
本篇将常用的断言都介绍了一遍,内容比较多,有些还是很有用的。要真的到写案例的时候,也行只是一两种是最常用的,现在时知道有这么多种选择,以后才方便查询。
分享到:
相关推荐
玩转Google开源C++单元测试框架Google Test系列 gtest
介绍一些 gtest 的基本使用,包括下载,安装,编译,建立第一个测试 Demo 工程,以及编写一个最简单的测试案例。
玩转Google开源C++单元测试框架GoogleTest
前段时间学习和了解了下Google的开源C++单元测试框架Google Test,简称gtest,非常的不错。 我们原来使用的是自己实现的一套单元测试框架,在使用过程中,发现越来越多使用不便之处,而这样不便之处,gtest恰恰很好...
玩转Google开源C++单元测试框架Google_Test 详细说明gtest如何使用
1.断完善我们的测试框架之后就会发觉相当于把gtest重 2.使用gtest可以免去维护测试框架的麻烦,让我们有多 3.gtest提高非常完善的功能,并且简单易
2.使用gtest可以免去维护测试框架的麻烦,让我们有更多精力投入到案例设计上 3.gtest提高了非常完善的功能,并且简单易用,极大的提高了编写测试案例的效率
玩转Google单元测试框架gtest系列
test:使用范围最广,社区支持程度也最好,从功能上来说简单易用,作为上手框架最为合适 二,安装Gtest 2.1 参考文章:https://www.cnblogs.com/helloworldcode/p/9606838.html 2.2 具体步骤 2.2.1 下载源码:...
讲解了如何使用gtest框架实现单元测试。
GoogleC++TestingFramework(简称gtest,)是Google公司发布的一个开源C/C++单元测试框架,已被应用于多个开源项目及Google内部项目中,知名的例子包括ChromeWeb浏览器、LLVM编译器架构、ProtocolBuffers数据交换...
本测试用例是基于Google开源C++单元测试框架Google Test系列(gtest)在C++Builder xe5下完成,测试用例简单,主要在与表明在C++ builder下我们怎样去使用gTest,本测试用例基于gtest-1.6.0;最新版本为gtest1.7,不过我...
Google C++ Testing Framework(简称gtest,http://code.google.com/p/googletest/)是Google公司发布的一个开源C/C++单元测试框架,已被应用于多个开源项目及Google内部项目中,知名的例子包括Chrome Web浏览器、...
玩转Google开源C++单元测试框架Google Test系列(gtest)(总)
gtest是一个单元测试框架。支持跨平台。目前chrome llvm opencv等都在使用它来测试。内附简单的编译方法,并已经测试通过。
自己根据需求写的一个c++单元测试框架,写这个基础是阅读了gtest源码和许多架构,和为了方便大家的需要,写的一个通用性框架。如果大家需要,可以修改里面的相关代码,实现自己的独特需求。
本文来自博客园,本文主要简单介绍了Google...在用googletest写测试项目之前,需要先编译gtest到library库并将测试与其链接。我们为一些流行的构建系统提供了构建文件: msvc/forVisualStudio,xcode/forMacXcode,make/
CC++单元测试框架gtest初探.docx