使用gtest(googletest)進行c++單元測試
這是系列文章的第三篇,前兩篇https://www.cnblogs.com/gaopang/p/11243367.html和https://www.cnblogs.com/gaopang/p/11588683.html.
為了保證軟體質量,除去使用gdb進行事後除錯,以及使用sanitize進行必要的提示以外,再就是單元測試了. Sanitize提供了關鍵性問題的提示,gdb提供了執行期間的錯誤解決途徑,單元測試則是設計途中設定的一些規則,提供了實現後檢驗成果的依據.
谷歌出品了一個gtest,boost也有一個boost單元測試.我這裡介紹gtest.廢話不多說了.下邊言歸正傳
安裝
在vcpkg幫助下安裝gtest非常的簡單.
輸入指令vcpkg install gtest,等待它安裝完畢,然後就可以使用了.安裝成功提示如下
在vcpkg的幫助下,安裝一個依賴包就是如此簡單.
至於如何安裝vcpkg,請參照我第一篇.
使用gtest
我打算從頭建立一個gtest專案,系列文章中的第一篇已經介紹瞭如何使用vcpkg+cmake+clion組織專案,這裡簡單提提.專案建立好後,應該先去設定以下專案屬性File-->settings
如上圖紅框處,先設定Deployment(目的是設定好遠端主機),再設定Toolchains(目的是讓clion發現遠端主機裡安裝的各種工具),再設定CMake(主要設定Cmake options: -DCMAKE_TOOLCHAIN_FILE=/vcpkg/scripts/buildsystems/vcpkg.cmake,目的是為了讓cmake和vcpkg聯動,注意CMAKE_TOOLCHAIN_FILE指向自己機器的vcpkg.cmake檔案.)
好了,我目的是為了建立如下目錄結構,以及它們的cmakelists.txt檔案的主要功能.
目錄結構如下,其中src是專案原始碼的主目錄,而test是測試的主目錄.cmake-build-debug-xxx是clion生成的構建目錄,cmake使用它進行快取編譯等操作,這裡不用管它.
根目錄的CMakeLists.txt:
cmake_minimum_required(VERSION 3.14) project(gtestsimple) set(CMAKE_CXX_STANDARD 14) add_subdirectory(src) add_subdirectory(test)
src中的CMakeLists.txt內容如下
add_executable(gtest_simple_run main.cpp okkk.cpp okkk.h) add_library(gtest_simple_lib STATIC main.cpp okkk.cpp okkk.h )
src專案生成了一個gtest_simple_lib的靜態庫,目的是想著在test專案中連結的時候使用.
我打算針對src/okkk.cpp進行測試,它內容非常的簡單的
int okkk::add(int x, int y) { return x + y; }
src其餘的檔案內容就忽略了.內容都非常的簡單.
test專案的CMakefile.txt,內容如下
enable_testing() find_package(GTest MODULE REQUIRED)#查詢GTest find_package(Threads)#查詢Threads #一些除錯資訊 message(gtest_include_dir=${GTEST_INCLUDE_DIR}) message(gtest_library=${GTEST_LIBRARY}) message(threads=${CMAKE_THREAD_LIBS_INIT}) #包含GTest的庫檔案 include_directories(${GTEST_INCLUDE_DIR}) #包含src的專案檔案 include_directories(../src) add_executable(gtest_simple_test main.cpp okkk-test.cpp) #連結gtest_simple_lib,這個是src專案生成的靜態庫 #連結${GTEST_LIBRARY},這個是gtest的庫檔案 #連結${CMAKE_THREAD_LIBS_INIT},即-lpthread target_link_libraries(gtest_simple_test PUBLIC gtest_simple_lib ${GTEST_LIBRARY} ${CMAKE_THREAD_LIBS_INIT}) add_test(NAME gtest_simple_test COMMAND gtest_simple_test)
而test的測試也非常的簡單,主體如下:
#include "gtest/gtest.h" #include "okkk.h" TEST(blaTest, test1) { EXPECT_EQ (okkk::add(0, 0), 0); EXPECT_EQ (okkk::add(10, 10), 20); EXPECT_EQ (okkk::add(40, 65), 100); }
注意到其中第三個是一個錯誤.
main.cpp內容
// // Created by LaoGao on 2019/10/6. // #include "gtest/gtest.h" int main(int argc, char **argv) { ::testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); }
這樣就可以測試了.截圖如下.注意其中有一個是失敗的.
Clion也可以和gtest相互整合
如上圖所示,點選一下,它會把對應的測試執行一遍,並生成一個總覽.
小結
在vcpkg和clion的幫助下,使用cmake變得簡單,同時管理依賴庫也變得異常簡單.以上新增gtest就簡單一步.
如果想在現有的專案上引入gtest也是可以辦到的.主要是編輯test資料夾裡的cmakelists.txt檔案.完成4項主要內容
1.找到gtest 2.找到src 3.組織test專案的檔案 4.其他雜項指令
以上4步驟中,最麻煩的是步驟2,而步驟2是每一個專案引入單元測試都會遇到的問題.可以說它是固有難度.所以拋開固有難度,將gtest引入到既有的專案,難度非常低.
gtest是一個非常好的單元測試庫,具體的使用還是非常的複雜,單元測試在實踐過程中非常的重要,但是單元測試最忌諱陷入使用勾股定理證明勾股定理的窘境.還有兩個非常好的單元測試卡,boost.test和catch.這裡就不做介紹