天天看點

GoogleTest 入門(2) CMake 項目中引入 GTest

文章目錄

    • 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 ...]])

           
  • 從上面的格式可以看出,

    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

      :搜尋測試可執行檔案(二進制檔案)中的測試用例