經常會聽到開發者提起單元測試的話題,那麼今天我就帶大伙一起來看看大名鼎鼎的谷歌 C++ 測試框架 GoogleTest。這是系列文章的第二篇。 ...
*以下內容為本人的學習筆記,如需要轉載,請聲明原文鏈接 微信公眾號「ENG八戒」https://mp.weixin.qq.com/s/aFeiOGO-N9O7Ab_8KJ2wxw
開發者雖然主要負責工程里的開發任務,但是每個開發完畢的功能都是需要開發者自測通過的,所以經常會聽到開發者提起單元測試的話題。那麼今天我就帶大伙一起來看看大名鼎鼎的谷歌 C++ 測試框架 GoogleTest.
本文上接《C++ 測試框架 GoogleTest 初學者入門篇 甲》,歡迎關註微信公眾號【ENG八戒】查看更多精彩內容。
安裝配置環境
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八戒】
學習可以等,時間不等人!
關註我,帶你學習編程領域更多核心技能!