C++ 測試框架 GoogleTest 初學者入門篇 乙

ENG八戒發表於2023-04-05

*以下內容為本人的學習筆記,如需要轉載,請宣告原文連結 微信公眾號「ENG八戒」https://mp.weixin.qq.com/s/aFeiOGO-N9O7Ab_8KJ2wxw

開發者雖然主要負責工程裡的開發任務,但是每個開發完畢的功能都是需要開發者自測透過的,所以經常會聽到開發者提起單元測試的話題。那麼今天我就帶大夥一起來看看大名鼎鼎的谷歌 C++ 測試框架 GoogleTest.

本文上接《C++ 測試框架 GoogleTest 初學者入門篇 甲》,歡迎關注微信公眾號【ENG八戒】檢視更多精彩內容。

搜尋框傳播樣式-標準色版.png


安裝配置環境

Googletest 的安裝配置過程並不複雜,但是對於小白來說還是有些困難,所以很有必要手把手說一下。

為了更清晰地說明環境配置過程,下面會選擇對 Googletest 原始碼執行編譯,然後安裝。編譯原始碼時,Googletest 官方手冊推薦使用的工具有兩種,這裡只介紹其中的 Cmake。

其實在各個平臺,使用者都有使用 Googletest 的需求,這裡專挑 Linux 和 Windows 平臺來分別說明怎麼安裝配置 Googletest。

linux 平臺

我的虛擬機器裡 Linux 系統是 Ubuntu 18.04,使用 apt 線上直接安裝的 cmake 版本最高只能去到 3.10,為了順利編譯最新版的 Googletest 原始碼,選擇安裝官網最新版的 cmake。

安裝最新版 cmake

先解除安裝原來的 cmake 版本,再新增指定安裝源為 kitware.com 並更新安裝緩衝,最後開始安裝,下面的指令可依次操作

# 解除安裝 cmake
sudo apt purge --auto-remove cmake

# 下載 cmake 安裝包,
wget -O - https://apt.kitware.com/keys/kitware-archive-latest.asc 2>/dev/null | gpg --dearmor - | sudo tee /etc/apt/trusted.gpg.d/kitware.gpg >/dev/null

sudo apt-add-repository 'deb https://apt.kitware.com/ubuntu/ bionic main'

sudo apt update

sudo apt install cmake

下載編譯 gtest 開發包

下載安裝原始碼包

sudo apt-get install libgtest-dev

進入原始碼安裝目錄,執行編譯

cd /usr/src/gtest
sudo cmake CMakeLists.txt
sudo make

編譯完之後,我看到網上有些教程會推薦直接複製庫檔案(.a)到 /usr/lib 目錄

sudo cp *.a /usr/lib

不過,我建議是直接用 install 命令,這樣庫檔案和標頭檔案都可以一步部署到位

sudo make install

好了,到這裡 ubuntu 下面的 googletest 就安裝結束了,你也可用之前的應用樣例來驗證一下環境是否 OK 。

Windows 平臺

在 Windows 平臺安裝最新版 cmake 比較簡單,這裡掠過。

我這裡安裝的版本是

cmake version 3.24.2

CMake suite maintained and supported by Kitware (kitware.com/cmake).

下載編譯 googletest 原始碼包

這裡選擇 googletest 的最新穩定版原始碼包,可以去 github 下載,下面貼出我這邊實驗用的下載連結

https://codeload.github.com/google/googletest/zip/refs/tags/v1.13.0

下載之後解壓到本地資料夾,進到這個本地資料夾,然後啟動命令列終端 cmd,當前位置應該是這個本地資料夾,接著按照下面的指令去編譯,預設輸出靜態的除錯版本庫檔案(.lib)

mkdir build && cd build
cmake ..
cmake --build .

編譯成功後,在目錄 .\build\lib\Debug 下面多了很多生成檔案,但是我們只需要這兩個靜態庫檔案

gtest.lib
gtest_main.lib

那麼,怎麼輸出動態的除錯版本庫檔案(.lib)呢?

按照上圖修改儲存,然後輸入和上面一樣的編譯指令即可。

編譯成功後,在目錄 .\build\bin\Debug 下面多了很多生成檔案,但是我們只要這兩個動態庫檔案

gtest.dll
gtest_main.dll

另外,和編譯靜態庫檔案一樣,在目錄 .\build\lib\Debug 下生成的這兩個靜態庫檔案也是需要的,用於連結目標 exe 檔案。

gtest.dll
gtest_main.dll

測試工程配置示例

新建一個測試工程 TEST,呼叫 googletest 庫分為靜態呼叫和動態呼叫,分別對應上一節的兩種輸出檔案,現在就分開來演示一下怎麼配置目標測試工程。

TEST 工程只有一個原始碼檔案 main.cpp

呼叫靜態除錯庫

首先,需要找到 googletest 的原始碼目錄下的 .\googletest\include\gtest

把整個資料夾複製到目標測試工程 TEST 目錄下,然後把 gtest 編譯輸出的靜態庫檔案(.lib)也複製到目標測試工程 TEST 的 .\gtest\lib 目錄下

然後看一下 CMakeLists.txt 可以這樣寫

cmake_minimum_required(VERSION 2.14)

project(runTests)

# Locate GTest
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
message("CMAKE_CURRENT_SOURCE_DIR:" ${CMAKE_CURRENT_SOURCE_DIR})

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/gtest/lib)

# for window static debug
set(CMAKE_CXX_FLAGS_DEBUG "/MTd")
# for window dynamic debug
# set(CMAKE_CXX_FLAGS_DEBUG "/MDd")
# for window dynamic release
# set(CMAKE_CXX_FLAGS_DEBUG "/MD")
# for window static release
# set(CMAKE_CXX_FLAGS_DEBUG "/MT")

# Link runTests with what we want to test and the GTest and pthread library
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME}
                        gtest
                        gtest_main)

Cmake 工程的編譯方法都是一樣的,照搬上面提到的編譯指令即可,這裡略過

呼叫動態除錯庫

配置過程,和呼叫靜態除錯庫是差不多的,但是在把 gtest 編譯輸出的靜態庫檔案(.lib)複製到目標測試工程 TEST 的 .\gtest\lib 目錄下時,也需要把 gtest 編譯輸出的動態庫檔案(.dll)一起複製到目標測試工程 TEST 的 .\gtest\lib 目錄下,這樣的目的是為了在測試工程 TEST 編譯的過程中,方便部署可執行檔案(.exe)的執行環境,也就是 exe 檔案依賴的 googletest 庫檔案。

然後看一下 CMakeLists.txt 可以這樣寫

# for default window dynamic debug
cmake_minimum_required(VERSION 2.14)

project(runTests)

set(DESTINATION_DIR ${PROJECT_BINARY_DIR}/Debug)
execute_process( COMMAND ${CMAKE_COMMAND} -E make_directory ${DESTINATION_DIR})
execute_process( COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/gtest/lib/gtest_main.dll ${DESTINATION_DIR})
execute_process( COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_SOURCE_DIR}/gtest/lib/gtest.dll ${DESTINATION_DIR})

# Locate GTest
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
message("CMAKE_CURRENT_SOURCE_DIR:" ${CMAKE_CURRENT_SOURCE_DIR})

link_directories(${CMAKE_CURRENT_SOURCE_DIR}/gtest/lib)

# Link runTests with what we want to test and the GTest and pthread library
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME}
                        gtest
                        gtest_main)

在 cmake 執行過程中,會把 exe 檔案依賴的 googletest 庫檔案(.dll)複製到即將生成的 exe 檔案的存放位置。


由於篇幅受限,本系列教程還未完結,下一篇《C++ 測試框架 GoogleTest 初學者入門篇 丙》將在本公眾號稍後推送,如果你想看了解更多精彩內容,歡迎關注我的微信公眾號 【ENG八戒】

學習可以等,時間不等人!

關注我,帶你學習程式設計領域更多核心技能!

搜尋框傳播樣式-標準色版.png

相關文章