文章目錄
-
- 0. 前言
- 1. 方式一:完全不使用CMake特殊文法
- 2. 方式二:ctest
- 3. 方式三:find_package
- 4. 方式四:使用 CMake 中 GTest 相關的特殊文法
0. 前言
- 場景很簡單:自己的項目中建立了一系列單元測試,如何引入 GTest,如何執行測試。
- 準備工作:
git clone https://github.com/google/googletest.git
cd googletest
mkdir build && cd build && cmake .. && make -j4
sudo make install
sudo ldconfig
- 參考資料:
- 【CMake 系列】(四)用 GoogleTest 測試
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 ...]])
- 從上面的格式可以看出,
對應了一個 COMMAND。add_test
- 換句話說,所有測試用例都基于其各自的 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
,但在install清單中沒看到。sudo make 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 相關宏gtest_add_tests
-
:搜尋測試可執行檔案(二進制檔案)中的測試用例gtest_discover_tests
-