Google Test -- C++单元测试框架

Google Test – C++单元测试框架

基本概念

使用Google Test时,首先要写出断言,哪些是检查条件是否为真的语句。断言的结果可能是成功,非致命失败或致命的失败。如果发生致命故障,它将中止当前功能;否则程序继续正常。

测试使用断言来验证测试代码的行为。如果测试崩溃或失败的断言,则失败;否则成功。

测试用例包含一个或多个测试。您应该将您的测试分组成反映测试代码结构的测试用例。当测试用例中的多个测试需要共享公共对象和子例程时,您可以将它们放入测试夹具类中。

测试程序可以包含多个测试用例。

现在我们将介绍如何编写一个测试程序,从单独的断言级开始,并建立测试和测试用例。

断言

Google Test断言是类似函数调用的宏。可以通过对其行为进行断言来测试类或功能。当断言失败时,Google Test会打印断言的源文件和行号位置以及失败消息。也可以提供自定义失败消息,该消息将附加到Google Test的消息。

断言成对测试相同的事情,但对当前功能有不同的影响。当ASSERT_ *失败时会产生致命错误,并中止当前功能。 EXPECT_ *产生非致命错误,不会中止当前功能。通常,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的任何东西都可以流式传输到断言宏 —- 特别是C字符串和字符串对象。如果宽字符串(wchar_t *,Windows上的UNICODE模式中的TCHAR *std :: wstring)被流式传输到断言,则在打印时将其转换为UTF-8。

基本断言

这些断言执行基本的真/假条件测试。

致命断言 非致命断言 验证
ASSERT_TRUE(condition); EXPECT_TRUE(condition); condition为true
ASSERT_FALSE(condition); EXPECT_FALSE(condition); condition为false

注:当它们失败时,ASSERT_*会导致致命的错误,并从当前的函数返回,而EXPECT_*产生非致命错误,允许该函数继续运行。在任一情况下,断言失败都意味着其包含测试失败。

二进制比较

本节描述了比较两个值的断言。

致命断言 非致命断言 验证
ASSERT_EQ(val1,val2); EXPECT_EQ(val1,val2); val1 == val2
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

如果发生错误,Google Test将打印val1和val2。

值参数必须与断言的比较运算符相对应,可比较,否则您将收到编译器错误。我们曾经要求参数支持<<运算符流到一个ostream,但是自v1.6.0以来不再需要这个参数(如果<<被支持,那么在断言失败的时候它会被调用来打印参数;否则Google Test将尝试以最佳方式打印它们。有关详细信息和如何自定义参数的打印,请参阅此Google Mock

这些断言可以使用用户定义的类型,但只有在定义了相应的比较运算符(例如==<等等)时才可以使用。如果相应的操作符被定义,则优先使用ASSERT_*()宏,因为它们不仅打印出比较结果,而且打印出两个操作数。

参数总是经过一次评估。因此,负作用的参数也是没问题的。然而,与任何普通的C / C ++函数一样,参数的评估顺序是未定义的(即编译器可以自由选择任何顺序),代码不应该依赖于任何特定的参数评估顺序。

ASSERT_EQ()在指针上的指向相等。如果在两个C字符串上使用,则会测试它们是否在相同的内存位置,如果它们具有相同的值。因此,如果要通过值比较C字符串(例如const char *),请使用ASSERT_STREQ(),稍后将对此进行描述。特别地,为了断言C字符串为NULL,请使用ASSERT_STREQ(NULL,c_string)。但是,要比较两个字符串对象,您应该使用ASSERT_EQ

本节中的宏与窄字符串和宽字符串对象(stringwstring)兼容。

字符串比较

该组中的断言比较了两个C字符串。如果要比较两个string对象,请改用EXPECT_EQEXPECT_NE等。

致命断言 非致命断言 验证
ASSERT_STREQ(str1,str2); EXPECT_STREQ(str1,str2); 两个C字符串具有相同的内容
ASSERT_STRNE(str1,str2); EXPECT_STRNE(str1,str2); 两个C字符串具有不同的内容
ASSERT_STRCASEEQ(str1,str2); EXPECT_STRCASEEQ(str1,str2); 两个C字符串具有相同的内容,忽略大小写
ASSERT_STRCASENE(str1,str2); EXPECT_STRCASENE(str1,str2); 两个C字符串具有不同的内容,忽略大小写

注:断言名称中的“CASE”表示大小写被忽略。

*STREQ**STRNE*也接受宽C字符串(wchar_t *)。如果两 宽字符串的比较失败,它们的值将打印为UTF-8窄字符串。

NULL指针和空字符串被认为是不同的。

另请参见:有关更多字符串比较技巧(例如,子字符串,前缀,后缀和正则表达式匹配),请参阅高级Google测试指南

由于作者水平有限,欢迎指正。

猜你喜欢

转载自blog.csdn.net/u011459120/article/details/77935846