術(shù)語
- test suite:應(yīng)該就是指整個(gè)測試的名稱和意義
- test:整個(gè)測試下某一類的測試
- 所以test suite是一個(gè)整體湃密,下面會有不同的test弃甥,不同的test都屬于這個(gè)test suite壤玫。單個(gè)test下可以包含多個(gè)測試用例
- test case:廢棄術(shù)語
使用流程
- 編寫斷言(assertion),檢查環(huán)境是否有效臂痕;
- 斷言包含
TEST()
和TEST_F()
兩種大類型尤慰,分別對應(yīng)簡單的測試,以及針對固定class的測試夾具道川;
斷言
-
ASSERT_*
類的斷言只生成FATAL類型的錯(cuò)誤午衰,并立即終止程序; -
EXPECT_*
類的斷言還會生成NONFATAL類型的錯(cuò)誤冒萄,不會立即終止程序; - 上述兩種類型的斷言如何選擇橙数?關(guān)鍵就在于:選擇
EXPECT_*
尊流,那么你想要的是,出現(xiàn)錯(cuò)誤時(shí)灯帮,想要程序繼續(xù)運(yùn)行崖技,去觀察更多的錯(cuò)誤現(xiàn)象以及輸出;而選擇ASSERT_*
就意味著钟哥,如果出現(xiàn)了錯(cuò)誤迎献,那么后續(xù)的程序運(yùn)行也就沒有意義了;
cmake
使用cmake構(gòu)建用googletest進(jìn)行測試的測試工程腻贰,大概有兩種方式:FetchContent()
和find_package()
吁恍。本節(jié)中我們假設(shè)已經(jīng)有了一個(gè)項(xiàng)目,內(nèi)容就是堆排序,現(xiàn)在需要使用googletest來進(jìn)行測試冀瓦。如下列出了這兩種方式伴奥。
- FetchContent
FetchContent在cmake中的作用大概就和submodule在git中的地位差不多,先直接給出例子:
cmake_minimum_required(VERSION 3.18)
project(heapSortTest)
set(CMAKE_CXX_STANDARD 11)
include(FetchContent)
FetchContent_Declare( ### 聲明這個(gè)第三方項(xiàng)目需要如何獲取
googletest
GIT_REPOSITORY https://github.com/google/googletest/
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) ### linux系統(tǒng)就不用關(guān)心這句話了
FetchContent_MakeAvailable(googletest) ### 開始獲取這個(gè)項(xiàng)目(網(wǎng)絡(luò)不好的話建議把github的項(xiàng)目導(dǎo)入到gitee中進(jìn)行獲纫砻觥)
enable_testing()
add_executable(hsTest
Solution.hpp
Solution.cpp ### 堆排序的核心源碼
SolutionTest.cpp ### 測試代碼拾徙,使用TEST_F
)
target_link_libraries(hsTest
gtest_main
)
include(GoogleTest)
gtest_discover_tests(hsTest)
FetchContent適用于第三方模塊沒有安裝在本地的時(shí)候。
- find_package
find_package和意思就是在本地系統(tǒng)上找到我們所需的第三方模塊感局,并將其中我們需要的一些target鏈接到自己的target之中尼啡。如果googletest進(jìn)行的是默認(rèn)安裝的話,應(yīng)該就會將頭文件和庫文件分別裝在/usr/local/include
和/usr/local/lib
之中询微,如圖:
find_packge會找到所需的第三方模塊崖瞭,隨后我們也就可以使用需要的target,代碼如下拓提。那么這里有一個(gè)問題读恃,如果不使用find_package會怎么樣呢?答案是:我們想要的target就找不到了代态,以下面的代碼為例
${GTEST_BOTH_LIBRARIES}
顯然就變?yōu)榭账卤梗欢鴮τ谏厦?code>FetchContent的代碼為例,gtest_main
這個(gè)target顯然也就找不到了蹦疑,也為空
cmake_minimum_required(VERSION 3.18)
project(heapSortTest)
set(CMAKE_CXX_STANDARD 11)
find_package(GTest)
if(NOT GTest_FOUND)
message("gtest package NOT FOUND")
else()
message("gtest FOUND")
message("gtest path: ${GTEST_INCLUDE_DIRS}")
endif()
enable_testing()
add_executable(hsTest
Solution.hpp
Solution.cpp
SolutionTest.cpp
)
target_link_libraries(hsTest
${GTEST_BOTH_LIBRARIES}
pthread
)
include(GoogleTest)
gtest_discover_tests(hsTest)