术语
- 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中的地位差不多,先直接给出例子:
cmake_minimum_required(VERSION 3.18)
project(heapSortTest)
set(CMAKE_CXX_STANDARD 11)
include(FetchContent)
FetchContent_Declare( ### 声明这个第三方项目需要如何获取
googletest
GIT_REPOSITORY https://github.com/google/googletest/
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) ### linux系统就不用关心这句话了
FetchContent_MakeAvailable(googletest) ### 开始获取这个项目(网络不好的话建议把github的项目导入到gitee中进行获取)
enable_testing()
add_executable(hsTest
Solution.hpp
Solution.cpp ### 堆排序的核心源码
SolutionTest.cpp ### 测试代码,使用TEST_F
)
target_link_libraries(hsTest
gtest_main
)
include(GoogleTest)
gtest_discover_tests(hsTest)
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显然也就找不到了,也为空
cmake_minimum_required(VERSION 3.18)
project(heapSortTest)
set(CMAKE_CXX_STANDARD 11)
find_package(GTest)
if(NOT GTest_FOUND)
message("gtest package NOT FOUND")
else()
message("gtest FOUND")
message("gtest path: ${GTEST_INCLUDE_DIRS}")
endif()
enable_testing()
add_executable(hsTest
Solution.hpp
Solution.cpp
SolutionTest.cpp
)
target_link_libraries(hsTest
${GTEST_BOTH_LIBRARIES}
pthread
)
include(GoogleTest)
gtest_discover_tests(hsTest)