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。
基本断言
以下为对条件对错的断言
两值比较
以下的断言比较两个值
当测试失败时,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等替换。
CASE在上面的断言中表示忽略大小写。
*STREQ*和*STRNE*也支持宽字符的C字符串(wchar_t*),如果两个宽字符串比较失败,这些值会转成UTF-8字符串。
一个NULL指针和一个空字符串是不相同的。
更多字符比较技巧在 高级gtest教程
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教程