Google Test -- C++单元测试框架
Posted ystu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
。
本节中的宏与窄字符串和宽字符串对象(string
和wstring
)兼容。
字符串比较
该组中的断言比较了两个C字符串。如果要比较两个string
对象,请改用EXPECT_EQ
,EXPECT_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测试指南。
由于作者水平有限,欢迎指正。
以上是关于Google Test -- C++单元测试框架的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Google Test 在 C++ 中成功设置单元测试