0. 前言
-
场景很简单:自己的项目中创建了一系列单元测试,如何引入 GTest,如何执行测试。
-
准备工作:
git clone https://github.com/google/googletest.git
cd googletest
mkdir build && cd build && cmake .. && make -j4
sudo make install
sudo ldconfig
1. 方式一:完全不使用CMake特殊语法
-
所谓特殊语法,就是 CMake 中的
add_test
等。 -
如何引入:默认通过
sudo make install
后,头文件和静态链接库也都在系统路径下了。
add_executable(tests ${PROJECT_SOURCE_DIR}/tests/tests.cc)
target_link_libraries(tests gtest_main gmock_main pthread)
- 如何进行测试:直接当做普通可执行文件执行即可,如
./tests
2. 方式二:ctest
- ctest 是 CMake 提供的测试工具。
- 引入测试相关特殊语法主要包括
enable_testing
:必须要有该语句,后续才能添加测试,即add_test
。add_test
:添加测试用例,格式如下。
add_test(NAME <name> [CONFIGURATIONS [Debug|Release|...]]
[WORKING_DIRECTORY dir]
COMMAND <command> [arg1 [arg2 ...]])
- 从上面的格式可以看出,
add_test
对应了一个 COMMAND。- 换句话说,所有测试用例都基于其各自的 COMMAND。
- 那我们需要通过
add_executable
来创建一个COMMAND
,包含所有测试的方法。
enable_testing()
add_executable(test_example test.cpp)
target_link_libraries(test_example example_lib)
add_test(NAME test_example1 COMMAND test_example --arg1=a --arg2=b)
add_test(NAME test_example2 COMMAND test_example --arg1=c --arg2=d)
- ctest与gtest联合使用的实例(参考这里)
cmake_minimum_required(VERSION 2.8)
add_executable(add-test main.cpp)
target_link_libraries(add-test
gtest
gtest_main
pthread
)
add_test(
NAME add
COMMAND $<TARGET_FILE:add-test>
)
# run with: ctest -L lib
set_property(
TEST add
PROPERTY LABELS lib add
)
- 执行测试用例(三选一)
make test
cmake --build . --target test
ctest
3. 方式三:find_package
- 我也不知道是哪一步安装了 google test 相关的
find_pakcage
配置文件,猜测是sudo make install
,但在install列表中没看到。 - 相关内容参考官方文档
- 注意大小写
find_package(GTest)
include_directories(${GTEST_INCLUDE_DIRS})
MESSAGE(${GTEST_INCLUDE_DIRS})
MESSAGE(${GTEST_BOTH_LIBRARIES})
MESSAGE(${GTEST_LIBRARIES})
MESSAGE(${GTEST_MAIN_LIBRARIES})
add_executable(tests ${PROJECT_SOURCE_DIR}/src/tests.cc)
target_link_libraries(tests ${GTEST_BOTH_LIBRARIES} pthread)
# target_link_libraries(tests GTest::GTest GTest::Main pthread)
# target_link_libraries(tests gmock_main gtest_main pthread)
4. 方式四:使用 CMake 中 GTest 相关的特殊语法
- 使用了一些看不懂的东西,参考了这里
- 官方文档:Cmake GoogleTest
CMakeLists.txt
如下
cmake_minimum_required(VERSION 3.14)
project(my_project)
# GoogleTest requires at least C++11
set(CMAKE_CXX_STANDARD 11)
include(FetchContent)
FetchContent_Declare(
googletest
URL https://github.com/google/googletest/archive/609281088cfefc76f9d0ce82e1ff6c30cc3591e5.zip
)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)
# 开启测试
enable_testing()
add_executable(
hello_test
hello_test.cc
)
target_link_libraries(
hello_test
gtest_main
)
# 下面两句 enable CMake’s test runner to discover the tests included in the binary, using the GoogleTest CMake module
include(GoogleTest)
gtest_discover_tests(hello_test)
- 编译、执行过程
cmake -S . -B build
cmake --build build
cd build && ctest
- 主要语法就是
gtest_add_tests
:搜索源码中的 GTest 相关宏gtest_discover_tests
:搜索测试可执行文件(二进制文件)中的测试用例