【CMake 系列】(四)用 GoogleTest 測試

今天咱們來講說,CMake 測試。php

不過,其實咱們仍是在說 C++ 的測試。git

CMake 給咱們提供了完善的測試支持,好比它有一個專門的模塊 CTest。github

CMake 原生測試支持

CMake 原生支持的測試很簡單,只有兩個函數:框架

enable_testing()
add_test(NAME <name> COMMAND <command> [<arg>...]
         [CONFIGURATIONS <config>...]
         [WORKING_DIRECTORY <dir>]
         [COMMAND_EXPAND_LISTS])

這個用法,簡單來講,就是你須要先實現一個能夠接受輸入參數的可執行程序,用 add_executable 就能夠,不用管這個可執行程序的存放目錄,CMake 會幫你自動填上。函數

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)

而後,經過 add_test 註冊你的測試用例後,就完成了準備,以後就能夠在編譯完成後,用如下三種方式來運行來運行測試用例。gitlab

  • make test
  • cmake --build . --target test
  • ctest

固然了,你也能夠用 CTest 來結合 CDash 一塊兒使用,CDash 就是一個能夠記錄測試日誌的地方,你能夠去 https://my.cdash.org/index.php 一探究竟,通常來講,項目大了以後就會有這方面的需求。單元測試

GoogleTest

除了上面的 ctest,咱們還有強大的 GoogleTest,這是目前用得比較普遍的 C++ 測試框架。不一樣於上面須要本身實現測試框架邏輯、解析參數,GoogleTest 提供了測試框架,以及 Mock。測試

CMake 也提供了 GoogleTest 的支持:ui

gtest_add_tests(TARGET target
                [SOURCES src1...]
                [EXTRA_ARGS arg1...]
                [WORKING_DIRECTORY dir]
                [TEST_PREFIX prefix]
                [TEST_SUFFIX suffix]
                [SKIP_DEPENDENCY]
                [TEST_LIST outVar]
)

它是用來取代 add_test 的,經過掃描源代碼,它就能讀出全部的測試用例,省卻了兩邊重複寫的問題,可是它有個問題:一旦測試用例改變,它就須要從新跑 cmake,否則沒法知道改變後的測試用例。google

所以,CMake 自從 3.10 提供了新的方法:

gtest_discover_tests(target
                     [EXTRA_ARGS arg1...]
                     [WORKING_DIRECTORY dir]
                     [TEST_PREFIX prefix]
                     [TEST_SUFFIX suffix]
                     [NO_PRETTY_TYPES] [NO_PRETTY_VALUES]
                     [PROPERTIES name1 value1...]
                     [TEST_LIST var]
                     [DISCOVERY_TIMEOUT seconds]
)

相比較於 gtest_add_testsgtest_discover_tests 是經過獲取編譯後的可執行程序裏面的測試用例來達到註冊的目的,所以會更魯棒,在測試用例改變的狀況下,不須要從新運行 cmake(其實原理也不神奇,你用編譯後的程序運行時加上 --gtest_list_tests 參數就明白了)。

使用也很簡單,在有 GoogleTest 依賴存在的狀況下(不知道的須要複習前兩篇文章的內容),經過 find_package 引入依賴。

enable_testing()
include(GoogleTest)
find_package(GTest 1.10.0)

add_executable(test test.cpp)
target_link_libraries(test GTest::gtest GTest::gtest_main GTest::gmock
                        GTest::gmock_main)
gtest_discover_tests(test)

至於 GoogleTest 自己,也就是看文檔寫測試用例了(有興趣的能夠留言,有機會我另外寫一篇),另外,我以前在 Golang 中的測試 也提到過該如何寫單元測試,其實在這裏道理也是同樣的,結合 GoogleTest 提供的 Mock,咱們寫單元測試能夠變得很簡單。

Ref

  1. Testing With CTest

感謝閱讀,本文首發於 Github issues: https://github.com/xizhibei/b... (Star 以及 Watch 強烈暗示 :P);另外這篇文章也能在本人博客內閱讀:https://blog.xizhibei.me/2020...

本文采用 署名-非商業性使用-相同方式共享(BY-NC-SA)進行許可。

相關文章
相關標籤/搜索