gtest断言
Posted sheenagh
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了gtest断言相关的知识,希望对你有一定的参考价值。
1、简介
gtest中,断言的宏可以理解为分为两类,一类是ASSERT系列,一类是EXPECT系列。
区别:
ASSERT_* 系列的断言,当检查点失败时,退出当前函数(注意:并非退出当前案例)
EXPECT_* 系列的断言,当检查点失败时,继续往下执行。会在结果中输出期望值和实际值,也可在XML文件中输出
2、自定义信息输出
对自动输出的出错信息不满意的话,你还可以通过操作符<<将一些自定义的信息输出。若不使用<<操作符自定义输出,在循环中查看不到当前的期望循环值,如:
EXPECT_EQ(x[i], y[i]);
结果为:
Actual: 4
Expected: x[i]
Which is: 3
使用<<操作符自定义输出,如:
EXPECT_EQ(x[i], y[i]) << "Vectors x and y differ at index " << i;
结果为:Actual: 4
Expected: x[i]
Which is: 3
Vectors x and y differ at index 2
3、布尔值
ASSERT_TRUE(condition); EXPECT_TRUE(condition); 条件是真
ASSERT_FALSE(condition); EXPECT_FALSE(condition); 条件是假
4、数值型数据检查
ASSERT_EQ(expected, actual); EXPECT_EQ(expected, actual); 判断==
ASSERT_NE(val1, val2); EXPECT_NE(val1, val2); 判断 !=
ASSERT_LT(val1, val2); EXPECT_LT(val1, val2); 判断 <
ASSERT_LE(val1, val2); EXPECT_LE(val1, val2); 判断 <=
ASSERT_GT(val1, val2); EXPECT_GT(val1, val2); 判断 >
ASSERT_GE(val1, val2); EXPECT_GE(val1, val2); 判断 >=
5、字符串的检查
ASSERT_STREQ(expected_str, actual_str); EXPECT_STREQ(expected_str, actual_str); 字符串的内容相同
ASSERT_STRNE(str1, str2); EXPECT_STRNE(str1, str2); 字符串的内容不同
ASSERT_STRCASEEQ(expected_str, actual_str); EXPECT_STRCASEEQ(expected_str, actual_str); 字符串的内容相同,忽略大小写
ASSERT_STRCASENE(str1, str2); EXPECT_STRCASENE(str1, str2); 字符串的内容不同,忽略大小写
*STREQ*和*STRNE*同时支持char*和wchar_t*类型的,*STRCASEEQ*和*STRCASENE*却只接收char*。
6、显示返回成功或失败
直接返回成功:SUCCEED();
返回失败:
FAIL(); //不往下执行该案例
ADD_FAILURE(); //继续往下执行
7、异常检查
ASSERT_THROW(statement, exception_type); EXPECT_THROW(statement, exception_type); 语句引发给定类型的异常
ASSERT_ANY_THROW(statement); EXPECT_ANY_THROW(statement); 语句引发任何类型的异常
ASSERT_NO_THROW(statement); EXPECT_NO_THROW(statement); 语句不引发任何异常
8、Predicate Assertions谓词断言
在使用EXPECT_TRUE或ASSERT_TRUE时,有时希望能够输出更加详细的信息,比如检查一个函数的返回值TRUE还是FALSE时,希望能够输出传入的参数是什么,以便失败后好跟踪。
ASSERT_PRED1(pred1, val1); EXPECT_PRED1(pred1, val1); pred1(val1) 返回真
ASSERT_PRED2(pred2, val1, val2); EXPECT_PRED2(pred2, val1, val2); pred2(val1, val2) 返回真
... ... ...
只提供<=5个参数的,如果需要测试更多的参数,直接告知。
8.1 自定义的输出格式
ASSERT_PRED_FORMAT1(pred_format1, val1);` EXPECT_PRED_FORMAT1(pred_format1, val1); pred_format1(val1) 成功
ASSERT_PRED_FORMAT2(pred_format2, val1, val2); EXPECT_PRED_FORMAT2(pred_format2, val1, val2); pred_format2(val1, val2) 成功
8.2 用法
1)定义1个信息
testing::Message msg;
2)使用<<操作符定义信息
msg << m_expr << " 和 " << n_expr << " 的最大公约数应该是:" << Foo(m, n) << " 而不是:" << k_expr;
3)返回 testing::AssertionFailure(msg);
4)在TEST宏中使用
EXPECT_PRED_FORMAT3(AssertFoo, 3, 6, 2);
总的例子:
testing::AssertionResult AssertFoo(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::Message msg;
msg << m_expr << " 和 " << n_expr << " 的最大公约数应该是:" << Foo(m, n) << " 而不是:" << k_expr;
return testing::AssertionFailure(msg);
}
TEST(AssertFooTest, HandleFail)
{
EXPECT_PRED_FORMAT3(AssertFoo, 3, 6, 2);
}
9、浮点型检查
ASSERT_FLOAT_EQ(expected, actual); EXPECT_FLOAT_EQ(expected, actual); 两个浮点值几乎相等
ASSERT_DOUBLE_EQ(expected, actual); EXPECT_DOUBLE_EQ(expected, actual); 两个双精度值几乎相等
对相近的两个数的比较:
ASSERT_NEAR(val1, val2, abs_error); EXPECT_NEAR(val1, val2, abs_error); val1和val2之间的差异不超过给定的绝对误差
还可使用:
EXPECT_PRED_FORMAT2(testing::FloatLE, val1, val2);
EXPECT_PRED_FORMAT2(testing::DoubleLE, val1, val2);
10、Windows HRESULT断言
ASSERT_HRESULT_SUCCEEDED(expression); EXPECT_HRESULT_SUCCEEDED(expression); 表达式返回的是成功的HRESULT
ASSERT_HRESULT_FAILED(expression); EXPECT_HRESULT_FAILED(expression); 表达式返回的是失败的HRESULT
11、类型检查
template <typename T> class FooType {
public:
void Bar() { testing::StaticAssertTypeEq<int, T>(); }
};
TEST(TypeAssertionTest, Demo)
{
FooType<bool> fooType;
fooType.Bar();
}
以上是关于gtest断言的主要内容,如果未能解决你的问题,请参考以下文章