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断言的主要内容,如果未能解决你的问题,请参考以下文章

gtest之断言

关于google测试和断言输出(测试结果)的问题;当 gtest 说测试通过时,我可以相信吗?

如何通过 Google 测试捕捉断言?

gtest从一无所知到熟练使用如何用gtest写单元测试

6.18-GTest

在Windows上使用gdb调试MinGW程序,而不是在断言失败时终止