术语
- test suite:应该就是指整个测试的名称和意义
- test:整个测试下某一类的测试
- 所以test suite是一个整体,下面会有不同的test,不同的test都属于这个test suite。单个test下可以包含多个测试用例
- test case:废弃术语
使用流程
- 编写断言(assertion),检查环境是否有效;
- 断言包含
TEST()和TEST_F()两种大类型,分别对应简单的测试,以及针对固定class的测试夹具;
断言
ASSERT_*类的断言只生成FATAL类型的错误,并立即终止程序;-
EXPECT_*类的断言还会生成NONFATAL类型的错误,不会立即终止程序; - 上述两种类型的断言如何选择?关键就在于:选择
EXPECT_*,那么你想要的是,出现错误时,想要程序继续运行,去观察更多的错误现象以及输出;而选择ASSERT_*就意味着,如果出现了错误,那么后续的程序运行也就没有意义了;
cmake
使用cmake构建用googletest进行测试的测试工程,大概有两种方式:FetchContent()和find_package()。本节中我们假设已经有了一个项目,内容就是堆排序,现在需要使用googletest来进行测试。如下列出了这两种方式。
- FetchContent
FetchContent在cmake中的作用大概就和submodule在git中的地位差不多,先直接给出例子:
1 | cmake_minimum_required(VERSION 3.18) |
FetchContent适用于第三方模块没有安装在本地的时候。
- find_package
find_package和意思就是在本地系统上找到我们所需的第三方模块,并将其中我们需要的一些target链接到自己的target之中。如果googletest进行的是默认安装的话,应该就会将头文件和库文件分别装在/usr/local/include和/usr/local/lib之中,如图:

find_packge会找到所需的第三方模块,随后我们也就可以使用需要的target,代码如下。那么这里有一个问题,如果不使用find_package会怎么样呢?答案是:我们想要的target就找不到了,以下面的代码为例${GTEST_BOTH_LIBRARIES}显然就变为空;而对于上面FetchContent的代码为例,gtest_main这个target显然也就找不到了,也为空
1 | cmake_minimum_required(VERSION 3.18) |
那么,find_package是如何去寻找模块的呢?答案如下:Cmake之深入理解find_package()的用法 - 知乎 (zhihu.com)
为了方便我们在项目中引入外部依赖包,cmake官方为我们预定义了许多寻找依赖包的Module,他们存储在path_to_your_cmake/share/cmake-
/Modules目录下。每个以Find .cmake命名的文件都可以帮我们找到一个包。