1. 程式人生 > >使用gtest(googletest)進行c++單元測試

使用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.這裡就不做介紹