術語
- test suite:應該就是指整個測試的名稱和意義
- test:整個測試下某一類的測試
- 所以test suite是一個整體,下面會有不同的test,不同的test都屬于這個test suite。單個test下可以包含多個測試用例
- test case:廢棄術語
使用流程
- 編寫斷言(assertion),檢查環境是否有效;
- 斷言包含
TEST()
和TEST_F()
兩種大類型,分別對應簡單的測試,以及針對固定class的測試夾具;
斷言
-
ASSERT_*
類的斷言只生成FATAL類型的錯誤,并立即終止程序; -
EXPECT_*
類的斷言還會生成NONFATAL類型的錯誤,不會立即終止程序; - 上述兩種類型的斷言如何選擇?關鍵就在于:選擇
EXPECT_*
,那么你想要的是,出現錯誤時,想要程序繼續運行,去觀察更多的錯誤現象以及輸出;而選擇ASSERT_*
就意味著,如果出現了錯誤,那么后續的程序運行也就沒有意義了;
cmake
使用cmake構建用googletest進行測試的測試工程,大概有兩種方式:FetchContent()
和find_package()
。本節中我們假設已經有了一個項目,內容就是堆排序,現在需要使用googletest來進行測試。如下列出了這兩種方式。
- FetchContent
FetchContent在cmake中的作用大概就和submodule在git中的地位差不多,先直接給出例子:
cmake_minimum_required(VERSION 3.18)
project(heapSortTest)
set(CMAKE_CXX_STANDARD 11)
include(FetchContent)
FetchContent_Declare( ### 聲明這個第三方項目需要如何獲取
googletest
GIT_REPOSITORY https://github.com/google/googletest/
)
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) ### linux系統就不用關心這句話了
FetchContent_MakeAvailable(googletest) ### 開始獲取這個項目(網絡不好的話建議把github的項目導入到gitee中進行獲取)
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適用于第三方模塊沒有安裝在本地的時候。
- find_package
find_package和意思就是在本地系統上找到我們所需的第三方模塊,并將其中我們需要的一些target鏈接到自己的target之中。如果googletest進行的是默認安裝的話,應該就會將頭文件和庫文件分別裝在/usr/local/include
和/usr/local/lib
之中,如圖:
頭文件
庫文件
find_packge會找到所需的第三方模塊,隨后我們也就可以使用需要的target,代碼如下。那么這里有一個問題,如果不使用find_package會怎么樣呢?答案是:我們想要的target就找不到了,以下面的代碼為例
${GTEST_BOTH_LIBRARIES}
顯然就變為空;而對于上面FetchContent
的代碼為例,gtest_main
這個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)