一、前言
这篇文章主要总结gtest中的所有断言相关的宏。 gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。一个直观的解释就是:
1. ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)。
2. EXPECT_* 系列的断言,当检查点失败时,继续往下执行。
二、示例
//
int型比较,预期值:3,实际值:Add(1, 2)
EXPECT_EQ( 3 , Add( 1 , 2 ))
//
EXPECT_EQ( 3 , Add( 1 , 2 ))
//
假如你的Add(1, 2) 结果为4的话,会在结果中输出:
g:\myproject\c
++
\gtestdemo\gtestdemo\gtestdemo.cpp(
16
): error: Value of: Add(
1
,
2
)
Actual: 4
Expected: 3
Actual: 4
Expected: 3
如果是将结果输出到xml里的话,将输出:(关于将结果输出为xml,见:http://www.cnblogs.com/coderzh/archive/2009/04/10/1432789.html)
<
testcase
name
="Demo"
status
="run"
time
="0"
classname
="AddTest"
>
< failure message ="Value of: Add(1, 2) Actual: 4 Expected: 3" type ="" > <![CDATA[ g:\myproject\c++\gtestdemo\gtestdemo\gtestdemo.cpp:16
Value of: Add(1, 2)
Actual: 4
Expected: 3 ]]> </ failure >
</ testcase >
< failure message ="Value of: Add(1, 2) Actual: 4 Expected: 3" type ="" > <![CDATA[ g:\myproject\c++\gtestdemo\gtestdemo\gtestdemo.cpp:16
Value of: Add(1, 2)
Actual: 4
Expected: 3 ]]> </ failure >
</ testcase >
如果你对自动输出的出错信息不满意的话,你还可以通过操作符<<将一些自定义的信息输出,通常,这对于调试或是对一些检查点的补充说明来说,非常有用!
下面举个例子:
如果不使用<<操作符自定义输出的话:
for
(
int
i
=
0
; i
<
x.size();
++
i)
{
EXPECT_EQ(x[i], y[i]) ;
}
{
EXPECT_EQ(x[i], y[i]) ;
}
看到的结果将是这样的,你根本不知道出错时 i 等于几:
g:\myproject\c
++
\gtestdemo\gtestdemo\gtestdemo.cpp(
25
): error: Value of: y[i]
Actual: 4
Expected: x[i]
Which is : 3
Actual: 4
Expected: x[i]
Which is : 3
如果使用<<操作符将一些重要信息输出的话:
for
(
int
i
=
0
; i
<
x.size();
++
i)
{
EXPECT_EQ(x[i], y[i]) << " Vectors x and y differ at index " << i;
}
{
EXPECT_EQ(x[i], y[i]) << " Vectors x and y differ at index " << i;
}
从输出结果中就可以定位到在 i = 2 时出现了错误。这样的输出结果看起来更加有用,容易理解:
g:\myproject\c
++
\gtestdemo\gtestdemo\gtestdemo.cpp(
25
): error: Value of: y[i]
Actual: 4
Expected: x[i]
Which is : 3
Vectors x and y differ at index 2
Actual: 4
Expected: x[i]
Which is : 3
Vectors x and y differ at index 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*,估计是不常用吧。下面是几个例子:
TEST(StringCmpTest, Demo)
{
char * pszCoderZh = " CoderZh " ;
wchar_t * wszCoderZh = L " CoderZh " ;
std:: string strCoderZh = " CoderZh " ;
std::wstring wstrCoderZh = 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());
}
{
char * pszCoderZh = " CoderZh " ;
wchar_t * wszCoderZh = L " CoderZh " ;
std:: string strCoderZh = " CoderZh " ;
std::wstring wstrCoderZh = 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());
}