這是系列文章的第三篇,前兩篇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.這里就不做介紹了.