使用gtest(googletest)進行c++單元測試

  • 2019 年 10 月 7 日
  • 筆記

這是系列文章的第三篇,前兩篇https://www.cnblogs.com/gaopang/p/11243367.htmlhttps://www.cnblogs.com/gaopang/p/11588683.html.

為了保證軟體品質,除去使用gdb進行事後調試,以及使用sanitize進行必要的提示以外,再就是單元測試了. Sanitize提供了關鍵性問題的提示,gdb提供了運行期間的錯誤解決途徑,單元測試則是設計途中設置的一些規則,提供了實現後檢驗成果的依據.

Google出品了一個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.這裡就不做介紹了.