本系列文章主要介绍GoogleTest(也称“GTest”)测试框架的相关知识,同时通过一些示例程序介绍GoogleTest测试框架的使用方法。
本文为系列文章的第一篇,主要介绍GoogleTest测试框架的相关知识。
1 What
此处引用GitHub上对于GoogleTest的介绍:
googletest helps you write better C++ tests.
googletest is a testing framework developed by the Testing Technology team with Google's specific requirements and constraints in mind. No matter whether you work on Linux, Windows, or a Mac, if you write C++ code, googletest can help you. And it supports any kind of tests, not just unit tests.
2 相关知识
2.1 Test、Test Case和Test Suite
首先介绍三个概念:Test、Test Case和Test Suite。
这三者在某些场景下容易混淆。
由于某些历史原因,GoogleTest使用Test Case来将相关的Test归为一组,然而,当前ISTQB(International Software Testing Qualifications Board)和很多关于软件质量书籍都使用Test Suite替换Test Case;而GoogleTest中的Test则对应ISTQB的Test Case。总结起来,即下表内容:
Meaning | GoogleTest Term | ISTQB Term |
---|---|---|
Exercise a particular program path with specific input values and verify the results | TEST() | Test Case |
A set of several tests related to one component | Test Case | Test Suite |
2.2 基本概念
使用GoogleTest,最先写的就是断言(assertion)。断言是一种检查某个条件是否为真的描述。断言的结果可以是成功、非致命失败、致命失败。当致命失败发生时,当前函数将会终止,而断言的其他结果则不会有此效果。
Test使用断言来判断测试代码的行为:如果一个Test崩溃了或者出现了一个失败的断言,则该Test就失败了;反之,它就是成功的。
Test Case包括一个或多个Test。我们应当把Test打包、分组,放入Test Case中,以便测试代码的结构更加清晰。当一个Test Case中的多个Test需要共享对象和子程序时,我们可以把这些共享内容放入一个(test fixture)类中。
一个测试程序可以包含多个Test Case。
2.3 断言(assertion)
GoogleTest的断言是类似函数调用的宏。
我们可以通过编写相关的断言,来测试类或函数的行为。如果断言失败了,GoogleTest将打印该断言的源文件及行号信息,以及该失败信息。我们也可以定制GoogleTest的失败信息。
当前,有两种断言可供我们使用:
- ASSERT_* :当断言失败时,产生致命错误,并终止当前函数;
- EXPECT_* :当断言失败时,产生非致命错误,并且不会终止当前函数。
通常,我们都会选择EXPECT_*,因为它能让我们在一次测试中测试出更多的失败情况。不过,如果我们想要在出现失败的测试时立即终止程序,则要选择ASSERT_*。
注意:因为ASSERT_*会在失败时立即终止函数,那么就可能跳过后面程序中执行清理工作的代码,并由此产生内存泄露。所以我们在使用ASSERT_*时,要留心检查堆内存,防止内存泄露。
一些常见的断言语句如下:
【基本断言】:
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(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 |
【字符串断言】:
Fatal assertion | Nonfatal assertion | Verifies |
---|---|---|
ASSERT_STREQ(str1, str2); | EXPECT_STREQ(str1, str2); | the two C strings have the same content |
ASSERT_STRNE(str1, str2); | EXPECT_STRNE(str1, str2); | the two C strings have different contents |
ASSERT_STRCASEEQ(str1, str2); | EXPECT_STRCASEEQ(str1, str2); | the two C strings have the same content, ignoring case |
ASSERT_STRCASENE(str1, str2); | EXPECT_STRCASENE(str1, str2); | the two C strings have different contents, ignoring case |
关于GoogleTest的用法示例,请点击此处。