今天咱們來講說,CMake 測試。php
不過,其實咱們仍是在說 C++ 的測試。git
CMake 給咱們提供了完善的測試支持,好比它有一個專門的模塊 CTest。github
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 一探究竟,通常來講,項目大了以後就會有這方面的需求。單元測試
除了上面的 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_tests
,gtest_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,咱們寫單元測試能夠變得很簡單。
感謝閱讀,本文首發於 Github issues: https://github.com/xizhibei/b... (Star 以及 Watch 強烈暗示 :P);另外這篇文章也能在本人博客內閱讀:https://blog.xizhibei.me/2020... 。
本文采用 署名-非商業性使用-相同方式共享(BY-NC-SA)進行許可。