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


這是系列文章的第三篇,前兩篇https://www.cnblogs.com/gaopang/p/11243367.htmlhttps://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.這里就不做介紹了.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM