gtest->assert

gtest提供两个版本的断言,ASSERT_*和EXPECT_*。

ASSERT_*会产生falat错误,当断言失败的时候,当前函数会被中止。
EXPECT_*不会产生falat错误,当断言失败的时候,当前函数不会被中止。

EXPECT_*版本应该更优先选择,因为它允许报多于一个的失败。但是,当不想函数继续运行下去时,要用ASSERT_*版本。

ASSERT_*错误从当前函数返回时,会跳过清除部分代码。这可能会产生内存溢出。

为了提供自定义的失败信息,可以使用流操作符<<,如:
ASSERT_EQ (x .size (), y .size ()) << "Vectors x and y are of unequal length" ;

for ( int i = 0 ; i < x .size (); ++i ) {
  EXPECT_EQ (x [i ], y [i ]) << "Vectors x and y differ at index " << i ;
}
能被ostream处理的任何东西都可以通过流传给断言。宽字符(wchar_t*, TCHAR*)会被转换成UTF-8。


基本断言
以下为对条件对错的断言
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

当测试失败时,gtest会打印val1和val2。在ASSERT_EQ*和EXPECT_EQ*(以及后面会介绍到的断言),你应该将要测试的表达式放在actual的位置,将期望的值放在expected的位置,gtest会根据这个约定来优化错误消息。

参数的值必须是可比较的,不然会得到编译错误。我们习惯要求参数支持流操作符<<,但是在gtest v1.60版之后已经不强制要求(如果<<被支持的,那么当断言失败时它会被调用来打印参数,否则,gtest会以最好的方式去打印它,更多怎么定制打印参数,可以参考gmock recipe)。

这些断言可以用于自定义类型,但是应该相应地定义比较操作符(如:==, <等)。如果相应的操作被定义了,应该优先使用ASSERT_*宏,因为它们不只会打印出比较的结果,还会打印出两个操作数。

参数总是被计算一次,因为,参数有副作用也是可以的。但是,正如普通的C/C++函数,它们的参数计算顺序是不确定的(也就是说编译器可以选择任何一种顺序),所以你的代码不能依赖于任何特定计算顺序。

ASSERT_EQ比较指针时,比较的是两个指针的值。如果比较两个C字符串,只会去测试它们是否指定相同位置,而不会比较串的内容是否相同。因此,如果想比较两个C字符串(例如:const char*)的值是否相同,请使用接下来要讲的ASSERT_STREQ()。特别地,当你想判断一个C字符串是不是NULL值时,请使用ASSERT_STREQ(NULL, c_string)。然而,如果想比较两个string对象,应该使用ASSERT_EQ。

无论是string还是wstring都可以使用上面介绍的宏。

字符比较
下面介绍断言比较的是两个C字符串,如果想比较两个string对象,请使用EXPECT_EQ,EXPECT_NE等替换。
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

CASE在上面的断言中表示忽略大小写。

*STREQ*和*STRNE*也支持宽字符的C字符串(wchar_t*),如果两个宽字符串比较失败,这些值会转成UTF-8字符串。

一个NULL指针和一个空字符串是不相同的。

更多字符比较技巧在 高级gtest教程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值